📄 usb_resource.c
字号:
*p_num = gUsbDevice.resource_interface_number - 1;
return (&gUsbDevice.if_info[gUsbDevice.resource_interface_number - 1]);
}
/* get string number and point device recource_string to real string pointer */
kal_uint8 USB_Get_String_Number(void *usb_string)
{
Usb_String_Dscr *string = (Usb_String_Dscr *)usb_string;
gUsbDevice.resource_string_number++;
if(gUsbDevice.resource_string_number > USB_MAX_STRING)
{
EXT_ASSERT(0, gUsbDevice.resource_string_number, USB_MAX_STRING, 0);
}
gUsbDevice.resource_string[gUsbDevice.resource_string_number - 1] = string;
return (gUsbDevice.resource_string_number - 1);
}
Usb_IAD_Dscr* USB_Get_IAD_Number(kal_uint8 *p_num)
{
gUsbDevice.resource_iad_number++;
if(gUsbDevice.resource_iad_number > USB_MAX_IAD)
{
EXT_ASSERT(0, gUsbDevice.resource_iad_number, USB_MAX_IAD, 0);
}
*p_num = gUsbDevice.resource_iad_number - 1;
return (&gUsbDevice.iad_desc[gUsbDevice.resource_iad_number - 1]);
}
/* create all descriptors, including device and class specific */
void USB_Software_Create(void)
{
kal_uint8 index_if;
kal_uint8 index_ep;
kal_uint16 Conf_index = 0;
kal_uint16 if_len = 0;
#ifdef __USB_MULTI_CHARGE_CURRENT__
#if ( defined(MT6305) || defined(MT6318) )
kal_uint8 conf_no;
#endif
#endif
/* initial resource number */
USB_Resource_Reset();
#ifdef __USB_MULTI_CHARGE_CURRENT__
#if ( defined(MT6305) || defined(MT6318) )
for ( conf_no = 0 ; conf_no < USB_DEVDSC_CONFIGS ; conf_no++)
{
gUsbDevice.multi_configuration_value[conf_no] = conf_no+1;
gUsbDevice.multi_Max_Power[conf_no] = (kal_uint8) (USB_CHARGE_CURRENT[conf_no]/2);
if ( conf_no > 0)
{
ASSERT (gUsbDevice.multi_Max_Power[conf_no-1] > gUsbDevice.multi_Max_Power[conf_no] );
}
}
if (gUsbDevice.multi_Max_Power[0] > USB_CFGDSC_MAXPOWER)
{
EXT_ASSERT(0,gUsbDevice.multi_Max_Power[0],USB_CFGDSC_MAXPOWER,0);
}
ASSERT (gUsbDevice.multi_Max_Power[USB_DEVDSC_CONFIGS-1] == 0);
#endif
#endif
/* string descriptor */
USB_Get_String_Number((void *)USB_Language_String); /* index 0 */
/* check class has registered create function and device code */
if((usb_ifcreate_number == 0) || (usb_device_code.b_registerd == KAL_FALSE))
EXT_ASSERT(0, usb_ifcreate_number, usb_device_code.b_registerd, 0);
/* call the create function for each class */
for(index_if=0; index_if<usb_ifcreate_number; index_if++)
{
if(usb_ifcreate_tbl[index_if].if_create_func == NULL)
EXT_ASSERT(0, 0, 0, 0);
usb_ifcreate_tbl[index_if].if_create_func(usb_ifcreate_tbl[index_if].if_name_ptr);
if(gUsbDevice.if_info[index_if].ifdscr_size == 0)
EXT_ASSERT(0, 0, 0, 0);
}
/* Initialise the Standard Device Descriptor */
gUsbDevice.devdscr.bLength = USB_DEVDSC_LENGTH;
gUsbDevice.devdscr.bDescriptorType = USB_DEVICE;
gUsbDevice.devdscr.bcdUSB = 0x0110; /* USB spec rev is 1.1 */
gUsbDevice.devdscr.bMaxPacketSize0 = USB_DEVDSC_MAXPKTSIZE; /*USB_DEVDSC_MAXPKTSIZE=8*/
gUsbDevice.devdscr.idVendor = gUsbDevice.device_param->desc_vendor;
gUsbDevice.devdscr.bcdDevice = USB_DEVDSC_BCDDEVICE;
gUsbDevice.devdscr.iManufacturer = USB_Get_String_Number((void *)gUsbDevice.device_param->manufacture_string);
gUsbDevice.devdscr.iProduct = USB_Get_String_Number((void *)gUsbDevice.device_param->product_string);
/* serial string is got during initialization procedure */
gUsbDevice.devdscr.iSerialNumber = USB_Get_String_Number((void *)gUsbDevice.serial_string);
gUsbDevice.devdscr.idProduct = usb_device_code.product_code;
gUsbDevice.devdscr.bDeviceClass = usb_device_code.device_code;
gUsbDevice.devdscr.bDeviceSubClass = usb_device_code.subclass_code;
gUsbDevice.devdscr.bDeviceProtocol = usb_device_code.protocol_code;
if(gUsbDevice.device_type != USB_IMAGE)
gUsbDevice.devdscr.bNumConfigurations = USB_DEVDSC_CONFIGS;
else
gUsbDevice.devdscr.bNumConfigurations = 1;
#ifdef __USB_MULTI_CHARGE_CURRENT__
#if ( defined(MT6305) || defined(MT6318) )
ASSERT(USB_DEVDSC_CONFIGS <= USB_MAX_CONFIG );
#endif
#endif
/* Initialise the descriptors for main configuration 1 */
gUsbDevice.cfg_info.cfg_name_ptr = "USB Main Config";
gUsbDevice.cfg_info.stdcfg.bLength = USB_CFGDSC_LENGTH;
gUsbDevice.cfg_info.stdcfg.bDescriptorType = USB_CONFIG;
gUsbDevice.cfg_info.stdcfg.bNumInterfaces = gUsbDevice.resource_interface_number;
gUsbDevice.cfg_info.stdcfg.bConfigurationValue = 0+1; /*0+1=1, the value = (cfg index+1), select this config's number*/
gUsbDevice.cfg_info.stdcfg.iConfiguration = 0;
gUsbDevice.cfg_info.stdcfg.bmAttributes = USB_CFGDSC_ATTR_NATURE;
if(gUsbDevice.remoteWk == KAL_TRUE)
gUsbDevice.cfg_info.stdcfg.bmAttributes |= USB_CFGDSC_ATTR_REMOTEWAKEUP;
if(gUsbDevice.self_powered == KAL_TRUE)
gUsbDevice.cfg_info.stdcfg.bmAttributes |= USB_CFGDSC_ATTR_SELFPOWER;
#ifdef __USB_MULTI_CHARGE_CURRENT__
#if ( defined(MT6305) || defined(MT6318) )
gUsbDevice.cfg_info.stdcfg.bMaxPower = gUsbDevice.multi_Max_Power[0];
#else
gUsbDevice.cfg_info.stdcfg.bMaxPower = (kal_uint8) (66/2);
#endif
#else
gUsbDevice.cfg_info.stdcfg.bMaxPower = USB_CFGDSC_MAXPOWER;
#endif
#ifdef __OTG_ENABLE__
if(INT_USBBoot() == KAL_FALSE)
{
gUsbDevice.otgdscr.bLength = USB_OTGDSC_LENGTH;
gUsbDevice.otgdscr.bDescriptorType = USB_OTG_DESC;
gUsbDevice.otgdscr.bAttribute = (USB_OTG_HNP_SUPPORT | USB_OTG_SRP_SUPPORT);
}
#endif
/* configuration length */
for(index_if=0;index_if<gUsbDevice.resource_iad_number;index_if++)
{
if_len += gUsbDevice.iad_desc[index_if].bLength;
}
for(index_if=0;index_if<gUsbDevice.resource_interface_number;index_if++)
{
if_len += gUsbDevice.if_info[index_if].ifdscr_size;
for(index_ep=0;index_ep<gUsbDevice.if_info[index_if].ifdscr.stdif.bNumEndpoints;index_ep++)
{
if_len+=gUsbDevice.if_info[index_if].ep_info[index_ep]->epdscr_size;
}
}
#ifdef __OTG_ENABLE__
if(INT_USBBoot() == KAL_FALSE)
{
gUsbDevice.cfg_info.stdcfg.wTotalLength = (USB_CFGDSC_LENGTH + if_len + USB_OTGDSC_LENGTH);
}
else
{
gUsbDevice.cfg_info.stdcfg.wTotalLength = (USB_CFGDSC_LENGTH + if_len);
}
#else
gUsbDevice.cfg_info.stdcfg.wTotalLength = (USB_CFGDSC_LENGTH + if_len);
#endif
/* allocate configuration descriptor memory */
ASSERT(gUsbDevice.conf == NULL);
gUsbDevice.conf = (kal_uint8 *)get_ctrl_buffer(gUsbDevice.cfg_info.stdcfg.wTotalLength);
/* construct configuration descriptor */
/*kal_mem_cpy(dst,src,len)*/
kal_mem_cpy( (kal_uint8 *)(gUsbDevice.conf+Conf_index), (kal_uint8*) &gUsbDevice.cfg_info.stdcfg,
USB_CFGDSC_LENGTH );
Conf_index+=USB_CFGDSC_LENGTH;
for(index_if = 0; index_if < gUsbDevice.resource_iad_number; index_if++)
{
kal_mem_cpy( (kal_uint8 *)(gUsbDevice.conf+Conf_index),
(kal_uint8*)&gUsbDevice.iad_desc[index_if],
gUsbDevice.iad_desc[index_if].bLength );
Conf_index+=gUsbDevice.iad_desc[index_if].bLength;
}
for(index_if=0;index_if<gUsbDevice.resource_interface_number;index_if++)
{
kal_mem_cpy( (kal_uint8 *)(gUsbDevice.conf+Conf_index),
(kal_uint8*)&gUsbDevice.if_info[index_if].ifdscr.stdif,
gUsbDevice.if_info[index_if].ifdscr_size );
Conf_index+=gUsbDevice.if_info[index_if].ifdscr_size;
for(index_ep=0;index_ep<gUsbDevice.if_info[index_if].ifdscr.stdif.bNumEndpoints;index_ep++)
{
kal_mem_cpy((kal_uint8 *)(gUsbDevice.conf+Conf_index),
(kal_uint8 *)&(gUsbDevice.if_info[index_if].ep_info[index_ep]->epdesc.stdep),
gUsbDevice.if_info[index_if].ep_info[index_ep]->epdscr_size);
Conf_index+=gUsbDevice.if_info[index_if].ep_info[index_ep]->epdscr_size;
}
}
#ifdef __OTG_ENABLE__
if(INT_USBBoot() == KAL_FALSE)
{
kal_mem_cpy( (kal_uint8 *)(gUsbDevice.conf+Conf_index), (kal_uint8*)&gUsbDevice.otgdscr,
USB_OTGDSC_LENGTH );
Conf_index+=USB_OTGDSC_LENGTH;
}
#endif
ASSERT(Conf_index == gUsbDevice.cfg_info.stdcfg.wTotalLength);
}
/* init EP of each interface (class specific) */
void USB_Software_Init(void)
{
kal_uint8 index;
/* check class has registered init function*/
ASSERT(usb_ifcreate_number !=0);
for(index=0;index<usb_ifcreate_number;index++)
{
if(usb_ifcreate_tbl[index].if_init_func != NULL)
usb_ifcreate_tbl[index].if_init_func();
else
ASSERT(0);
}
}
/* reset the resource maintain in this file */
static void USB_Resource_Reset(void)
{
gUsbDevice.resource_ep_bulkin_number = 0;
gUsbDevice.resource_ep_bulkout_number = 0;
gUsbDevice.resource_ep_intr_number = 0;
gUsbDevice.resource_interface_number = 0;
//gUsbDevice.resource_config_number = 0;
gUsbDevice.resource_string_number = 0;
gUsbDevice.resource_iad_number = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -