3 * \author John Hodge (thePowersGang)
8 #include "../udi_internal.h"
12 EXPORT(udi_usage_ind);
13 EXPORT(udi_static_usage);
14 EXPORT(udi_usage_res);
15 EXPORT(udi_enumerate_req);
16 EXPORT(udi_enumerate_no_children);
17 EXPORT(udi_enumerate_ack);
18 EXPORT(udi_devmgmt_req);
19 EXPORT(udi_devmgmt_ack);
20 EXPORT(udi_final_cleanup_req);
21 EXPORT(udi_final_cleanup_ack);
23 tUDI_MetaLang cMetaLang_Management = {
30 {sizeof(udi_enumerate_cb_t)-sizeof(udi_cb_t), NULL}
35 void udi_usage_ind(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
37 LOG("cb=%p{...}, resource_level=%i", cb, resource_level);
38 const udi_mgmt_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_Management, 0 );
40 Log_Warning("UDI", "%s on wrong channel type", __func__);
44 UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) );
45 ops->usage_ind_op(cb, resource_level);
48 void udi_static_usage(udi_usage_cb_t *cb, udi_ubit8_t resource_level)
54 void udi_usage_res(udi_usage_cb_t *cb)
56 // TODO: Update trace mask from cb
57 LOG("cb=%p{cb->trace_mask=%x}", cb, cb->trace_mask);
60 void udi_enumerate_req(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
62 LOG("cb=%p{...}, enumeration_level=%i", cb, enumeration_level);
63 const udi_mgmt_ops_t *ops = UDI_int_ChannelPrepForCall( UDI_GCB(cb), &cMetaLang_Management, 0 );
65 Log_Warning("UDI", "%s on wrong channel type", __func__);
69 UDI_int_MakeDeferredCbU8( UDI_GCB(cb), (udi_op_t*)ops->enumerate_req_op, enumeration_level );
70 // UDI_int_ChannelReleaseFromCall( UDI_GCB(cb) );
71 // ops->enumerate_req_op(cb, enumeration_level);
74 void udi_enumerate_no_children(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_level)
76 udi_enumerate_ack(cb, UDI_ENUMERATE_LEAF, 0);
79 void udi_enumerate_ack(udi_enumerate_cb_t *cb, udi_ubit8_t enumeration_result, udi_index_t ops_idx)
81 UDI_int_ChannelFlip( UDI_GCB(cb) );
82 LOG("cb=%p, enumeration_result=%i, ops_idx=%i", cb, enumeration_result, ops_idx);
83 switch( enumeration_result )
85 case UDI_ENUMERATE_OK:
87 for( int i = 0; i < cb->attr_valid_length; i ++ )
89 udi_instance_attr_list_t *at = &cb->attr_list[i];
93 LOG("[%i] String '%.*s'", i, at->attr_length, at->attr_value);
96 LOG("[%i] UBit32 0x%08x", i, UDI_ATTR32_GET(at->attr_value));
99 LOG("[%i] %i", i, at->attr_type);
105 UDI_MA_AddChild(cb, ops_idx);
106 udi_enumerate_req(cb, UDI_ENUMERATE_NEXT);
108 case UDI_ENUMERATE_DONE:
109 // All done. Chain terminates
112 Log_Notice("UDI", "Unknown enumeration_result %i", enumeration_result);
117 void udi_devmgmt_req(udi_mgmt_cb_t *cb, udi_ubit8_t mgmt_op, udi_ubit8_t parent_ID )
119 ENTER("pcb imgmt_op iparent_ID", cb, mgmt_op, parent_ID);
123 void udi_devmgmt_ack(udi_mgmt_cb_t *cb, udi_ubit8_t flags, udi_status_t status)
125 ENTER("pcb xflags istatus", cb, flags, status);
129 void udi_final_cleanup_req(udi_mgmt_cb_t *cb)
135 void udi_final_cleanup_ack(udi_mgmt_cb_t *cb)