亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? usb.c

?? 嵌入式LINUX9系統(tǒng)應(yīng)用開發(fā)詳解中USB編程實例
?? C
?? 第 1 頁 / 共 2 頁
字號:
		}
		ep[epnum].buffer.position += fifo_data;
	}
	if (event & (MCF5272_USB_EP0ISR_OUT_LVL | MCF5272_USB_EPNISR_FIFO_LVL))
	{
		/* Clear the FIFO Level Interrupt bits */
		MCF5272_WR_USB_EPISR(imm, epnum, 0
			| MCF5272_USB_EP0ISR_OUT_LVL
			| MCF5272_USB_EPNISR_FIFO_LVL);
	}
	if (event & (MCF5272_USB_EP0ISR_OUT_EOT | MCF5272_USB_EPNISR_EOT))
	{
		/* The current transfer is complete */
		/* Clear the EOT Interrupt bits */
		MCF5272_WR_USB_EPISR(imm, epnum, 0
			| MCF5272_USB_EP0ISR_OUT_EOT
			| MCF5272_USB_EPNISR_EOT);

		/* Call the Rx Handler */
		usb_ep_rx_done(epnum,SUCCESS);

		/* Free the buffer if it was malloc()ed */
		if (ep[epnum].buffer.free)
		{
			ep[epnum].buffer.free = FALSE;
			free(ep[epnum].buffer.start);
		}
		ep[epnum].buffer.length = 0;
		ep[epnum].buffer.position = 0;
		ep[epnum].buffer.start = 0;
	}
}

/********************************************************************/
void 
usb_bus_state_chg_service(uint32 event)
{
    if (event & SUSPEND)
    {
    	#if (DEBUG)
			printf("The bus is suspended (J state)\n");
		#endif
        if (event & ENABLE_WAKEUP)
        {
            #if (DEBUG)
                printf("Remote wakeup enabled.\n");
            #endif
            /* Set the Remote Wakeup flag */
            fRemoteWakeup = 1;
        }
    }
    if (event & RESUME)
    {
		#if (DEBUG)
			printf("The bus has been resumed (K state)\n");
		#endif
    }
    if (event & RESET)
    {
		#if (DEBUG)
			printf("USB reset signal detected\n");
		#endif
    }
}

/********************************************************************/
void 
usb_devcfg_service(void)
{
	static uint8 last_addr = 0;
	static uint8 last_config = 0;
	static uint32 last_altsetting = 0;
	uint8 flags, i, j, epnum;
	USB_CONFIG_DESC *pCfgDesc;
	USB_INTERFACE_DESC *pIfcDesc;
	USB_ENDPOINT_DESC *pEpDesc;
	MCF5272_IMM *imm = mcf5272_get_immp();

	flags = 0;
	if (last_addr != MCF5272_RD_USB_FAR(imm))
	{
		#if (DEBUG)
			printf("Address change:  old addr = %d, new addr = %d\n",
					last_addr, MCF5272_RD_USB_FAR(imm));
		#endif
		last_addr = MCF5272_RD_USB_FAR(imm);
		flags |= ADDRESS_CHG;
	}
	if (last_config != (MCF5272_RD_USB_EP0SR(imm) >> 12))
	{
		#if (DEBUG)
			printf("Configuration change:  old cfg = %d, new cfg = %d\n",
					last_config, MCF5272_RD_USB_EP0SR(imm) >> 12);
		#endif

		last_config = (uint8)(MCF5272_RD_USB_EP0SR(imm) >> 12);
		flags |= CONFIGURATION_CHG;
	}
	if (last_altsetting != (MCF5272_RD_USB_ASR(imm)))
	{
		#if (DEBUG)
			printf("Interface change:  old setting = %d, new setting = %d\n",
					last_altsetting, MCF5272_RD_USB_ASR(imm));
		#endif
		last_altsetting = (MCF5272_RD_USB_ASR(imm));
		flags |= INTERFACE_CHG;
	}
	if (flags & (INTERFACE_CHG | CONFIGURATION_CHG))
	{
		/* Initialize Endpoint settings for this configuration */

		/* Start by marking all Endpoints as disabled (except EP0) */
		for (i = 1; i < NUM_ENDPOINTS; i++)
			ep[i].ttype = DISABLED;

		/* Get pointer to active Configuration descriptor */
		pCfgDesc = (USB_CONFIG_DESC *)usb_get_desc(last_config, -1, -1, -1);

		/* Iterate through all the valid Interfaces in this Configuration */
		for (i = 0; i < pCfgDesc->bNumInterfaces; i++)
		{
			pIfcDesc = (USB_INTERFACE_DESC *)usb_get_desc(last_config, i, 
														AltSetting(imm, i),
														-1);
			/* Iterate through all the valid Endpoints in this interface */
			for (j = 0; j < pIfcDesc->bNumEndpoints; j++)
			{
				pEpDesc = (USB_ENDPOINT_DESC *)usb_get_desc(last_config, i, 
														  AltSetting(imm, i),
														  j);
				if (pEpDesc)
				{
					epnum = pEpDesc->bEndpointAddress & 0x0F;

					/* See if this Endpoint is actually active */
					if (!(MCF5272_RD_USB_EPISR(imm, epnum) & 
						  MCF5272_USB_EPNISR_PRES))
						return;

					/* Set the new transfer type */
					ep[epnum].ttype = pEpDesc->bmAttributes;

					/* Set the current direction */
					if (MCF5272_RD_USB_EPISR(imm, epnum) & 
						MCF5272_USB_EPNISR_DIR)
						ep[epnum].dir = IN;
					else
						ep[epnum].dir = OUT;

					/* Get the current packet size */
					ep[epnum].packet_size = (uint16)(pEpDesc->wMaxPacketSizeL +
						(pEpDesc->wMaxPacketSizeH << 8));

					/* No buffer allocated yet */
					ep[epnum].buffer.start = 0;
					ep[epnum].buffer.position = 0;
					ep[epnum].buffer.length = 0;
					ep[epnum].buffer.free = 0;

					if (ep[epnum].ttype == ISOCHRONOUS)
					{
						/* Set the FIFO length */
						ep[epnum].fifo_length = ep[epnum].packet_size;

						/* Enable ISO mode and set FIFO Level for interrupts */
						MCF5272_WR_USB_EPCTL(imm, epnum, 0
							| MCF5272_USB_EPNCTL_ISO_MODE
							| MCF5272_USB_EPNCTL_FIFO_LVL(2));

						/* Disable EOP and EOT interrupts, enable FIFO_LVL */
						MCF5272_WR_USB_EPIMR(imm, epnum, 
							(MCF5272_RD_USB_EPIMR(imm, epnum)
								& ~(MCF5272_USB_EPNISR_EOP
								| MCF5272_USB_EPNISR_EOT))
							| MCF5272_USB_EPNISR_FIFO_LVL);
					}
					else
					{
						/* Set the FIFO length */
						ep[epnum].fifo_length = \
							(uint16)(ep[epnum].packet_size * FIFO_DEPTH);

						/* Disable ISO mode and set IN-BUSY (if IN EP)*/
						if (ep[epnum].dir == IN)
						{
							/* Set the IN-BUSY bit - This is only required
							   on pre-2K75N masks. This bit is set by HW 
							   beginning with the 2K75N silicon. */
							MCF5272_WR_USB_EPCTL(imm, epnum, \
								MCF5272_USB_EPNCTL_IN_BUSY);
						}
						else
						{
							MCF5272_WR_USB_EPCTL(imm, epnum, 0);
						}

						/* Enable EOP and EOT interrupts, disable FIFO_LVL */
						MCF5272_WR_USB_EPIMR(imm, epnum,
							(MCF5272_RD_USB_EPIMR(imm, epnum)
								& ~MCF5272_USB_EPNISR_FIFO_LVL)
							| MCF5272_USB_EPNISR_EOP
							| MCF5272_USB_EPNISR_EOT);
					}
				}
			}
		}	
		usb_fifo_init();
	}
	
	/* Call application specific routine to notify of config/iface change */
	usb_devcfg_notice(flags, last_config, last_altsetting);
}

/********************************************************************/
void
usb_vendreq_done(uint32 error)
{
	MCF5272_IMM *imm = mcf5272_get_immp();

	if (error)
		/* This sends a single STALL as the handshake */
		MCF5272_WR_USB_EP0CTL(imm,
			MCF5272_RD_USB_EP0CTL(imm)
			| MCF5272_USB_EP0CTL_CMD_OVER
			| MCF5272_USB_EP0CTL_CMD_ERR);
	else
		MCF5272_WR_USB_EP0CTL(imm,
			MCF5272_RD_USB_EP0CTL(imm)
			| MCF5272_USB_EP0CTL_CMD_OVER);
	return;
}

/********************************************************************/
void
usb_sort_ep_array(USB_EP_STATE *list[], int n)
{
	/* Simple bubble sort function called by usb_fifo_init() */
	int i, pass, sorted;
	USB_EP_STATE *temp;
	pass = 1;

	do {
		sorted = 1;
		for (i = 0; i < n - pass; ++i)
		{
			if (list[i]->fifo_length < list[i+1]->fifo_length )
			{
				/* Exchange out-of-order pair */
				temp = list[i];
				list[i] = list[i + 1];
				list[i+1] = temp;
				sorted = 0;
			}
		}
		++pass;
	} while(!sorted);
}

/********************************************************************/
void
usb_make_power_of_two(uint32 *size)
{
	/* Called by usb_fifo_init() */
	int i, not_power_of_two = 0;
	uint32 new_size = *size;

	for (i = 0; new_size != 1; i++)
	{
		if (new_size & 0x0001)
			not_power_of_two = 1;
		new_size >>= 1;
	}
	new_size = 1 << (i + not_power_of_two);
	if (new_size > 256)
		new_size = 256;
	*size = new_size;
}

/********************************************************************/
void
usb_fifo_init(void)
{
	MCF5272_IMM *imm = mcf5272_get_immp();
	USB_EP_STATE *pIN[NUM_ENDPOINTS];
	USB_EP_STATE *pOUT[NUM_ENDPOINTS];
	uint8 nIN, nOUT, i;
	uint16 INpos, OUTpos;

	/* Endpoint 0 is always present and bi-directional */
	pIN[0] = &ep[0];
	pOUT[0] = &ep[0];
	nIN = nOUT = 1;

	/* Sort the active endpoints by direction */
	for (i = 1; i < NUM_ENDPOINTS; i++)
	{
		if (ep[i].ttype != DISABLED)
		{
			if (ep[i].dir == IN)
				pIN[nIN++] = &ep[i];
			else
				pOUT[nOUT++] = &ep[i];
		}
	}

	/* Make sure FIFO size is a power of 2; if not, make it so */
	for (i = 0; i < nIN; i++)
		usb_make_power_of_two( &(pIN[i]->fifo_length) );
	for (i = 0; i < nOUT; i++)
		usb_make_power_of_two( &(pOUT[i]->fifo_length) );

	/* Sort the endpoints by FIFO length (decending) */
	usb_sort_ep_array(pIN, nIN);
	usb_sort_ep_array(pOUT, nOUT);

	/* Calculate the FIFO address for each endpoint */
	INpos = 0;
	OUTpos = 0;
	for (i = 0; i < nIN; i++)
	{
		pIN[i]->in_fifo_start = INpos;
		INpos += pIN[i]->fifo_length;
	}
	for (i = 0; i < nOUT; i++)
	{
		pOUT[i]->out_fifo_start = OUTpos;
		OUTpos += pOUT[i]->fifo_length;
	}

	/* Save the FIFO settings into the Configuration Registers */
	
	/* Initialize Endpoint 0 IN FIFO */
	MCF5272_WR_USB_IEP0CFG(imm, 0
		| (ep[0].packet_size << 22)
		| (ep[0].fifo_length << 11)
		|  ep[0].in_fifo_start);

	/* Initialize Endpoint 0 OUT FIFO */
	MCF5272_WR_USB_OEP0CFG(imm, 0
		| (ep[0].packet_size << 22)
		| (ep[0].fifo_length << 11)
		|  ep[0].out_fifo_start);

	for (i = 1; i < NUM_ENDPOINTS; i++)
	{
		if (ep[i].ttype != DISABLED)
		{
			if (ep[i].dir == IN)
				/* Initialize Endpoint i FIFO */
				MCF5272_WR_USB_EPCFG(imm, i, 0
				| (ep[i].packet_size << 22)
				| (ep[i].fifo_length << 11)
				|  ep[i].in_fifo_start);
			else
				/* Initialize Endpoint i FIFO */
				MCF5272_WR_USB_EPCFG(imm, i, 0
				| (ep[i].packet_size << 22)
				| (ep[i].fifo_length << 11)
				|  ep[i].out_fifo_start);
		}
	}
}

/********************************************************************/
uint32
usb_tx_data(uint32 epnum, uint8 *start, uint16 length)
{
	MCF5272_IMM *imm = mcf5272_get_immp();
	uint32 imr_mask, i;

	/* Make sure there is data to send */
	if (!start)
		return 0;
	/* Check the bounds on epnum */
	if (epnum > NUM_ENDPOINTS)
		return 0;
	/* See if the EP is currently busy */
	if (ep[epnum].buffer.start || (epnum && MCF5272_RD_USB_EPDPR(imm, epnum)))
		return 0;
	/* Make sure this is an IN endpoint */
	if (epnum && !(MCF5272_RD_USB_EPISR(imm, epnum) & MCF5272_USB_EPNISR_DIR))
		return 0;
	/* Make sure this EP is not HALTed */
	if (MCF5272_RD_USB_EPISR(imm, epnum) & MCF5272_USB_EPNISR_HALT)
		return 0;

	/* Setup the EP Buffer structure */
	ep[epnum].buffer.start = start;
	ep[epnum].buffer.length = length;
	ep[epnum].buffer.position = 0;
	
	/* Save off the current IMR */
	imr_mask = MCF5272_RD_USB_EPIMR(imm, epnum);

	/* Clear the EOT, EOP and FIFO_LVL mask bits */
	MCF5272_WR_USB_EPIMR(imm, epnum, imr_mask & 
		~(MCF5272_USB_EPNISR_EOT
		| MCF5272_USB_EPNISR_EOP
		| MCF5272_USB_EPNISR_FIFO_LVL));

	for (i = 0; i < ep[epnum].fifo_length; )
	{
		if ( (ep[epnum].buffer.length - i) <= 3 )
		{
			MCF5272_WR_USB_EPDR(imm, epnum, 8, ep[epnum].buffer.start[i]);
			i++;
		}
		else
		{
			MCF5272_WR_USB_EPDR(imm, epnum, 32,
				*(uint32 *)(&ep[epnum].buffer.start[i]));
			i += 4;
		}
		if ( i == ep[epnum].buffer.length )
		{
			/* This is all of the data to be sent -> Clear the IN-BUSY bit */
			MCF5272_WR_USB_EPCTL(imm, epnum, MCF5272_RD_USB_EPCTL(imm, epnum)
				& ~MCF5272_USB_EPNCTL_IN_BUSY);
			break;
		}
	}
	ep[epnum].buffer.position = (uint16)i;
	MCF5272_WR_USB_EPIMR(imm, epnum, imr_mask);
	return 1;
}
/********************************************************************/
uint8*
usb_get_desc(int8 config, int8 iface, int8 setting, int8 ep)
{
	/* Note:
	 * ep is the offset and not the physical endpoint number
	 * In order to get the config desc pointer, specify -1 for 
	 * all other inputs except config
	 * In order to get the interface/alternate setting desc pointer,
	 * specify -1 for epNum
	 */
	int i;
	uint8 *pDesc = (uint8 *)&Descriptors;

	if (config != -1)
	{
		if (config > ((USB_DEVICE_DESC *)pDesc)->bNumConfigurations)
			return 0;
		
		/* Allow for non-standard desc between device and config desc */
		while (pDesc[1] != CONFIGURATION)
			pDesc += pDesc[0];	

		/* pDesc now points to Config 1 descriptor */
		for (i = 1; i < config;)
		{
			pDesc += pDesc[0];
			if (pDesc[1] == CONFIGURATION)
				i++;
		}

		/* pDesc now points to the correct Configuration descriptor */
		if ((iface != -1) && (setting != -1))
		{
			if (iface >= ((USB_CONFIG_DESC *)pDesc)->bNumInterfaces)
				return 0;

			/* Allow for non-standard desc between config and iface desc */
			while (pDesc[1] != INTERFACE)
				pDesc += pDesc[0];

			/* pDesc now points to first Interface descriptor */
			for (i = 0; i < iface;)
			{
				pDesc += pDesc[0];
				if (pDesc[1] == INTERFACE && pDesc[3] == 0)
					i++;
			}
			/* pDesc now points to correct Interface descriptor */
			for (i = 0; i < setting;)
			{
				pDesc += pDesc[0];
				if (pDesc[1] == INTERFACE)
				{
					if (pDesc[2] != iface)
						return 0;
					else
						i++;
				}
			}

			/* pDesc now points to correct Alternate Setting descriptor */
			if (ep != -1)
			{
				if (ep >= pDesc[4])
					return 0;

				/* Allow for non-standard desc between iface and ep desc */
				while (pDesc[1] != ENDPOINT)
					pDesc += pDesc[0];

				/* pDesc now points to first Endpoint descriptor */
				for (i = 0; i < ep;)
				{
					pDesc += pDesc[0];
					if (pDesc[1] == ENDPOINT)
						i++;
				}
				/* pDesc now points to the correct Endpoint descriptor */
			}
		}
	}
	return (pDesc);
}

/********************************************************************/

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91蜜桃传媒精品久久久一区二区| 欧美日韩一区在线| 欧美在线免费观看亚洲| 日韩欧美电影一二三| 亚洲一区中文在线| 粉嫩一区二区三区性色av| 日韩欧美亚洲国产另类| 亚洲激情网站免费观看| 国产一区二区成人久久免费影院 | 亚洲视频中文字幕| 视频一区中文字幕国产| 99精品一区二区| 欧美韩日一区二区三区四区| 免费三级欧美电影| 欧美日韩一区二区在线观看| 《视频一区视频二区| 国产伦精品一区二区三区免费 | 久久久不卡网国产精品二区| 日韩电影在线一区二区| 色94色欧美sute亚洲线路一久 | 精品国产乱码久久久久久牛牛| 亚洲精品免费看| 99国产精品国产精品毛片| 精品国产成人在线影院 | 亚洲精品欧美二区三区中文字幕| 成人性生交大片免费看视频在线| 精品国产成人在线影院| 久久66热偷产精品| 日韩精品专区在线影院重磅| 天天操天天干天天综合网| 在线看国产日韩| 有码一区二区三区| 色狠狠一区二区| 一区二区不卡在线视频 午夜欧美不卡在| 懂色一区二区三区免费观看| 欧美国产精品专区| 粉嫩aⅴ一区二区三区四区五区| 国产欧美精品区一区二区三区 | 亚洲欧美日韩国产另类专区| 99久久婷婷国产| 中文字幕一区二区5566日韩| 91原创在线视频| 亚洲综合图片区| 欧美日本精品一区二区三区| 日韩精品乱码免费| 精品不卡在线视频| 高清av一区二区| 亚洲人成网站影音先锋播放| 日本韩国欧美一区| 日韩国产精品久久| 精品国产污污免费网站入口| 精品一区二区三区在线播放| 久久久久国产精品人| 不卡av在线免费观看| 亚洲免费资源在线播放| 欧美日韩国产天堂| 国产一区二区视频在线播放| 国产精品久久久爽爽爽麻豆色哟哟| 日本高清免费不卡视频| 日韩电影一区二区三区四区| 久久久精品免费网站| 91麻豆文化传媒在线观看| 亚洲18色成人| 国产日韩欧美麻豆| 色天使久久综合网天天| 免费人成在线不卡| 亚洲手机成人高清视频| 日韩视频一区二区三区在线播放| 成人av在线网| 日本欧美一区二区在线观看| 中文成人综合网| 欧美午夜精品久久久久久孕妇| 美女网站色91| 亚洲激情校园春色| 久久久99精品免费观看不卡| 在线中文字幕一区| 国产成人在线色| 亚洲国产另类精品专区| 国产三级精品视频| 在线电影一区二区三区| 成人免费毛片片v| 日本麻豆一区二区三区视频| 亚洲欧美日本在线| 国产午夜精品久久久久久久| 欧美日韩免费视频| 99久久久精品免费观看国产蜜| 日韩精品电影在线| 亚洲自拍偷拍九九九| 久久久国产午夜精品| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲视频免费在线观看| 亚洲精品一区二区三区蜜桃下载 | 亚洲一区在线播放| 日本一区免费视频| 精品国产乱码久久久久久久久| 欧美亚洲愉拍一区二区| 成人午夜在线免费| 国产成人综合在线播放| 免费高清成人在线| 亚洲一区二区三区影院| 亚洲色图制服丝袜| 中文字幕在线播放不卡一区| 精品国产麻豆免费人成网站| 日韩一区和二区| 制服丝袜一区二区三区| 欧美日本在线视频| 欧美调教femdomvk| 欧美亚洲国产bt| 欧美性生活一区| 欧洲人成人精品| 久久综合99re88久久爱| 91精品综合久久久久久| 欧美一区二区三区成人| 7799精品视频| 欧美电影精品一区二区| 欧美精品一区二区三区高清aⅴ| 欧美mv和日韩mv的网站| 欧美变态凌虐bdsm| 精品国产一区二区三区av性色| 精品裸体舞一区二区三区| 久久午夜羞羞影院免费观看| 精品精品欲导航| 久久久影视传媒| 日本一区二区三区久久久久久久久不 | 亚洲欧洲三级电影| 亚洲视频综合在线| 亚洲一卡二卡三卡四卡无卡久久| 亚洲综合免费观看高清完整版在线| 亚洲精品成人少妇| 亚洲www啪成人一区二区麻豆| 亚洲成av人片在线观看无码| 午夜久久久影院| 国产一区二区三区黄视频 | www.亚洲免费av| 99re这里都是精品| 欧美日产国产精品| 精品国产髙清在线看国产毛片| 久久精品一区二区三区不卡牛牛| 国产清纯美女被跳蛋高潮一区二区久久w| 中文字幕精品在线不卡| 亚洲国产一区二区三区青草影视| 日韩精品高清不卡| 成人小视频免费在线观看| 欧洲生活片亚洲生活在线观看| 欧美一区二区在线免费播放| 久久久精品蜜桃| 亚洲一级电影视频| 九九在线精品视频| 91污片在线观看| 日韩视频在线一区二区| 中文字幕一区二区三| 日本欧美加勒比视频| 99这里只有久久精品视频| 欧美精品v国产精品v日韩精品| 精品毛片乱码1区2区3区| 亚洲毛片av在线| 国内精品写真在线观看| 91蜜桃传媒精品久久久一区二区| 欧美一区二区不卡视频| 最新日韩在线视频| 国产一区二区在线观看视频| 欧美专区在线观看一区| 久久精品一区蜜桃臀影院| 亚洲成人av免费| 成人av综合一区| 欧美成人女星排行榜| 亚洲成av人综合在线观看| 丰满岳乱妇一区二区三区| 日韩欧美在线综合网| 一区二区三区在线免费| 国产福利一区在线观看| 91精品国产综合久久久久久久| 国产精品欧美极品| 91精品在线免费观看| 成人欧美一区二区三区1314| 免费观看在线色综合| 欧美午夜电影一区| 中文字幕视频一区二区三区久| 久久机这里只有精品| 欧美日精品一区视频| 亚洲欧美日韩小说| 成人免费视频一区| 国产亚洲精久久久久久| 另类综合日韩欧美亚洲| 欧美午夜精品久久久| 一区二区三区中文字幕电影| 成人aa视频在线观看| 国产欧美久久久精品影院| 国产揄拍国内精品对白| 91精品福利在线一区二区三区 | 国产一区二区三区免费播放| 日韩一区二区三区免费看 | 亚洲一区二区三区四区不卡| 成人激情免费电影网址| 国产婷婷色一区二区三区在线| 另类小说欧美激情| 日韩一区二区三区免费观看| 蜜臀国产一区二区三区在线播放| 制服丝袜激情欧洲亚洲| 三级久久三级久久|