⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb_resource.c

📁 mtk 6225平台的usb程序! 对想了解mtk平台usb的朋友会有帮助!
💻 C
📖 第 1 页 / 共 2 页
字号:
	*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 + -