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

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

?? usbisr.c

?? 最新的LPC214X USB驅動程序
?? C
字號:
////  $Id: usbISR.c 258 2008-10-31 01:02:51Z jcw $//  $Revision: 258 $//  $Author: jcw $//  $Date: 2008-10-30 21:02:51 -0400 (Thu, 30 Oct 2008) $//  $HeadURL: http://tinymicros.com/svn_public/arm/lpc2148_demo/trunk/usb/usbISR.c $//#include "FreeRTOS.h"#include "task.h"#include "usbISR.h"#include "usbapi.h"//////static TFnDevIntHandler *_pfnDevIntHandler = NULL;  /** Installed device interrupt handler */static TFnEPIntHandler  *_apfnEPIntHandlers [16];   /** Installed endpoint interrupt handlers */static TFnFrameHandler  *_pfnFrameHandler = NULL;   /** Installed frame interrupt handlers */#define EP2IDX(bEP) ((((bEP)&0xF)<<1)|(((bEP)&0x80)>>7))  /** convert from endpoint address to endpoint index */#define IDX2EP(idx) ((((idx)<<7)&0x80)|(((idx)>>1)&0xF))  /** convert from endpoint index to endpoint address */void usbISR (void) __attribute__ ((naked));////  Local function to wait for a device interrupt (and clear it)//static void usbWaitForDeviceInterrupt (U32 dwIntr){  while ((USB_DevIntSt & dwIntr) != dwIntr)    ;  USB_DevIntClr = dwIntr;}////  Local function to send a command to the USB protocol engine//static void usbHardwareCommand (U8 bCmd){  USB_DevIntClr = USB_DevIntClr_CDFULL | USB_DevIntClr_CCEMTY;  USB_CmdCode = 0x00000500 | (bCmd << 16);  usbWaitForDeviceInterrupt (USB_DevIntSt_CCEMTY);}////  Local function to send a command + data to the USB protocol engine//static void usbHardwareCommandWrite (U8 bCmd, U16 bData){  usbHardwareCommand (bCmd);  USB_CmdCode = 0x00000100 | (bData << 16);  usbWaitForDeviceInterrupt (USB_DevIntSt_CCEMTY);}////  Local function to send a command to the USB protocol engine and read data//static U8 usbHardwareCommandRead (U8 bCmd){  usbHardwareCommand (bCmd);  USB_CmdCode = 0x00000200 | (bCmd << 16);  usbWaitForDeviceInterrupt (USB_DevIntSt_CDFULL);  return USB_CmdData;}////  'Realizes' an endpoint, meaning that buffer space is reserved for//  it. An endpoint needs to be realised before it can be used.//    //  From experiments, it appears that a USB reset causes USBReEP to//  re-initialise to 3 (= just the control endpoints).//  However, a USB bus reset does not disturb the USBMaxPSize settings.//    static void usbHardwareEndpointRealize (int idx, U16 wMaxPSize){  USB_ReEP |= (1 << idx);  USB_EpInd = idx;  USB_MaxPSize = wMaxPSize;  usbWaitForDeviceInterrupt (USB_DevIntSt_EPRLZED);}////  Enables or disables an endpoint//static void usbHardwareEndpointEnable (int idx, BOOL fEnable){  usbHardwareCommandWrite (CMD_EP_SET_STATUS | idx, fEnable ? 0 : EP_DA);}//// Configures an endpoint and enables it//void usbHardwareEndpointConfig (U8 bEP, U16 wMaxPacketSize){  int idx;    idx = EP2IDX (bEP);  usbHardwareEndpointRealize (idx, wMaxPacketSize);  usbHardwareEndpointEnable (idx, TRUE);}////  Registers an endpoint event callback//void usbHardwareRegisterEPIntHandler (U8 bEP, TFnEPIntHandler *pfnHandler){  int idx;    idx = EP2IDX (bEP);  _apfnEPIntHandlers [idx / 2] = pfnHandler;  USB_EpIntEn |= (1 << idx);  USB_DevIntEn |= USB_DevIntEn_EPSLOW;}////  Registers an device status callback//void usbHardwareRegisterDevIntHandler (TFnDevIntHandler *pfnHandler){  _pfnDevIntHandler = pfnHandler;  USB_DevIntEn |= USB_DevIntEn_DEVSTAT;}////  Registers the frame callback//void usbHardwareRegisterFrameHandler (TFnFrameHandler *pfnHandler){  _pfnFrameHandler = pfnHandler;  USB_DevIntEn |= USB_DevIntEn_FRAME;}////  Sets the USB address.//void usbHardwareSetAddress (U8 bAddr){  usbHardwareCommandWrite (CMD_DEV_SET_ADDRESS, DEV_EN | bAddr);}////  Connects or disconnects from the USB bus//void usbHardwareConnect (BOOL fConnect){  usbHardwareCommandWrite (CMD_DEV_STATUS, fConnect ? CON : 0);}////  Enables interrupt on NAK condition//    //  For IN endpoints a NAK is generated when the host wants to read data//  from the device, but none is available in the endpoint buffer.//  For OUT endpoints a NAK is generated when the host wants to write data//  to the device, but the endpoint buffer is still full.//  //  The endpoint interrupt handlers can distinguish regular (ACK) interrupts//  from NAK interrupt by checking the bits in their bEPStatus argument.//  void usbHardwareNakIntEnable (U8 bIntBits){  usbHardwareCommandWrite (CMD_DEV_SET_MODE, bIntBits);}////  Gets the stalled property of an endpoint//BOOL usbHardwareEndpointIsStalled (U8 bEP){  int idx = EP2IDX (bEP);  return (usbHardwareCommandRead (CMD_EP_SELECT | idx) & EP_STATUS_STALLED);}////  Sets the stalled property of an endpoint//void usbHardwareEndpointStall (U8 bEP, BOOL fStall){  int idx = EP2IDX (bEP);  usbHardwareCommandWrite (CMD_EP_SET_STATUS | idx, fStall ? EP_ST : 0);}////  Writes data to an endpoint buffer//int usbHardwareEndpointWrite (U8 bEP, U8 *pbBuf, int iLen){  int idx;    idx = EP2IDX (bEP);    USB_Ctrl = USB_Ctrl_WREN | ((bEP & 0xf) << 2);  USB_TxPLen = iLen;  while (USB_Ctrl & USB_Ctrl_WREN)   {    USB_TxData = (pbBuf [3] << 24) | (pbBuf [2] << 16) | (pbBuf [1] << 8) | pbBuf [0];    pbBuf += 4;  }  USB_Ctrl = 0;  usbHardwareCommand (CMD_EP_SELECT | idx);  usbHardwareCommand (CMD_EP_VALIDATE_BUFFER);    return iLen;}////  Reads data from an endpoint buffer//int usbHardwareEndpointRead (U8 bEP, U8 *pbBuf, int iMaxLen){  int i, idx;  U32 dwData, dwLen;    idx = EP2IDX (bEP);    USB_Ctrl = USB_Ctrl_RDEN | ((bEP & 0xf) << 2);    do   {    dwLen = USB_RxPLen;  }   while ((dwLen & USB_RxPLen_PKTRDY) == 0);    if ((dwLen & USB_RxPLen_DV) == 0)    return -1;    dwLen &= USB_RxPLen_PKTLENGTH_MASK;    for (dwData = 0, i = 0; i < (int) dwLen; i++)  {    if (!(i % 4))      dwData = USB_RxData;    if (pbBuf && (i < iMaxLen))      pbBuf [i] = dwData & 0xff;    dwData >>= 8;  }  USB_Ctrl = 0;  usbHardwareCommand (CMD_EP_SELECT | idx);  usbHardwareCommand (CMD_EP_CLEAR_BUFFER);    return dwLen;}////  Sets the 'configured' state.//void usbHardwareConfigDevice (BOOL fConfigured){  usbHardwareCommandWrite (CMD_DEV_CONFIG, fConfigured ? CONF_DEVICE : 0);}//////void usbSetupInterruptHandler (void){  //  //  Set up USB interrupt, use highest priority ISR slot  //  VIC_IntSelect &= ~VIC_IntSelect_USB;  VIC_VectAddr1 = (portLONG) usbISR;  VIC_VectCntl1 = VIC_VectCntl_ENABLE | VIC_Channel_USB;  VIC_IntEnable = VIC_IntEnable_USB;}////  USB interrupt handler//static void usbISR_Handler (void){  U32 dwStatus;  U32 dwIntBit;  U32 dwEpIntSt, dwIntMask;  U8  bEPStat, bDevStat, bStat;  U16 wFrame;  int i;  portBASE_TYPE higherPriorityTaskWoken = pdFALSE;  dwStatus = USB_DevIntSt;    if (dwStatus & USB_DevIntSt_FRAME)   {    USB_DevIntClr = USB_DevIntClr_FRAME;    if (_pfnFrameHandler != NULL)    {      wFrame = usbHardwareCommandRead (CMD_DEV_READ_CUR_FRAME_NR);      _pfnFrameHandler (wFrame);    }  }  if (dwStatus & USB_DevIntSt_DEVSTAT)   {    USB_DevIntClr = USB_DevIntClr_DEVSTAT;    bDevStat = usbHardwareCommandRead (CMD_DEV_STATUS);    if (bDevStat & (CON_CH | SUS_CH | RST))     {      bStat = ((bDevStat & CON) ? DEV_STATUS_CONNECT : 0) |              ((bDevStat & SUS) ? DEV_STATUS_SUSPEND : 0) |              ((bDevStat & RST) ? DEV_STATUS_RESET   : 0);            if (_pfnDevIntHandler != NULL)        _pfnDevIntHandler (bStat);    }  }    if (dwStatus & USB_DevIntSt_EPSLOW)   {    USB_DevIntClr = USB_DevIntClr_EPSLOW;    dwIntMask = 0xffffffff;    for (i = 0; i < 32; i++)     {      dwIntBit = (1 << i);      dwIntMask <<= 1;      dwEpIntSt = USB_EpIntSt;      if (dwEpIntSt & dwIntBit)       {        USB_EpIntClr = dwIntBit;        usbWaitForDeviceInterrupt (USB_DevIntSt_CDFULL);        bEPStat = USB_CmdData;        bStat = ((bEPStat & EPSTAT_FE)  ? EP_STATUS_DATA    : 0) |                ((bEPStat & EPSTAT_ST)  ? EP_STATUS_STALLED : 0) |                ((bEPStat & EPSTAT_STP) ? EP_STATUS_SETUP   : 0) |                ((bEPStat & EPSTAT_EPN) ? EP_STATUS_NACKED  : 0) |                ((bEPStat & EPSTAT_PO)  ? EP_STATUS_ERROR   : 0);        if (_apfnEPIntHandlers [i / 2])          higherPriorityTaskWoken |= _apfnEPIntHandlers [i / 2] (IDX2EP (i), bStat);      }      if (!(dwEpIntSt & dwIntMask))        break;    }  }  	VIC_VectAddr = (unsigned portLONG) 0;  if (higherPriorityTaskWoken)    portYIELD_FROM_ISR ();}void usbISR (void){  portSAVE_CONTEXT ();  usbISR_Handler ();  portRESTORE_CONTEXT ();}////  Initializes the USB hardware//     //  This function assumes that the hardware is connected as shown in//  section 10.1 of the LPC2148 data sheet://  * P0.31 controls a switch to connect a 1.5k pull-up to D+ if low.//  * P0.23 is connected to USB VCC.//BOOL usbHardwareInit (void){  //  //  Configure P0.23 for Vbus sense, P0.31 as USB connect indicator  //  PCB_PINSEL1 = (PCB_PINSEL1 & ~PCB_PINSEL1_P023_GPIO) | PCB_PINSEL1_P023_VBUS;  GPIO0_FIODIR &= ~GPIO_IO_P23;  PCB_PINSEL1 = (PCB_PINSEL1 & ~PCB_PINSEL1_P031_GPIO) | PCB_PINSEL1_P031_CONNECT;  //  //  Enable PUSB  //  SCB_PCONP |= SCB_PCONP_PUSB;  //  //  Initialize PLL  //  USB_PLLCON = USB_PLLCON_PLLE;  USB_PLLCFG = USB_PLLCFG_DIV2 | USB_PLLCFG_MUL4;  USB_PLLFEED = USB_PLLFEED_FEED1;  USB_PLLFEED = USB_PLLFEED_FEED2;  //  //  Wait for PLL to lock up  //  while (!(USB_PLLSTAT & USB_PLLSTAT_PLOCK))    ;  USB_PLLCON = USB_PLLCON_PLLC | USB_PLLCON_PLLE;  USB_PLLFEED = USB_PLLFEED_FEED1;  USB_PLLFEED = USB_PLLFEED_FEED2;  //  //  Disable/clear all interrupts for now  //  USB_DevIntEn = USB_DevIntEn_NONE;  USB_DevIntClr = USB_DevIntClr_ALL;  USB_DevIntPri = USB_DevIntPri_NONE;  USB_EpIntEn = USB_EpIntEn_NONE;  USB_EpIntClr = USB_EpIntClr_ALL;  USB_EpIntPri = USB_EpIntPri_NONE;  //  //  By default, only ACKs generate interrupts  //  usbHardwareNakIntEnable (0);  return TRUE;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人手机电影网| 丁香网亚洲国际| 亚洲人成在线播放网站岛国| 精品久久久久久久人人人人传媒| 欧美午夜精品久久久久久孕妇| 99久久精品国产一区| www.欧美精品一二区| av福利精品导航| 色狠狠综合天天综合综合| 波多野结衣欧美| 91精品1区2区| 欧美丰满少妇xxxxx高潮对白| 欧美日高清视频| 日韩女优视频免费观看| 久久亚洲一区二区三区四区| 久久午夜老司机| 亚洲欧洲另类国产综合| 亚洲综合色区另类av| 日韩av电影免费观看高清完整版 | 日韩不卡手机在线v区| 图片区小说区区亚洲影院| 午夜久久久久久久久久一区二区| 免费成人在线网站| 国产精品白丝jk白祙喷水网站| 成人97人人超碰人人99| 欧美日韩精品一区二区三区蜜桃 | 欧美日韩国产高清一区二区| 欧美丰满美乳xxx高潮www| 久久久无码精品亚洲日韩按摩| 亚洲色图在线播放| 久久成人综合网| 91小视频免费观看| 精品久久人人做人人爰| 亚洲人吸女人奶水| 看电影不卡的网站| 欧洲另类一二三四区| 欧美电影免费观看高清完整版在线| 国产日韩欧美电影| 亚洲1区2区3区4区| 成人动漫在线一区| 日韩色视频在线观看| 1区2区3区国产精品| 激情五月激情综合网| 在线观看中文字幕不卡| 国产日韩综合av| 日韩精品视频网站| av在线不卡观看免费观看| 制服丝袜中文字幕一区| 亚洲素人一区二区| 国产成人精品一区二区三区四区 | 大尺度一区二区| 91精品久久久久久久久99蜜臂| 欧美成人精品二区三区99精品| 成人午夜av电影| 91精品国产欧美一区二区18| 国产精品毛片无遮挡高清| 毛片av中文字幕一区二区| 在线观看日韩电影| 中文字幕视频一区| 懂色av一区二区三区免费观看| 欧美一区二区三区免费视频| 亚洲电影一级黄| 欧美日韩亚洲国产综合| 亚洲三级免费观看| 91同城在线观看| 中文字幕在线不卡| www.在线欧美| 国产精品乱码人人做人人爱| 国产精品综合av一区二区国产馆| 日韩免费看的电影| 麻豆久久久久久| 51午夜精品国产| 日本不卡视频一二三区| 欧美日韩国产a| 日韩高清在线观看| 欧美一区二区三区四区在线观看| 视频一区二区不卡| 日韩精品一区二区在线观看| 美女视频黄a大片欧美| 日韩午夜在线观看视频| 蜜桃视频在线一区| 久久精品综合网| 国产不卡在线一区| 中文字幕一区二区三区在线观看| 成人免费视频播放| 亚洲日本护士毛茸茸| 欧美日韩一区二区在线观看| 天天色天天操综合| 精品国产一二三| 成人h动漫精品一区二区| 亚洲欧美视频在线观看视频| 91九色02白丝porn| 免费看欧美女人艹b| 日本一区二区视频在线| 91视频在线观看免费| 亚洲一区二区三区视频在线播放 | 日韩精品自拍偷拍| 国产精品白丝jk白祙喷水网站| 国产精品欧美综合在线| 欧美在线免费播放| 狂野欧美性猛交blacked| 国产日产欧美一区二区视频| 一本高清dvd不卡在线观看| 五月天激情小说综合| 精品美女一区二区| 色香蕉成人二区免费| 免费人成精品欧美精品| 中文字幕在线免费不卡| 日韩一区二区高清| 91污片在线观看| 韩国欧美国产一区| 一区二区成人在线观看| 久久综合九色欧美综合狠狠| 一本到高清视频免费精品| 喷水一区二区三区| 有坂深雪av一区二区精品| 欧美成人a∨高清免费观看| 91免费观看在线| 国产精品中文字幕欧美| 亚洲成人福利片| 最新久久zyz资源站| 欧美大黄免费观看| 欧美视频精品在线| av影院午夜一区| 久久精品国产亚洲一区二区三区| 亚洲人精品一区| 国产女人水真多18毛片18精品视频 | 蜜桃久久久久久久| 亚洲精品视频在线观看网站| 久久先锋影音av| 日韩三级在线免费观看| 欧美高清视频一二三区 | 欧美日韩在线播放一区| 国产91精品一区二区麻豆网站| 人人狠狠综合久久亚洲| 亚洲一区免费在线观看| 成人免费一区二区三区视频| 久久久美女毛片| 日韩视频在线一区二区| 欧美日韩免费在线视频| 色噜噜狠狠一区二区三区果冻| 丁香六月综合激情| 国产精品1区二区.| 国产伦精品一区二区三区免费| 日韩电影在线免费观看| 亚洲资源在线观看| 亚洲尤物视频在线| 亚洲成人av一区| 亚洲动漫第一页| 午夜av电影一区| 舔着乳尖日韩一区| 天堂va蜜桃一区二区三区漫画版| 亚洲国产另类精品专区| 亚洲va国产天堂va久久en| 亚洲高清视频在线| 日韩二区在线观看| 久久精品99久久久| 国产最新精品免费| 成人小视频在线| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 欧美一区二区三区色| 欧美精品一二三区| 欧美成人艳星乳罩| 久久午夜免费电影| 国产精品二三区| 一区二区日韩电影| 视频在线观看一区| 国产一区二区不卡在线| 国产成人日日夜夜| 色婷婷久久久久swag精品| 欧美日韩在线免费视频| 日韩欧美卡一卡二| 国产清纯美女被跳蛋高潮一区二区久久w| 国产日韩欧美综合一区| 亚洲精品中文字幕乱码三区| 日韩激情视频网站| 国产精品 欧美精品| 色呦呦日韩精品| 日韩一区国产二区欧美三区| 国产亚洲一区字幕| 亚洲韩国精品一区| 国产一区在线精品| 91蝌蚪porny| 欧美一卡二卡在线| 国产精品毛片无遮挡高清| 午夜精品影院在线观看| 国产九九视频一区二区三区| 91精彩视频在线观看| 精品成人免费观看| 一区二区三区四区五区视频在线观看 | 91美女视频网站| 精品乱人伦一区二区三区| 亚洲日韩欧美一区二区在线| 另类人妖一区二区av| 91美女蜜桃在线| 久久久不卡网国产精品二区| 亚洲国产精品久久久久婷婷884| 国产一区在线视频| 51精品久久久久久久蜜臀| 亚洲三级电影全部在线观看高清|