@ -41,7 +41,6 @@
# define DRIVER_VERSION "usb_dnl 2.0"
static const char shortname [ ] = " usb_dnl_ " ;
static const char product [ ] = " USB download gadget " ;
static char g_dnl_serial [ MAX_STRING_SERIAL ] ;
static const char manufacturer [ ] = CONFIG_G_DNL_MANUFACTURER ;
@ -96,29 +95,36 @@ static int g_dnl_unbind(struct usb_composite_dev *cdev)
free ( cdev - > config ) ;
cdev - > config = NULL ;
debug ( " %s: calling usb_gadget_disconnect for "
" controller '%s' \n " , shortname , gadget - > name ) ;
" controller '%s' \n " , __func__ , gadget - > name ) ;
usb_gadget_disconnect ( gadget ) ;
return 0 ;
}
static inline struct g_dnl_bind_callback * g_dnl_bind_callback_first ( void )
{
return ll_entry_start ( struct g_dnl_bind_callback ,
g_dnl_bind_callbacks ) ;
}
static inline struct g_dnl_bind_callback * g_dnl_bind_callback_end ( void )
{
return ll_entry_end ( struct g_dnl_bind_callback ,
g_dnl_bind_callbacks ) ;
}
static int g_dnl_do_config ( struct usb_configuration * c )
{
const char * s = c - > cdev - > driver - > name ;
int ret = - 1 ;
struct g_dnl_bind_callback * callback = g_dnl_bind_callback_first ( ) ;
debug ( " %s: configuration: 0x%p composite dev: 0x%p \n " ,
__func__ , c , c - > cdev ) ;
printf ( " GADGET DRIVER: %s \n " , s ) ;
if ( ! strcmp ( s , " usb_dnl_dfu " ) )
ret = dfu_add ( c ) ;
else if ( ! strcmp ( s , " usb_dnl_ums " ) )
ret = fsg_add ( c ) ;
else if ( ! strcmp ( s , " usb_dnl_thor " ) )
ret = thor_add ( c ) ;
return ret ;
for ( ; callback ! = g_dnl_bind_callback_end ( ) ; callback + + )
if ( ! strcmp ( s , callback - > usb_function_name ) )
return callback - > fptr ( c ) ;
return - ENODEV ;
}
static int g_dnl_config_register ( struct usb_composite_dev * cdev )
@ -208,12 +214,12 @@ static int g_dnl_bind(struct usb_composite_dev *cdev)
device_desc . bcdDevice = cpu_to_le16 ( gcnum ) ;
else {
debug ( " %s: controller '%s' not recognized \n " ,
shortname , gadget - > name ) ;
__func__ , gadget - > name ) ;
device_desc . bcdDevice = __constant_cpu_to_le16 ( 0x9999 ) ;
}
debug ( " %s: calling usb_gadget_connect for "
" controller '%s' \n " , shortname , gadget - > name ) ;
" controller '%s' \n " , __func__ , gadget - > name ) ;
usb_gadget_connect ( gadget ) ;
return 0 ;
@ -232,36 +238,22 @@ static struct usb_composite_driver g_dnl_driver = {
. unbind = g_dnl_unbind ,
} ;
int g_dnl_register ( const char * type )
/*
* NOTICE :
* Registering via USB function name won ' t be necessary after rewriting
* g_dnl to support multiple USB functions .
*/
int g_dnl_register ( const char * name )
{
/* The largest function name is 4 */
static char name [ sizeof ( shortname ) + 4 ] ;
int ret ;
if ( ! strcmp ( type , " dfu " ) ) {
strcpy ( name , shortname ) ;
strcat ( name , type ) ;
} else if ( ! strcmp ( type , " ums " ) ) {
strcpy ( name , shortname ) ;
strcat ( name , type ) ;
} else if ( ! strcmp ( type , " thor " ) ) {
strcpy ( name , shortname ) ;
strcat ( name , type ) ;
} else {
printf ( " %s: unknown command: %s \n " , __func__ , type ) ;
return - EINVAL ;
}
int ret = usb_composite_register ( & g_dnl_driver ) ;
debug ( " %s: g_dnl_driver.name = %s \n " , __func__ , name ) ;
g_dnl_driver . name = name ;
debug ( " %s: g_dnl_driver.name: %s \n " , __func__ , g_dnl_driver . name ) ;
ret = usb_composite_register ( & g_dnl_driver ) ;
if ( ret ) {
printf ( " %s: failed!, error: %d \n " , __func__ , ret ) ;
return ret ;
}
return 0 ;
}