/*! * generic_cf_modinit() - module init * * This is called by the Linux kernel; either when the module is loaded * if compiled as a module, or during the system intialization if the * driver is linked into the kernel. * * This function will parse module parameters if required and then register * the generic driver with the USB Device software. * */ static int generic_cf_modinit (void) { int i; #if !defined(OTG_C99) //generic_cf_global_init(); #endif /* defined(OTG_C99) */ GENERIC = otg_trace_obtain_tag(); i = MODPARM(idVendor); printk (KERN_INFO "Model ID is %s",MODPARM(iProduct)); #if 0 TRACE_MSG4(GENERIC, "config_name: \"%s\" load_all: %d class_name: \"%s\" interface_names: \"%s\"", MODPARM(config_name) ? MODPARM(config_name) : "", MODPARM(load_all), MODPARM(class_name) ? MODPARM(class_name) : "", MODPARM(interface_names) ? MODPARM(interface_names) : ""); #else TRACE_MSG5(GENERIC, "config_name: \"%s\" load_all: %d class_name: \"%s\" interface_names: \"%s\" Serial: \"%s\"", generic_config_name(), MODPARM(load_all), MODPARM(class_name) ? MODPARM(class_name) : "", MODPARM(interface_names) ? MODPARM(interface_names) : "", MODPARM(iSerialNumber) ? MODPARM(iSerialNumber) : ""); #endif /* load config or configs */ if (preset_config_name() || MODPARM(load_all)) { if (preset_config_name()){ MODPARM(load_all) = 0; } printk (KERN_INFO "%s: config_name: \"%s\" load_all: %d\n", __FUNCTION__, generic_config_name() , MODPARM(load_all)); /* search for named config */ for (i = 0; ; i++) { struct generic_config *config = generic_configs + i; BREAK_UNLESS(config->interface_names); printk(KERN_INFO"%s: checking[%d] \"%s\"\n", __FUNCTION__, i, config->composite_driver.driver.name); if (MODPARM(iSerialNumber) && strlen(MODPARM(iSerialNumber)) && /* For the moment, we will only use serial number for msc and mtp. I suggest we come up with a more generic way to determine if a function driver needs to use the serial number. (for instance another function member. */ ( ( !strcmp(config->composite_driver.driver.name, "mtp")) || !strcmp(config->composite_driver.driver.name, "msc")) ){ config->device_description.iSerialNumber = MODPARM(iSerialNumber); } config->device_description.iProduct = MODPARM(iProduct); generic_cf_register(config, generic_config_name()); //printk(KERN_INFO"%s: loaded %s\n", __FUNCTION__, config->composite_driver.driver.name); } } else { struct generic_config *config = &generic_config; //printk (KERN_INFO "%s: idVendor: %04x idProduct: %04x\n", __FUNCTION__, MODPARM(idVendor), MODPARM(idProduct)); //printk (KERN_INFO "%s: class_name: \"%s\" _interface_names: \"%s\"\n", // __FUNCTION__, MODPARM(class_name), MODPARM(interface_names)); if (MODPARM(driver_name) && strlen(MODPARM(driver_name))) config->composite_driver.driver.name = MODPARM(driver_name); if (MODPARM(class_name) && strlen(MODPARM(class_name))) config->class_name = MODPARM(class_name); if (MODPARM(interface_names) && strlen(MODPARM(interface_names))) config->interface_names = MODPARM(interface_names); if (MODPARM(iConfiguration) && strlen(MODPARM(iConfiguration))) config->configuration_description.iConfiguration = MODPARM(iConfiguration); if (MODPARM(bDeviceClass)) config->device_description.bDeviceClass = MODPARM(bDeviceClass); if (MODPARM(bDeviceSubClass)) config->device_description.bDeviceSubClass = MODPARM(bDeviceSubClass); if (MODPARM(bDeviceProtocol)) config->device_description.bDeviceProtocol = MODPARM(bDeviceProtocol); if (MODPARM(idVendor)) config->device_description.idVendor = MODPARM(idVendor); else config->device_description.idVendor = CONFIG_OTG_GENERIC_VENDORID; if (MODPARM(idProduct)) config->device_description.idProduct = MODPARM(idProduct); else config->device_description.idProduct = CONFIG_OTG_GENERIC_PRODUCTID; if (MODPARM(bcdDevice)) config->device_description.bcdDevice = MODPARM(bcdDevice); else config->device_description.bcdDevice = CONFIG_OTG_GENERIC_BCDDEVICE; if (MODPARM(iManufacturer) && strlen(MODPARM(iManufacturer))) config->device_description.iManufacturer = MODPARM(iManufacturer); else config->device_description.iManufacturer = CONFIG_OTG_GENERIC_MANUFACTURER; if (MODPARM(iProduct) && strlen(MODPARM(iProduct))) config->device_description.iProduct = MODPARM(iProduct); else config->device_description.iProduct = CONFIG_OTG_GENERIC_PRODUCT_NAME; if (MODPARM(iSerialNumber) && strlen(MODPARM(iSerialNumber))){ config->device_description.iSerialNumber = MODPARM(iSerialNumber); } if (MODPARM(interface_names)) config->interface_names = MODPARM(interface_names); generic_cf_register(config, NULL); } return 0; }
static char *generic_config_name(void){ if(MODPARM(config_name) && strlen(MODPARM(config_name))) return MODPARM(config_name); return default_predefined_configuration; }
/*! * generic_cf_register() * */ void generic_cf_register(struct generic_config *config, char *match) { char *cp, *sp, *lp; int i; char **interface_list = NULL; int interfaces = 0; //printk(KERN_INFO"%s: Driver: \"%s\" idVendor: %04x idProduct: %04x interface_names: \"%s\" match: \"%s\"\n", // __FUNCTION__, // config->composite_driver.driver.name, MODPARM(idVendor), MODPARM(idProduct), config->interface_names, // match ? match : ""); TRACE_MSG5(GENERIC, "Driver: \"%s\" idVendor: %04x idProduct: %04x interface_names: \"%s\" match: \"%s\"", config->composite_driver.driver.name, MODPARM(idVendor), MODPARM(idProduct), config->interface_names, match ? match : ""); RETURN_IF (match && strlen(match) && strcmp(match, config->composite_driver.driver.name)); //printk(KERN_INFO"%s: MATCHED\n", __FUNCTION__); /* decompose interface names to construct interface_list */ RETURN_UNLESS (config->interface_names && strlen(config->interface_names)); /* count interface names and allocate _interface_names array */ for (cp = sp = config->interface_names, interfaces = 0; cp && *cp; ) { for (; *cp && *cp == ':'; cp++); // skip white space sp = cp; // save start of token for (; *cp && *cp != ':'; cp++); // find end of token BREAK_IF (sp == cp); if (*cp) cp++; interfaces++; } THROW_UNLESS(interfaces, error); TRACE_MSG1(GENERIC, "interfaces: %d", interfaces); THROW_UNLESS((interface_list = (char **) CKMALLOC (sizeof (char *) * (interfaces + 1), GFP_KERNEL)), error); for (cp = sp = config->interface_names, interfaces = 0; cp && *cp; interfaces++) { for (; *cp && *cp == ':'; cp++); // skip white space sp = cp; // save start of token for (; *cp && *cp != ':'; cp++); // find end of token BREAK_IF (sp == cp); lp = cp; if (*cp) cp++; *lp = '\0'; lp = CKMALLOC(strlen(sp), GFP_KERNEL); strcpy(lp, sp); interface_list[interfaces] = lp; TRACE_MSG3(GENERIC, "INTERFACE[%2d] %x \"%s\"", interfaces, interface_list[interfaces], interface_list[interfaces]); } config->composite_driver.device_description = &config->device_description; config->composite_driver.configuration_description = &config->configuration_description; config->composite_driver.driver.fops = &generic_function_ops; config->interface_list = interface_list; THROW_IF (usbd_register_composite_function ( &config->composite_driver, config->composite_driver.driver.name, config->class_name, config->interface_list, NULL), error); config->registered++; TRACE_MSG0(GENERIC, "REGISTER FINISHED"); CATCH(error) { otg_trace_invalidate_tag(GENERIC); } }
/*! * zasevb_modinit() - linux module initialization * * This needs to initialize the hcd, pcd and tcd drivers. This includes tcd and possibly hcd * for some architectures. * */ static int zasevb_modinit (void) { struct otg_instance *otg = NULL; #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) struct clk *clk = clk_get(NULL, "usb_clk"); clk_enable(clk); clk_put(clk); #endif THROW_UNLESS((otg = otg_create()), error); mxc_pcd_ops_init(); #if !defined(OTG_C99) pcd_global_init(); fs_ocd_global_init(); zasevb_tcd_global_init(); fs_pcd_global_init(); #endif /* !defined(OTG_C99) */ ZAS = otg_trace_obtain_tag(otg, "zas"); mxc_procfs_init(); TRACE_MSG0(ZAS, "1. ZAS"); #if 0 /* ZAS EVB Platform setup */ TRACE_MSG4(ZAS, "BCTRL Version: %04x Status: %04x 1: %04x 2: %04x", readw(PBC_BASE_ADDRESS ), readw(PBC_BASE_ADDRESS + PBC_BSTAT), readw(PBC_BASE_ADDRESS + PBC_BCTRL1_SET), readw(PBC_BASE_ADDRESS + PBC_BCTRL2_SET)); #endif /* ZAS EVB Clock setup */ #if defined(CONFIG_ARCH_ARGONPLUS) || defined(CONFIG_ARCH_ARGONLV) #define ZASEVB_MULTIPLIER 12 #define ZASEVB_DIVISOR 775 // ~10. #else #define ZASEVB_MULTIPLIER 12 #define ZASEVB_DIVISOR 155 #endif TRACE_MSG0(ZAS, "2. Setup GPT"); THROW_UNLESS(ocd_instance = otg_set_ocd_ops(otg, &ocd_ops), error); REMOVE_OCD = ocd_instance->TAG; // XXX THROW_IF((ocd_ops.mod_init ? ocd_ops.mod_init() : 0), error); #if defined(CONFIG_OTG_GPTR) mxc_gptcr_mod_init(ZASEVB_DIVISOR, ZASEVB_MULTIPLIER); #endif /* defined(CONFIG_OTG_GPTR) */ #if defined(CONFIG_OTG_HRT) mxc_hrt_mod_init(otg, ZASEVB_DIVISOR, ZASEVB_MULTIPLIER); #endif /* defined(CONFIG_OTG_GPTR) */ #if !defined(CONFIG_USB_HOST) TRACE_MSG0(ZAS, "3. PCD"); THROW_UNLESS(REMOVE_pcd_instance = otg_set_pcd_ops(otg, &pcd_ops), error); REMOVE_PCD = REMOVE_pcd_instance->TAG; // XXX THROW_IF((pcd_ops.mod_init ? pcd_ops.mod_init() : 0), error); #else /* !defined(CONFIG_USB_HOST) */ printk(KERN_INFO"%s: PCD DRIVER N/A\n", __FUNCTION__); #endif /* !defined(CONFIG_USB_HOST) */ TRACE_MSG0(ZAS, "4. TCD"); THROW_UNLESS(REMOVE_tcd_instance = otg_set_tcd_ops(otg, &tcd_ops), error); REMOVE_TCD = REMOVE_tcd_instance->TAG; // XXX THROW_IF((tcd_ops.mod_init ? tcd_ops.mod_init() : 0), error); #ifdef OTG_USE_I2C TRACE_MSG0(ZAS, "0. I2C"); i2c_mod_init(otg); #endif #if defined(CONFIG_OTG_USB_HOST) || defined(CONFIG_OTG_USB_PERIPHERAL_OR_HOST)|| defined(CONFIG_OTG_DEVICE) TRACE_MSG0(ZAS, "5. Host"); THROW_UNLESS(hcd_instance = otg_set_hcd_ops(otg, &hcd_ops), error); HCD = hcd_instance->TAG; // XXX THROW_IF((hcd_ops.mod_init) ? hcd_ops.mod_init() : 0, error); #else /* defined(CONFIG_OTG_USB_HOST) || defined(CONFIG_OTG_USB_PERIPHERAL_OR_HOST)|| defined(CONFIG_OTG_DEVICE) */ printk(KERN_INFO"%s: HCD DRIVER N/A\n", __FUNCTION__); #endif /* defined(CONFIG_OTG_USB_HOST) || defined(CONFIG_OTG_USB_PERIPHERAL_OR_HOST)|| defined(CONFIG_OTG_DEVICE) */ TRACE_MSG0(ZAS, "6. Init & check"); THROW_IF((ocd_ops.mod_init ? ocd_ops.mod_init(otg) : 0), error); #if !defined(CONFIG_USB_HOST) THROW_IF((pcd_ops.mod_init ? pcd_ops.mod_init(otg) : 0), error); #endif /* !defined(CONFIG_USB_HOST) */ THROW_IF((tcd_ops.mod_init ? tcd_ops.mod_init(otg) : 0), error); #if defined(CONFIG_OTG_USB_HOST) || defined(CONFIG_OTG_USB_PERIPHERAL_OR_HOST)|| defined(CONFIG_OTG_DEVICE) THROW_IF((hcd_ops.mod_init) ? hcd_ops.mod_init(otg) : 0, error); #endif /* defined(CONFIG_OTG_USB_HOST) || defined(CONFIG_OTG_USB_PERIPHERAL_OR_HOST)|| defined(CONFIG_OTG_DEVICE) */ THROW_UNLESS(ocd_instance && (otg = ocd_instance->otg), error); TRACE_MSG0(ZAS, "7. otg_init"); if (MODPARM(serial_number_str) && strlen(MODPARM(serial_number_str))) { TRACE_MSG1(ZAS, "serial_number_str: %s", MODPARM(serial_number_str)); otg_serial_number (otg, MODPARM(serial_number_str)); } otg_init(otg); return 0; CATCH(error) { //zasevb_modexit(); return -EINVAL; } return 0; }