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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbdma.c

?? zlg_usb協議棧是周立功公司開發的一款開放的usb源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:

/****************************************Copyright (c)**************************************************
**                               Guangzhou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			USBCI.c
** Created by:			MingYuan Zheng
** Created date:		2005-1-6
** Last modified Date:	
** Last Version:		V1.0
** Descriptions:		LPC2148 USB DMA 
**												 
*******************************************************************************************************/

#include "config.h"

#include "USBConfig.h"
#include "USBCI.h"
#include "descriptor.h"

#include "USBDriver.h"
#include "USBdma.h"
#include "string.h"

#if DMA_ENGINE_EN 

/*
******************************************************************************
*		uCOS-II相關 API 函數 	   API Function releated with uCOS-II
******************************************************************************
*/

/*************************************************************************************************************************
** 函數名稱: USB_ReadPortDMA()								  Name:		  USB_ReadPortDMA()
** 功能描述: 讀端點(DMA方式)								  Function:	  read data from endpoint(DMA Mode)
** 輸   入: INT8U	   endp:  物理端點索引號 	  			  Input:	  INT8U	    endp: the physical endpoint number
			 CTRL_USB *pUsb:  接收/發送數據控制塊                         CTRL_USB *pUsb: the control block of receiving/sending 
			 INT32U     len:  接收字節個數								  INT32U     len: the numbers(Bytes) that will be received
			 INT8U *recbuff:  接收緩沖區								  INT8U *recbuff: the reception buffer
			 INT16U	timeout:  超時等待時間, 等于0表示無限等待             INT16U timeout: timeout of receiving,0 indicates limitless waiting
** 輸	 出: 0:	讀成功       > 0 讀失敗(錯誤碼)				  Output:	  0:  sucessfully	 >0: fail (it is error code)
**************************************************************************************************************************/
INT8U USB_ReadPortDMA(INT8U endp, CTRL_USB *pUsb, INT32U len, INT8U *recbuff, INT16U timeout)
{
	INT8U err;
	
	OS_ENTER_CRITICAL();
	err = USB_RW_Param(pUsb, recbuff);						   /* 檢查參數正確性  				  check the parameter */
	if (err != USB_NO_ERR)
	{
		OS_EXIT_CRITICAL();	
		return err;											   /* 返回錯誤碼     				  return error code   */
	}	
	OS_EXIT_CRITICAL();	
	
	OS_ENTER_CRITICAL();
	pUsb->buff    = recbuff;								
	pUsb->len     = len;									   /* 要接收的字節長度 				  the bytes length that will be received */	
	pUsb->cnt 	  = 0; 
	USB_DMASetTransLength(endp, len);
	OS_EXIT_CRITICAL();	
	OSSemPend(pUsb->Ep_Sem, timeout, &err); 				   /* 等待DMA接收數據的完成		      wait for finishing receiving data */

	OS_ENTER_CRITICAL();
	pUsb->bEpUsed = 0;
	OS_EXIT_CRITICAL();
	if (err == OS_NO_ERR)
		return USB_NO_ERR;									   /* 接收成功						  receive sucessfully */
	else
		return USB_ERR_WR_TIMEOUT;							   /* 接收超時錯誤					  receive fail because it is timeout */
}


/*************************************************************************************************************************
** 函數名稱: USB_WritePortDMA()								  Name:		  USB_WritePortDMA()
** 功能描述: 向USB主機發送數據(DMA方式)					  	  Function:	  send data to USB Host(DMA Mode)
** 輸   入: INT8U	   endp:  物理端點索引號 	  			  Input:	  INT8U	    endp:  the physical endpoint number
			 CTRL_USB *pUsb:  接收/發送數據控制塊                         CTRL_USB *pUsb:  the control block of receiving/sending 
			 INT8U *sendbuff: 接收緩沖區								  INT8U *sendbuff: the transmision buffer
			 INT32U     len:  接收字節個數								  INT32U     len:  the numbers(Bytes) that will be received
			 INT16U	timeout:  超時等待時間, 等于0表示無限等待             INT16U timeout:  timeout of transmision,0 indicates limitless waiting
** 輸	 出: 0:	讀成功       > 0 讀失敗(錯誤碼)				  Output:	  0:  sucessfully	 >0: fail (it is error code)
**************************************************************************************************************************/
INT8U USB_WritePortDMA(INT8U endp, CTRL_USB *pUsb, INT8U *sendbuff, INT32U len, INT16U timeout)
{
	INT8U err,*pdmabuf;
	INT32U sendlen;
	
	OS_ENTER_CRITICAL();
	err = USB_RW_Param(pUsb, sendbuff);						  /* 檢查參數正確性  				check the parameter */
	if (err != USB_NO_ERR)
	{
		OS_EXIT_CRITICAL();
		return err;											  /* 返回錯誤碼     				return error code   */
	}
	OS_EXIT_CRITICAL();	
	
	OS_ENTER_CRITICAL();
	pUsb->buff    = sendbuff;
	pUsb->len     = len;
	pUsb->cnt     = 0;
	
	pdmabuf = USB_DMAGetBuffer(endp);						  /* 取得該端點的DMA緩沖區首地址    get the DMA buffer */
	sendlen = USB_DMASetTransLength(endp, len);				  
	
	memcpy(pdmabuf, sendbuff, sendlen);						  /* 復制數據到DMA發送緩沖區        copy data to DMA send buffer */
	pUsb->cnt = pUsb->cnt + sendlen;						  /* 計數器計數                     counter counting */
	USB_DMAStart_IN(endp);									  /* 啟動 IN 端點的 DMA 傳輸        start the DMA transfer */
	OS_EXIT_CRITICAL();
		
   	OSSemPend(pUsb->Ep_Sem, timeout, &err);					  /* 等待 DMA 發送數據的完成		wait for finishing transmitting data */
   	pUsb->bEpUsed = 0;
   	if (err == OS_NO_ERR)
    {	
    	USBEpIntEn |= (0x01 << endp);
    	return USB_NO_ERR;									  /* 發送成功						transmit sucessfully */
	}
	else
	{
		USBEpIntEn |= (0x01 << endp);
		return USB_ERR_WR_TIMEOUT;							  /* 發送成功						transmit sucessfully */
	}
}


/*
***********************************************************************
*		用戶可使用的API函數    API Function
***********************************************************************
*/
	
/************************************************************************************************************
** 函數名稱: USB_DMAInit()								Name	 : USB_DMAInit()
** 功能描述: LPC23xx DMA引擎初始化						Function : Initialize DMA engine of LPC23xx USB
************************************************************************************************************/
void USB_DMAInit(void)
{
	USB_InitUdcaTable();								/* 初始化UDCA表      Initialize the UDCA table */
		
	USB_InitEndpointDD(2);								/* 初始化各端點的DD  Initialize the DD of each endpoint */
	USB_InitEndpointDD(3);
	USB_InitEndpointDD(4);
	USB_InitEndpointDD(5);
	
														/* Enable System error, New DD Request and End of Transfer Interrupt of DMA */
	USBDMAIntEn = USBDMA_EOT_INT | USBDMA_NDD_INT | USBDMA_ERR_INT;			/* 使能DMA的系統錯誤中斷, 新DD請求中斷, 傳輸結束中斷 */
	
	USBEpDMAEn = (0x01 << 2) | (0x01 << 3) | (0x01 << 4) | (0x01 << 5);
														/* 使能端點DMA功能   Enable Endpoint DMA */
}


/************************************************************************************************************
** 函數名稱: USB_DMASetTransLength()					Name	 : USB_DMASetTransLength()
** 功能描述: 設置 DMA 傳輸長度							Function : Config DMA transfer length
** 輸	 入: INT8U endp: 物理端點號						Input	 : INT8U endp: physical endpoint
			 INT16U len: 傳輸字節長度				  		  	   INT16U len: transfer byte length
** 輸	 出: 實際 DMA 傳輸長度							Output	 : the actual transfer length	
************************************************************************************************************/
INT32U USB_DMASetTransLength(INT8U endp, INT32U len)
{ 
	DD_DESCRIPTOR *pDD = USB_GetDDPointer(endp);		/* 取得 DD 指針 		   Get the DD pointer of the endpoint */

	USB_InitEndpointDD(endp);							/* 初始化DD      		   Initialize the DD */
	
	if (len > (pDD->control >> 16))						/* 長度超過本端點DMA緩沖區 len is beyond the dma buffer of the endpoint*/
		len = pDD->control >> 16;
	
	pDD->control &= 0x0000FFFF;
	pDD->control |= (len << 16);						/* 將len寫入DD	 		   Write the len into DD */

	return len;											
}


/************************************************************************************************************
** 函數名稱: USB_DMAGetRecLength()						Name	 : USB_DMAGetRecLength()
** 功能描述: 取得當前 DMA 傳輸長度						Function : get the current DMA transfer length
** 輸	 入: INT8U endp: 物理端點號						Input	 : INT8U endp: physical endpoint
** 輸	 出: 當前 DMA 傳輸長度							Output	 : current transfer length	
************************************************************************************************************/
INT32U USB_DMAGetRecLength(INT8U endp)
{
	DD_DESCRIPTOR *pDD = USB_GetDDPointer(endp);		/* 取得 DD 指針 		   Get the DD pointer of the endpoint */	
	
	return (pDD->status & 0xFFFF0000) >> 16;			/* 返回長度值 			   return the length value */
}


/************************************************************************************************************
** 函數名稱: USB_DMAStart_IN()							Name	 : USB_DMAStart_IN()
** 功能描述: 啟動 IN 端點的 DMA 傳輸					Function : start the DMA transfer of IN endpoint
** 輸	 入: INT8U endp: 物理端點號						Input	 : INT8U endp: physical endpoint
** 輸	 出: 無											Output	 : NULL	
************************************************************************************************************/
void USB_DMAStart_IN(INT8U endp)
{
	USBEpIntEn &= ~(0x01 << endp);						/* 清0 從機端點中斷使能寄存器來啟動 IN 傳輸 */
}														/* clear slave endpoint interrupt enable register to start IN transfer */


/************************************************************************************************************
** 函數名稱: USB_DMAGetBuffer()							Name	 : USB_DMAGetBuffer()
** 功能描述: 得到DMA緩沖區首址							Function : Initialize DMA engine of LPC23xx USB
************************************************************************************************************/
INT8U* USB_DMAGetBuffer(INT8U endp)
{
	const INT32U DmaTbl[4] = {DMA_BUFFER_ADDR_EP02, DMA_BUFFER_ADDR_EP03,
							  DMA_BUFFER_ADDR_EP04, DMA_BUFFER_ADDR_EP05};

	return (INT8U *)((INT32U *)DmaTbl[endp - 2]);		/* 返回緩沖區字節指針   return the byte buffer pointer */
}




/*
***********************************************************************
*		DMA 中斷服務程序	 The Interrupt Service of the DMA 
***********************************************************************
*/

/************************************************************************************************************
** 函數名稱: Usb_DMAService()							Name	 : Usb_DMAService()
** 功能描述: DMA 中斷服務程序							Function : USB DMA Interrupt Service Program
************************************************************************************************************/
void USB_DMAService(void)
{
	INT32U dma_st;
		
	dma_st = USBDMAIntSt;								/* 讀DMA中斷狀態寄存器  Read USBDMAIntSt */

	if (dma_st & USBDMA_EOT_INT)										
		USB_DMATransferEnd();							/* 傳輸結束中斷			End of Transfer Interrupt */
		
	if (dma_st & USBDMA_NDD_INT)	
		USB_DMANewDDRequest();							/* 新DD請求中斷			New DD Request Interrupt */
	
	if (dma_st & USBDMA_ERR_INT)
		USB_DMASystemError();							/* 系統錯誤中斷			System Error Interrupt */
}


/************************************************************************************************************************
** 函數名稱:  USB_DMAWriteISR()									Name:		USB_DMAWriteISR()
** 功能描述:  USB 端點發送中斷服務程序(DMA)						Function:	the transmission interrupt service of USB endpoint 
** 輸   入:  CTRL_USB *pUsb:  USB接收與發送控制結構體指針		Input:		CTRL_USB *pUsb: the CTRL_USB structure
			  INT8U		endp:  物理端點號									INT8U	  endp: the number of physical endpoint
** 輸   出:  無												Output:		NULL
*************************************************************************************************************************/
void USB_DMAWriteISR(CTRL_USB *pUsb, INT8U endp)
{
	INT8U *pBuff,*sendbuf;
	INT32U len,sendlen;
	
	if (pUsb->bEpUsed != 0)
	{															   /* 有任務在等待發送    	  exist task waiting for transmission */
		if (pUsb->cnt >= pUsb->len)
		{
			OSSemPost(Ctrl_Usb[endp - 2].Ep_Sem);				   /* 數據全部發送完成 	  	  all data have been send */
			return;
		}
		
		len = pUsb->len - pUsb->cnt;   			   				   /* 計算未發送字節數  	  calculate the numbers of bytes that will be transmitted */
		pBuff = pUsb->buff;
		if (len > 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲在线观看免费| 理论片日本一区| 丝瓜av网站精品一区二区| 日本欧美一区二区三区乱码| 国产成人一级电影| 欧美天堂一区二区三区| 26uuu欧美| 午夜av电影一区| 91玉足脚交白嫩脚丫在线播放| 欧美体内she精高潮| 国产日产欧美一区二区三区| 婷婷一区二区三区| 成人aa视频在线观看| 欧美一区二区三区思思人| 亚洲欧洲一区二区三区| 蜜臀久久99精品久久久画质超高清| 波多野结衣的一区二区三区| 91精品国产一区二区三区| 亚洲国产精品久久人人爱| 国产女人水真多18毛片18精品视频| 午夜国产精品影院在线观看| 91色|porny| 欧美美女bb生活片| 高清免费成人av| 欧美精品日日鲁夜夜添| 亚洲人成精品久久久久久| 国产成人综合在线播放| 欧美草草影院在线视频| 日韩电影在线免费| 欧美日韩另类国产亚洲欧美一级| 国产精品久久久久aaaa| 国产精品一二三| 精品捆绑美女sm三区| 麻豆专区一区二区三区四区五区| 欧美日本高清视频在线观看| 亚洲小少妇裸体bbw| 色琪琪一区二区三区亚洲区| 综合中文字幕亚洲| 91首页免费视频| 亚洲美女一区二区三区| 91亚洲国产成人精品一区二区三| 国产精品免费av| 成人免费av网站| 国产精品区一区二区三| 成人黄色片在线观看| 中文字幕制服丝袜一区二区三区 | 久久久www免费人成精品| 日本vs亚洲vs韩国一区三区二区| 精品视频免费在线| 天天色 色综合| 欧美一级片在线| 色狠狠桃花综合| 亚洲精品免费一二三区| 欧美午夜影院一区| 日韩av在线发布| 精品久久一二三区| 粉嫩av一区二区三区| 亚洲欧美日韩在线播放| 欧美日韩一卡二卡三卡| 日本成人在线不卡视频| 欧美精品一区二区三区四区| 国产91综合网| 亚洲狠狠爱一区二区三区| 日韩一区二区精品葵司在线 | 一区免费观看视频| 91精彩视频在线| 欧美a级一区二区| 中文字幕国产精品一区二区| 日本道色综合久久| 美女视频网站黄色亚洲| 国产精品网站一区| 欧洲国内综合视频| 国精产品一区一区三区mba桃花| 国产欧美日韩精品一区| 欧洲精品一区二区| 韩国v欧美v日本v亚洲v| 亚洲精选在线视频| 欧美岛国在线观看| 一本在线高清不卡dvd| 蜜臀精品一区二区三区在线观看| 国产午夜亚洲精品羞羞网站| 在线观看欧美日本| 国产一区亚洲一区| 亚洲国产日韩av| 国产日韩影视精品| 91精品国产色综合久久不卡蜜臀 | 国产成人午夜高潮毛片| 亚洲最新在线观看| 国产日韩欧美a| 337p亚洲精品色噜噜| www.爱久久.com| 久久99最新地址| 亚洲国产乱码最新视频| 国产精品网站在线播放| 日韩一区二区三| 日韩欧美一卡二卡| 91丨九色丨黑人外教| 国产一区二区影院| 午夜天堂影视香蕉久久| 亚洲视频免费看| 国产视频在线观看一区二区三区| 欧美日韩成人激情| 色综合一个色综合亚洲| 福利电影一区二区三区| 久久99精品久久久久久动态图| 亚洲福利电影网| 亚洲精品成人精品456| 亚洲国产成人在线| 久久久久久久久久久电影| 91精品国产美女浴室洗澡无遮挡| 色综合天天性综合| 99精品国产热久久91蜜凸| 国产麻豆9l精品三级站| 久久福利资源站| 蜜臀av在线播放一区二区三区| 婷婷中文字幕一区三区| 亚洲va在线va天堂| 午夜视频在线观看一区| 亚洲电影欧美电影有声小说| 亚洲激情网站免费观看| 亚洲色图清纯唯美| 亚洲欧美另类久久久精品| 亚洲天堂成人网| 亚洲欧美日韩国产成人精品影院| 国产精品色在线观看| 国产精品美女久久久久av爽李琼| 国产日本一区二区| 国产精品久久久久久久浪潮网站| 国产精品人成在线观看免费| 中文字幕在线不卡一区| 成人欧美一区二区三区1314 | 制服丝袜亚洲色图| 91精品国产综合久久精品app| 欧美肥妇bbw| 精品久久久久久久久久久久包黑料 | |精品福利一区二区三区| 中文字幕中文字幕中文字幕亚洲无线 | 亚洲国产精品久久人人爱蜜臀| 夜夜嗨av一区二区三区网页 | 成人免费精品视频| 99精品黄色片免费大全| 欧美日韩精品一区视频| 欧美丰满一区二区免费视频| 日韩午夜在线观看视频| 久久久久久综合| 亚洲四区在线观看| 日韩专区在线视频| 国产精品一区二区男女羞羞无遮挡| 国产高清成人在线| 一本大道av伊人久久综合| 欧美日韩免费一区二区三区 | 国产在线精品免费| 成人黄色大片在线观看| 欧美专区在线观看一区| 欧美一卡二卡三卡四卡| 欧美极品xxx| 午夜久久久久久| 国产精品一品视频| 欧美性猛交xxxx黑人交 | 欧美性一级生活| 欧美成人乱码一区二区三区| 亚洲国产高清在线| 五月天亚洲婷婷| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 国产99久久久久| 欧美色网一区二区| 国产日韩一级二级三级| 亚洲成人免费电影| 精品一区二区日韩| 91丝袜呻吟高潮美腿白嫩在线观看| 宅男在线国产精品| 亚洲欧洲日韩在线| 狠狠久久亚洲欧美| 色婷婷av一区二区三区大白胸| 精品人在线二区三区| 亚洲制服丝袜在线| youjizz久久| 久久在线观看免费| 丝瓜av网站精品一区二区| a级精品国产片在线观看| 亚洲成人av一区二区三区| 国产成人99久久亚洲综合精品| 欧美日韩一级片在线观看| 国产精品国产精品国产专区不蜜| 美女国产一区二区三区| 91福利在线免费观看| 国产片一区二区| 麻豆精品久久久| 欧美日韩国产另类不卡| 亚洲色图欧美偷拍| 韩日av一区二区| 日韩一本二本av| 日韩精品免费视频人成| 91福利精品第一导航| 国产精品福利一区| 成人av影院在线| 国产精品三级在线观看| 国产精品66部| 久久久精品tv| 国产成人av电影在线|