usb_resource.c

来自「MTK平台绝密核心代码之 USB驱动」· C语言 代码 · 共 492 行 · 第 1/2 页

C
492
字号
	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
	
	/*  
	conf_no = gUsbDevice.resource_config_number;
	gUsbDevice.resource_config_number++;
	if(gUsbDevice.resource_config_number > USB_MAX_CONFIG)
		EXT_ASSERT(0, gUsbDevice.resource_config_number, USB_MAX_CONFIG, 0);
	*/
	/*   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);  /*  index 1 for ms */

		if(gUsbDevice.if_info[index_if].ifdscr_size == 0)
			EXT_ASSERT(0, 0, 0, 0);
		/* if_len += gUsbDevice.if_info[index_if].ifdscr_size; */
	}

	/* 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;
	gUsbDevice.devdscr.bNumConfigurations = USB_DEVDSC_CONFIGS;
	#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[conf_no].cfg_name_ptr = "USB Main Config";
	//gUsbDevice.cfg_info[conf_no].stdcfg.bLength = USB_CFGDSC_LENGTH;
	//gUsbDevice.cfg_info[conf_no].stdcfg.bDescriptorType = USB_CONFIG;
	//gUsbDevice.cfg_info[conf_no].stdcfg.bNumInterfaces = gUsbDevice.resource_interface_number;
	//gUsbDevice.cfg_info[conf_no].stdcfg.bConfigurationValue = conf_no+1;   /*0+1=1, the value = (cfg index+1), select this config's number*/
	//gUsbDevice.cfg_info[conf_no].stdcfg.iConfiguration = 0;
	//gUsbDevice.cfg_info[conf_no].stdcfg.bmAttributes = USB_CFGDSC_ATTR_NATURE;
	//gUsbDevice.cfg_info[conf_no].stdcfg.bMaxPower = USB_CFGDSC_MAXPOWER; 
 
	/* 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;
	#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 */
	/* if_len = 0; */
	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[conf_no].stdcfg.wTotalLength = (USB_CFGDSC_LENGTH*USB_MAX_CONFIG+if_len+USB_OTGDSC_LENGTH);
                gUsbDevice.cfg_info.stdcfg.wTotalLength = (USB_CFGDSC_LENGTH + if_len + USB_OTGDSC_LENGTH);
	}
	else
	{
		//gUsbDevice.cfg_info[conf_no].stdcfg.wTotalLength = (USB_CFGDSC_LENGTH*USB_MAX_CONFIG+if_len);	
                gUsbDevice.cfg_info.stdcfg.wTotalLength = (USB_CFGDSC_LENGTH + if_len);
	}
#else	
	//gUsbDevice.cfg_info[conf_no].stdcfg.wTotalLength = (USB_CFGDSC_LENGTH*USB_MAX_CONFIG+if_len);
        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[conf_no].stdcfg.wTotalLength*2);
	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[conf_no].stdcfg, 
	//		USB_CFGDSC_LENGTH );
	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[conf_no].stdcfg.wTotalLength);

	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 + =
减小字号Ctrl + -
显示快捷键?