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

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

?? usbdma.c

?? ARM214x系列的USB源碼程序
?? C
字號:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			USBdma.c
** Last modified Date:	2005-8-6
** Last Version:		V1.0
** Descriptions:		LPC2148 USB DMA 控制器相關, 本文件只使能了物理端點 2 ~ 5 的 DMA 功能
**						LPC2148 USB DMA controller, the file only enable the DMA function of physical endpoint 2 ~ 5
**------------------------------------------------------------------------------------------------------
** Created by:			鄭明遠 		MingYuan Zheng
** Created date:		2005-8-6
** Version:				V1.0
** Descriptions:		初始版本	The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:			
** Modified date:
** Version:				
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by: 
** Modified date:
** Version:	
** Descriptions: 
**
********************************************************************************************************/

#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 

/*
***********************************************************************
*		用戶可使用的API函數    API Function
***********************************************************************
*/
	
/************************************************************************************************************
** 函數名稱: USB_DMAInit()								Name	 : USB_DMAInit()
** 功能描述: LPC214x DMA引擎初始化						Function : Initialize DMA engine of LPC214x 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_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 LPC214x 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_DMATransferEnd()						Name	 : USB_DMATransferEnd()
** 功能描述: DMA 傳輸結束中斷處理						Function : Process End of DMA Transfer Interrupt 
************************************************************************************************************/
void USB_DMATransferEnd(void)
{
	INT32U ep_st, endp;
	DD_DESCRIPTOR *pDD;
		
	ep_st = USBEoTIntSt;									/* 讀傳輸結束中斷寄存器       read End of Transfer Interrupt register */
	
	for (endp = 2; endp <= 5; endp++)
	{
		if(ep_st & (0x01 << endp))
		{													/* endp 端點中斷傳輸結束      endp endpoint Interrupt transfer end */
			pDD = USB_GetDDPointer(endp);
			
			if ((pDD->status & 0x1F) == DDS_OVER_RUN)		/* DMA錯誤 				   	  DMA error */
				USBEpDMAEn = (0x01 << endp); 			    /* 重新使能該端點的DMA功能    re-enable Endpoint DMA */ 
			
			if ((pDD->status & 0x1F) == DDS_NORMAL_COMP)	/* DMA正常結束 			  	  DMA normal complete */
			{
				if (endp == 2)	
					bEPPflags.bits.ep1_rxdma = 1;			/* 標志邏輯端點1 DMA接收成功  Flag logic ep0 DMA receiving sucessfully */
				
				if (endp == 4) 
					bEPPflags.bits.ep2_rxdma = 1;			/* 標志邏輯端點2 DMA接收成功  Flag logic ep2 DMA receiving sucessfully */
			}

			USBEoTIntClr |= (0x01 << endp);					/* 清除傳輸結束中斷狀態寄存器 clear end of transfer register */
			
			USB_InitEndpointDD(endp);						/* 重新初始化DD               re-Initialize DD */				
									
			if ((endp % 2) != 0)
				USBEPIntEn |= (0x01 << endp);				/* 重新使能該端點從機中斷 	  re-Enable the endpoint slave Interrupt */

		}				
	}
	
}


/************************************************************************************************************
** 函數名稱: USB_DMASystemError()						Name	 : USB_DMASystemError()
** 功能描述: DMA 系統中斷錯誤處理						Function : Process System Error Interrupt  
************************************************************************************************************/
void USB_DMASystemError(void)
{ 
	INT32U ep_st,endp;

	ep_st = USBSysErrIntSt;							
	
	for (endp = 2; endp < 5; endp++)
	{
		if(ep_st & (0x01 << endp))
		{
			USB_InitEndpointDD(endp);						/* 重新初始化DD               re-Initialize DD */

			USBEpDMAEn = (0x01 << endp);					/* 重新使能該端點的DMA功能    re-enable Endpoint DMA */ 			
			
			USBSysErrIntClr |= (0x01 << endp);				/* 清除系統錯誤中斷			  clear the System error interrupt */
			
			if ((endp % 2) != 0)
				USBEPIntEn |= (0x01 << endp);				/* 重新使能該 IN 端點從機中斷 re-Enable the IN endpoint slave Interrupt */
		}		
	}
}


/************************************************************************************************************
** 函數名稱: USB_DMANewDDRequest()						Name	 : USB_DMANewDDRequest()
** 功能描述: DMA 新 DD 請求中斷處理						Function : Process New DD Request Interrupt   
************************************************************************************************************/
void USB_DMANewDDRequest(void)
{
	INT32U ep_st,endp;

	ep_st = USBNDDRIntSt;
	
	for (endp = 2; endp <= 5; endp++)
	{
		if(ep_st & (0x01 << endp))
		{											
			USB_InitEndpointDD(endp);						/* 重新初始化DD               re-Initialize DD */
				
			USBEpDMAEn = (0x01 << endp);					/* 重新使能該端點的DMA功能    re-enable Endpoint DMA */ 
			
			USBNDDRIntClr = (0x01 << endp);					/* 清除新DD請求中斷			  clear the New DD Request Interrupt */
			
			if ((endp % 2) != 0)
				USBEPIntEn |= (0x01 << endp);				/* 重新使能該端點從機中斷 	  re-Enable the endpoint slave Interrupt */
		}		
	}

}

/*
***********************************************************************
*		本文件用到的子程序	 The Subprogram used by this file 
***********************************************************************
*/
	
/************************************************************************************************************
** 函數名稱: USB_InitUdcaTable()						Name	 : USB_InitUdcaTable()
** 功能描述: 初始化DMA引擎的UDCA寄存器					Function : Initialize the UDCA reigister and UDCA table 
			 和UDCA表											   of DMA engine 
************************************************************************************************************/
void USB_InitUdcaTable(void)
{
	INT32U *pUDCA;
	
	USBUCDAH = USB_RAM_ADDRESS;							/* 初始化UDCA頭寄存器	 Initialize the UDCA register */
	pUDCA = (INT32U *)USBUCDAH;							/* 取出UDCA寄存器值		 Get the value of UDCA register */

	pUDCA[2] = (INT32)DD_ADDRESS_EP02;					/* 建立UDCA表			 Build UDCA table */
	pUDCA[3] = (INT32)DD_ADDRESS_EP03;
	pUDCA[4] = (INT32)DD_ADDRESS_EP04;
	pUDCA[5] = (INT32)DD_ADDRESS_EP05;
}


/************************************************************************************************************
** 函數名稱: USB_InitEndpointDD()						Name	 : USB_InitEndpointDD()
** 功能描述: 初始化端點的DD								Function : Initialize the DD of the endpoint
** 輸	 入: INT8U endp: 物理端點號						Input	 : INT8U endp: physical endpoint
** 輸	 出: 無											Output	 : NULL	
************************************************************************************************************/
void USB_InitEndpointDD(INT8U endp)
{
	DD_DESCRIPTOR *pDD = USB_GetDDPointer(endp);					 /* 取得 DD 指針  	 Get the DD pointer of the endpoint */

	pDD->next_dd_addr = 0;											 /* 清零兩個成員 	 Clear two members */
	pDD->status = 0;

	switch(endp)
	{
		case 0x02: 	pDD->control = (EP1_PACKET_SIZE << 5) + 		 /* 寫端點信息包大小 Write endpoint packet size */
							       (EP02_DMA_BUFFER_LENGTH << 16);	 /* 寫DMA緩沖區大小  Write dma buffer size      */
					pDD->start_addr = DMA_BUFFER_ADDR_EP02;			 /* 寫DMA緩沖區地址  Write dma buffer address   */
					break;
					
		case 0x03:  pDD->control = (EP1_PACKET_SIZE << 5) + 
					               (EP03_DMA_BUFFER_LENGTH << 16);
					pDD->start_addr = DMA_BUFFER_ADDR_EP03;
					break;

		case 0x04:  pDD->control = (EP2_PACKET_SIZE << 5) + 
								   (EP04_DMA_BUFFER_LENGTH << 16);
					pDD->start_addr = DMA_BUFFER_ADDR_EP04;
					break;

		case 0x05: 	pDD->control = (EP2_PACKET_SIZE << 5) + 
								   (EP05_DMA_BUFFER_LENGTH << 16);
					pDD->start_addr = DMA_BUFFER_ADDR_EP05;
					break;
					
		default: 	break;
	}
}


/************************************************************************************************************
** 函數名稱: USB_GetDDPointer()							Name	 : USB_GetDDPointer()
** 功能描述: 獲取端點的DD指針							Function : Get the DD pointer of the endpoint
** 輸	 入: INT8U endp:	  物理端點號				Input	 : INT8U endp: physical endpoint
** 返	 回: DD_DESCRIPTOR *  端點的 DD 描述符指針		Return	 : the DD pointer of the endpoint	
************************************************************************************************************/
DD_DESCRIPTOR *USB_GetDDPointer(INT8U endp)
{
	INT32U dd_addr;
	
	dd_addr = DD_BASE_ADDRESS + DD_SIZE * (endp - 2);	/* 計算地址   	 calculate the address */

	return (DD_DESCRIPTOR *)((INT32U *)dd_addr);		/* 轉換指針類型  change the type of the pointer */
}

#endif
/*******************************************************************************************************
**                            End Of File
********************************************************************************************************/



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99国产精品国产精品久久| 91丨porny丨户外露出| 国产成人亚洲综合a∨猫咪| av中文字幕亚洲| 日韩一二三四区| 中文字幕一区二区三区在线不卡 | av在线播放成人| 欧美一区二区黄色| 亚洲精选视频免费看| 国产一二精品视频| 91精品国产综合久久香蕉的特点 | 国产精品一二二区| 欧美一区二区三区四区在线观看| 国产精品丝袜久久久久久app| 另类小说综合欧美亚洲| 99久久精品国产毛片| 国产亚洲欧美激情| 日本成人在线视频网站| 精品视频在线免费看| 中文字幕不卡一区| 国产精一区二区三区| 欧美xxxxxxxx| 免费不卡在线视频| 欧美一激情一区二区三区| 亚洲国产一区在线观看| 在线观看91视频| √…a在线天堂一区| 成人午夜电影久久影院| 国产午夜精品一区二区三区视频| 国产呦萝稀缺另类资源| 日韩精品在线网站| 精品一区二区三区久久久| 欧美一区二区免费观在线| 丝袜亚洲另类欧美| 91精品久久久久久久91蜜桃| 水野朝阳av一区二区三区| 欧美日韩久久一区| 无码av免费一区二区三区试看| 欧美综合欧美视频| 亚洲一卡二卡三卡四卡五卡| 欧美日韩国产区一| 日韩av不卡在线观看| 日韩一区二区三区三四区视频在线观看| 五月激情丁香一区二区三区| 欧美一级欧美一级在线播放| 久久精品72免费观看| 欧美一区二区国产| 国产精品一二三在| 国产精品欧美久久久久无广告| 成人性视频免费网站| 1区2区3区欧美| 欧美视频在线不卡| 日韩综合在线视频| 久久久国产一区二区三区四区小说 | 欧美日韩在线综合| 亚洲chinese男男1069| 日韩西西人体444www| 国产精品一区久久久久| 国产精品视频你懂的| 日本精品裸体写真集在线观看| 亚洲综合激情网| 欧美电影免费观看高清完整版在线观看| 久久99国产精品麻豆| 国产精品日产欧美久久久久| 在线精品亚洲一区二区不卡| 麻豆久久久久久| 中文无字幕一区二区三区| 色综合天天狠狠| 免费看欧美美女黄的网站| 国产精品入口麻豆原神| 欧美日韩大陆一区二区| 国内精品伊人久久久久av影院| 亚洲图片激情小说| 欧美一级片在线看| 91浏览器入口在线观看| 麻豆成人免费电影| 亚洲黄一区二区三区| 欧美成人vr18sexvr| 99re这里都是精品| 久久精品国产一区二区| 亚洲欧美激情小说另类| 精品国产污污免费网站入口 | 成人黄色电影在线| 免费久久精品视频| 亚洲一区欧美一区| 日本一区二区三区在线观看| 欧美剧在线免费观看网站| aaa欧美日韩| 精品在线免费观看| 午夜精品免费在线| 亚洲蜜臀av乱码久久精品| 精品国产凹凸成av人导航| 欧美日韩专区在线| www.爱久久.com| 理论电影国产精品| 婷婷六月综合亚洲| 亚洲精品成人天堂一二三| 国产亚洲欧美色| 亚洲精品一区二区三区影院| 在线不卡a资源高清| 一本到一区二区三区| 福利视频网站一区二区三区| 日本不卡123| 日韩影院在线观看| 一个色妞综合视频在线观看| 中文字幕在线视频一区| 久久久99免费| 久久久高清一区二区三区| 日韩一区二区三区高清免费看看| 欧美色区777第一页| 日本久久精品电影| 一本色道久久加勒比精品| 99免费精品在线观看| 成人一区二区三区| 成人小视频在线观看| 顶级嫩模精品视频在线看| 国产麻豆91精品| 国产mv日韩mv欧美| 国产69精品久久久久毛片| 国产精品888| 成人午夜激情片| 懂色一区二区三区免费观看| 国产91精品在线观看| 成人手机在线视频| 欧美一区二区三区在线看 | 成人精品小蝌蚪| 成人动漫中文字幕| 91免费在线看| 欧美日韩国产高清一区二区 | 国产欧美日韩综合精品一区二区| 久久久久久日产精品| 国产日韩欧美精品综合| 国产精品婷婷午夜在线观看| 亚洲色大成网站www久久九九| 亚洲精品乱码久久久久久黑人| 亚洲一二三区不卡| 偷拍一区二区三区四区| 久久66热偷产精品| 国产一区二区精品在线观看| 国产不卡在线播放| 91久久精品一区二区二区| 欧美区视频在线观看| 精品国产一区二区三区不卡| 国产精品免费久久| 香蕉成人啪国产精品视频综合网| 首页国产丝袜综合| 国产精品原创巨作av| 99精品1区2区| 91精品国产高清一区二区三区| 久久一区二区三区四区| 亚洲婷婷综合色高清在线| 亚洲成人资源在线| 国产精品综合一区二区三区| 色狠狠桃花综合| 精品国产污网站| 亚洲色图一区二区三区| 蜜臀av一区二区三区| 成人免费看黄yyy456| 在线播放一区二区三区| 日本一区二区成人在线| 日韩精品1区2区3区| 成人教育av在线| 欧美一区二区三区公司| 亚洲女子a中天字幕| 麻豆一区二区三| 欧美系列亚洲系列| 中文字幕国产一区| 麻豆免费看一区二区三区| 色一区在线观看| 国产日本欧洲亚洲| 日本亚洲免费观看| 91成人看片片| 欧美国产精品一区二区三区| 天天色天天操综合| 99re视频精品| 国产目拍亚洲精品99久久精品| 五月天视频一区| 91网上在线视频| 国产亚洲婷婷免费| 极品少妇一区二区| 777色狠狠一区二区三区| 日韩电影在线观看网站| 91美女片黄在线观看| 久久久精品综合| 另类成人小视频在线| 欧美美女激情18p| 亚洲一区二区高清| 91国偷自产一区二区三区成为亚洲经典 | 精品一区二区av| 7777精品伊人久久久大香线蕉 | 91麻豆精品国产无毒不卡在线观看| 中文乱码免费一区二区| 国产麻豆91精品| 久久久综合九色合综国产精品| 青青草原综合久久大伊人精品| 欧美三级视频在线| 亚洲国产成人av好男人在线观看| 色偷偷一区二区三区| 亚洲欧美aⅴ...| 欧美性videosxxxxx|