5 #define VERSION ((0<<8)|1)
11 int UDI_Install(char **Arguments);
12 int UDI_DetectDriver(void *Base);
13 int UDI_LoadDriver(void *Base);
16 MODULE_DEFINE(0, VERSION, UDI, UDI_Install, NULL, NULL);
17 tModuleLoader gUDI_Loader = {
18 NULL, "UDI", UDI_DetectDriver, UDI_LoadDriver, NULL
23 * \fn int UDI_Install(char **Arguments)
24 * \brief Stub intialisation routine
26 int UDI_Install(char **Arguments)
28 Module_RegisterLoader( &gUDI_Loader );
33 * \brief Detects if a driver should be loaded by the UDI subsystem
35 int UDI_DetectDriver(void *Base)
37 if( Binary_FindSymbol(Base, "udi_init_info", NULL) == 0) {
45 * \fn int UDI_LoadDriver(void *Base)
47 int UDI_LoadDriver(void *Base)
50 char *udiprops = NULL;
51 Uint udiprops_size = 0;
57 if( Binary_FindSymbol(Base, "udi_init_info", (Uint*)&info) == 0) {
63 if( Binary_FindSymbol(Base, "_udiprops", (Uint*)&udiprops) == 0 ) {
64 Log_Warning("UDI", "_udiprops is not defined, this is usually bad");
66 else if( Binary_FindSymbol(Base, "_udiprops_size", &udiprops_size) == 0) {
67 Log_Warning("UDI", "_udiprops_size is not defined");
73 Log_Debug("UDI", "udiprops = %p, udiprops_size = 0x%x", udiprops, udiprops_size);
75 Debug_HexDump("UDI_LoadDriver", udiprops, udiprops_size);
78 for( i = 0; i < udiprops_size; i++ )
80 if( udiprops[i] == '\0' )
84 Log_Debug("UDI", "nLines = %i", nLines);
86 udipropsptrs = malloc( sizeof(char*)*nLines );
87 udipropsptrs[0] = udiprops;
89 for( i = 0; i < udiprops_size; i++ )
91 if( udiprops[i] == '\0' ) {
92 //Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]);
93 udipropsptrs[j++] = &udiprops[i+1];
96 Log_Debug("UDI", "udipropsptrs[%i] = '%s'", j, udipropsptrs[j]);
97 Log_Debug("UDI", "udiprops = \"%s\"", udiprops);
101 Log("primary_init_info = %p = {", info->primary_init_info);
103 Log(" .mgmt_ops = %p = {", info->primary_init_info->mgmt_ops);
104 Log(" .usage_ind_op: %p() - 0x%02x",
105 info->primary_init_info->mgmt_ops->usage_ind_op,
106 info->primary_init_info->mgmt_op_flags[0]
108 Log(" .enumerate_req_op: %p() - 0x%02x",
109 info->primary_init_info->mgmt_ops->enumerate_req_op,
110 info->primary_init_info->mgmt_op_flags[1]
112 Log(" .devmgmt_req_op: %p() - 0x%02x",
113 info->primary_init_info->mgmt_ops->devmgmt_req_op,
114 info->primary_init_info->mgmt_op_flags[2]
116 Log(" .final_cleanup_req_op: %p() - 0x%02x",
117 info->primary_init_info->mgmt_ops->final_cleanup_req_op,
118 info->primary_init_info->mgmt_op_flags[3]
121 Log(" .mgmt_scratch_requirement = 0x%x", info->primary_init_info->mgmt_scratch_requirement);
122 Log(" .enumeration_attr_list_length = 0x%x", info->primary_init_info->enumeration_attr_list_length);
123 Log(" .rdata_size = 0x%x", info->primary_init_info->rdata_size);
124 Log(" .child_data_size = 0x%x", info->primary_init_info->child_data_size);
125 Log(" .per_parent_paths = 0x%x", info->primary_init_info->per_parent_paths);
128 Log("secondary_init_list = %p", info->secondary_init_list);
129 Log("ops_init_list = %p", info->ops_init_list);
131 for( i = 0; info->ops_init_list[i].ops_idx; i++ )
133 Log("info->ops_init_list[%i] = {", i);
134 Log(" .ops_idx = 0x%x", info->ops_init_list[i].ops_idx);
135 Log(" .meta_idx = 0x%x", info->ops_init_list[i].meta_idx);
136 Log(" .meta_ops_num = 0x%x", info->ops_init_list[i].meta_ops_num);
137 Log(" .chan_context_size = 0x%x", info->ops_init_list[i].chan_context_size);
138 Log(" .ops_vector = %p", info->ops_init_list[i].ops_vector);
139 // Log(" .op_flags = %p", info->ops_init_list[i].op_flags);