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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? usbhw.c

?? USBHID Device Driver sample code
?? C
字號(hào):
/*----------------------------------------------------------------------------
 *      U S B  -  K e r n e l
 *----------------------------------------------------------------------------
 *      Name:    USBHW.C
 *      Purpose: USB Hardware Layer Module for ST STR75x
 *      Version: V1.10
 *----------------------------------------------------------------------------
 *      This file is part of the uVision/ARM development tools.
 *      This software may only be used under the terms of a valid, current,
 *      end user licence from KEIL for a compatible version of KEIL software
 *      development tools. Nothing else gives you the right to use it.
 *
 *      Copyright (c) 2005-2007 Keil Software.
 *---------------------------------------------------------------------------*/

/* DMA              is not supported              */
/* Double Buffering is not supported              */

#include <75x_lib.H>                    /* STR750 definitions                 */

#include "type.h"

#include "usb.h"
#include "usbcfg.h"
#include "usbreg.h"
#include "usbhw.h"
#include "usbuser.h"


#define EP_BUF_ADDR     (16*USB_EP_NUM)     /* Endpoint Buffer Start Address */

/* Pointer to Endpoint Buffer Descriptors */
EP_BUF_DSCR *pBUF_DSCR = (EP_BUF_DSCR *)USB_PMA_ADDR;

/* Endpoint Free Buffer Address */
WORD FreeBufAddr;


/*
 *  Reset Endpoint
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */

void EP_Reset (DWORD EPNum) {
  DWORD num, val;

  num = EPNum & 0x0F;
  val = EPxREG(num);
  if (EPNum & 0x80) {                       /* IN Endpoint */
    EPxREG(num) = val & (EP_MASK | EP_DTOG_TX);
  } else {                                  /* OUT Endpoint */
    EPxREG(num) = val & (EP_MASK | EP_DTOG_RX);
  }
}


/*
 *  Set Endpoint Status
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *                     stat: New Status
 *    Return Value:    None
 */

void EP_Status (DWORD EPNum, DWORD stat) {
  DWORD num, val;

  num = EPNum & 0x0F;
  val = EPxREG(num);
  if (EPNum & 0x80) {                       /* IN Endpoint */
    EPxREG(num) = (val ^ (stat & EP_STAT_TX)) & (EP_MASK | EP_STAT_TX);
  } else {                                  /* OUT Endpoint */
    EPxREG(num) = (val ^ (stat & EP_STAT_RX)) & (EP_MASK | EP_STAT_RX);
  }
}


/*
 *  USB Initialize Function
 *   Called by the User to initialize USB
 *    Return Value:    None
 */

void USB_Init (void) {

  /* Control USB connecting via SW */
  GPIO2->PM  &= ~0x8000;                               /* enable bit 15               */
  GPIO2->PC0 |=  0x8000;                               /* P2.15  output push-pull     */
  GPIO2->PC1 &= ~0x8000;
  GPIO2->PC2 |=  0x8000;                     
  GPIO2->PD &= ~0x8000;                                /* set pin 2.15  to low        */
  GPIO2->PM  |=  0x8000;                               /* mask   bit 15               */

  /* Setup USB Interrupt */
  EIC->IVR  = (u32)USB_ISR;							   /* vector address base         */
  EIC->SIRn[USB_LP_IRQChannel] = ((u32)USB_ISR << 16); /* vector address offset       */
  EIC->SIRn[USB_LP_IRQChannel] |= (15 & 0x0F);         /* Setup highest priority (15) */
  EIC->IER |= (1 << USB_LP_IRQChannel);                /* Enable USB_LP interupt      */

  EIC->ICR |= 0x00000001;                              /* Global IRQ enable           */

}


/*
 *  USB Connect Function
 *   Called by the User to Connect/Disconnect USB
 *    Parameters:      con:   Connect/Disconnect
 *    Return Value:    None
 */

void USB_Connect (BOOL con) {

  CNTR = CNTR_FRES;                         /* Force USB Reset */
  ISTR = 0;                                 /* Clear Interrupt Status */
  if (con) {
    CNTR = CNTR_RESETM;                     /* USB Reset Interrupt Mask */
  } else {
    CNTR = CNTR_FRES | CNTR_PDWN;           /* Switch Off USB Device */
  }
}


/*
 *  USB Reset Function
 *   Called automatically on USB Reset
 *    Return Value:    None
 */

void USB_Reset (void) {

  ISTR = 0;                                 /* Clear Interrupt Status */

  CNTR = CNTR_CTRM | CNTR_RESETM |
         (USB_SUSPEND_EVENT ? CNTR_SUSPM : 0) |
         (USB_WAKEUP_EVENT  ? CNTR_WKUPM : 0) |
         (USB_ERROR_EVENT   ? CNTR_ERRM  : 0) |
         (USB_ERROR_EVENT   ? CNTR_DOVRM : 0) |
         (USB_SOF_EVENT     ? CNTR_SOFM  : 0) |
         (USB_SOF_EVENT     ? CNTR_ESOFM : 0);

  FreeBufAddr = EP_BUF_ADDR;

  /* Setup Control Endpoint 0 */
  pBUF_DSCR->ADDR_TX = FreeBufAddr;
  FreeBufAddr += USB_MAX_PACKET0;
  pBUF_DSCR->ADDR_RX = FreeBufAddr;
  FreeBufAddr += USB_MAX_PACKET0;
  if (USB_MAX_PACKET0 > 62) {
    pBUF_DSCR->COUNT_RX = ((USB_MAX_PACKET0 << 5) - 1) | 0x8000;
  } else {
    pBUF_DSCR->COUNT_RX =   USB_MAX_PACKET0 << 9;
  }
  EPxREG(0) = EP_CONTROL | EP_RX_VALID;

  DADDR = DADDR_EF | 0;                     /* Enable USB Default Address */
}


/*
 *  USB Suspend Function
 *   Called automatically on USB Suspend
 *    Return Value:    None
 */

void USB_Suspend (void) {
  CNTR |= CNTR_FSUSP;                       /* Force Suspend */
  CNTR |= CNTR_LPMODE;                      /* Low Power Mode */
}


/*
 *  USB Resume Function
 *   Called automatically on USB Resume
 *    Return Value:    None
 */

void USB_Resume (void) {
  /* Performed by Hardware */
}


/*
 *  USB Remote Wakeup Function
 *   Called automatically on USB Remote Wakeup
 *    Return Value:    None
 */

void USB_WakeUp (void) {
  CNTR &= ~CNTR_FSUSP;                      /* Clear Suspend */
}


/*
 *  USB Remote Wakeup Configuration Function
 *    Parameters:      cfg:   Enable/Disable
 *    Return Value:    None
 */

void USB_WakeUpCfg (BOOL cfg) {
  /* Not needed */
}


/*
 *  USB Set Address Function
 *    Parameters:      adr:   USB Address
 *    Return Value:    None
 */

void USB_SetAddress (DWORD adr) {
  DADDR = DADDR_EF | adr;
}


/*
 *  USB Configure Function
 *    Parameters:      cfg:   Configure/Deconfigure
 *    Return Value:    None
 */

void USB_Configure (BOOL cfg) {
  cfg = cfg;
}


/*
 *  Configure USB Endpoint according to Descriptor
 *    Parameters:      pEPD:  Pointer to Endpoint Descriptor
 *    Return Value:    None
 */

void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD) {
  DWORD num, val;

  num = pEPD->bEndpointAddress & 0x0F;

  val = pEPD->wMaxPacketSize;
  if (pEPD->bEndpointAddress & USB_ENDPOINT_DIRECTION_MASK) {
    (pBUF_DSCR + num)->ADDR_TX = FreeBufAddr;
    val = (val + 1) & ~1;
  } else {
    (pBUF_DSCR + num)->ADDR_RX = FreeBufAddr;
    if (val > 62) {
      val = (val + 31) & ~31;
      (pBUF_DSCR + num)->COUNT_RX = ((val << 5) - 1) | 0x8000;
    } else {
      val = (val + 1)  & ~1;
      (pBUF_DSCR + num)->COUNT_RX =   val << 9;
    }
  }
  FreeBufAddr += val;

  switch (pEPD->bmAttributes & USB_ENDPOINT_TYPE_MASK) {
    case USB_ENDPOINT_TYPE_CONTROL:
      val = EP_CONTROL;
      break;
    case USB_ENDPOINT_TYPE_ISOCHRONOUS:
      val = EP_ISOCHRONOUS;
      break;
    case USB_ENDPOINT_TYPE_BULK:
      val = EP_BULK;
      if (USB_DBL_BUF_EP & (1 << num)) {
        val |= EP_KIND;
      }
      break;
    case USB_ENDPOINT_TYPE_INTERRUPT:
      val = EP_INTERRUPT;
      break;
  }
  val |= num;
  EPxREG(num) = val;
}


/*
 *  Set Direction for USB Control Endpoint
 *    Parameters:      dir:   Out (dir == 0), In (dir <> 0)
 *    Return Value:    None
 */

void USB_DirCtrlEP (DWORD dir) {
  /* Not needed */
}


/*
 *  Enable USB Endpoint
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */

void USB_EnableEP (DWORD EPNum) {
  EP_Status(EPNum, EP_TX_VALID | EP_RX_VALID);
}


/*
 *  Disable USB Endpoint
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */

void USB_DisableEP (DWORD EPNum) {
  EP_Status(EPNum, EP_TX_DIS | EP_RX_DIS);
}


/*
 *  Reset USB Endpoint
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */

void USB_ResetEP (DWORD EPNum) {
  EP_Reset(EPNum);
}


/*
 *  Set Stall for USB Endpoint
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */

void USB_SetStallEP (DWORD EPNum) {
  EP_Status(EPNum, EP_TX_STALL | EP_RX_STALL);
}


/*
 *  Clear Stall for USB Endpoint
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *    Return Value:    None
 */

void USB_ClrStallEP (DWORD EPNum) {
  EP_Status(EPNum, EP_TX_VALID | EP_RX_VALID);
}


/*
 *  Read USB Endpoint Data
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *                     pData: Pointer to Data Buffer
 *    Return Value:    Number of bytes read
 */

DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
  DWORD num, cnt, *pv, n;

  num = EPNum & 0x0F;

  pv  = (DWORD *)(USB_PMA_ADDR + 2*((pBUF_DSCR + num)->ADDR_RX));
  cnt = (pBUF_DSCR + num)->COUNT_RX & EP_COUNT_MASK;
  for (n = 0; n < (cnt + 1) / 2; n++) {
    *((__packed WORD *)pData) = *pv++;
    pData += 2;
  }
  EP_Status(EPNum, EP_RX_VALID);

  return (cnt);
}


/*
 *  Write USB Endpoint Data
 *    Parameters:      EPNum: Endpoint Number
 *                       EPNum.0..3: Address
 *                       EPNum.7:    Dir
 *                     pData: Pointer to Data Buffer
 *                     cnt:   Number of bytes to write
 *    Return Value:    Number of bytes written
 */

DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
  DWORD num, *pv, n;

  num = EPNum & 0x0F;

  pv  = (DWORD *)(USB_PMA_ADDR + 2*((pBUF_DSCR + num)->ADDR_TX));
  for (n = 0; n < (cnt + 1) / 2; n++) {
    *pv++ = *((__packed WORD *)pData);
    pData += 2;
  }
  (pBUF_DSCR + num)->COUNT_TX = cnt;
  EP_Status(EPNum, EP_TX_VALID);

  return (cnt);
}


/*
 *  Get USB Last Frame Number
 *    Parameters:      None
 *    Return Value:    Frame Number
 */

DWORD USB_GetFrame (void) {
  return (FNR & FNR_FN);
}


/*
 *  USB Interrupt Service Routine
 */

void USB_ISR (void) __irq {
  DWORD istr, num, val;

  istr = ISTR;

  /* USB Reset Request */
  if (istr & ISTR_RESET) {
    USB_Reset();
#if USB_RESET_EVENT
    USB_Reset_Event();
#endif
    ISTR = ~ISTR_RESET;
  }

  /* USB Suspend Request */
  if (istr & ISTR_SUSP) {
    USB_Suspend();
#if USB_SUSPEND_EVENT
    USB_Suspend_Event();
#endif
    ISTR = ~ISTR_SUSP;
  }

  /* USB Wakeup */
  if (istr & ISTR_WKUP) {
    USB_WakeUp();
#if USB_WAKEUP_EVENT
    USB_WakeUp_Event();
#endif
    ISTR = ~ISTR_WKUP;
  }

  /* Start of Frame */
  if (istr & ISTR_SOF) {
#if USB_SOF_EVENT
    USB_SOF_Event();
#endif
    ISTR = ~ISTR_SOF;
  }

#if USB_ERROR_EVENT

  /* DMA Over/underrun */
  if (istr & ISTR_DOVR) {
    USB_Error_Event(1);
    ISTR = ~ISTR_DOVR;
  }

  /* Error: No Answer, CRC Error, Bit Stuff Error, Frame Format Error */
  if (istr & ISTR_ERR) {
    USB_Error_Event(0);
    ISTR = ~ISTR_ERR;
  }

#endif

  /* Endpoint Interrupts */
  while ((istr = ISTR) & ISTR_CTR) {
    ISTR = ~ISTR_CTR;

    num = istr & ISTR_EP_ID;

    val = EPxREG(num);
    if (val & EP_CTR_RX) {
      EPxREG(num) = val & ~EP_CTR_RX & EP_MASK;
      if (USB_P_EP[num]) {
        if (val & EP_SETUP) {
          USB_P_EP[num](USB_EVT_SETUP);
        } else {
          USB_P_EP[num](USB_EVT_OUT);
        }
      }
    }
    if (val & EP_CTR_TX) {
      EPxREG(num) = val & ~EP_CTR_TX & EP_MASK;
      if (USB_P_EP[num]) {
        USB_P_EP[num](USB_EVT_IN);
      }
    }
  }

  EIC->IPR = 1 << USB_LP_IRQChannel;                    /* Acknowledge Interrupt */
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美在线一区二区| 久久精品夜色噜噜亚洲a∨| 色综合色狠狠综合色| 国产高清亚洲一区| 国产精品一区一区三区| 国产在线一区观看| 黄色小说综合网站| 国产一区二区在线电影| 精品无人码麻豆乱码1区2区 | 国产真实精品久久二三区| 久久精品国产精品亚洲综合| 秋霞电影一区二区| 精品一二三四在线| 国产乱码精品一品二品| 懂色中文一区二区在线播放| 国产精品一区不卡| 成人黄色片在线观看| 色综合天天综合网国产成人综合天| 91美女在线看| 欧美亚洲禁片免费| 91精品国产综合久久蜜臀| 在线不卡免费av| 精品国产一区二区三区久久影院| 欧美精品一区二区久久久| 国产亚洲午夜高清国产拍精品 | 亚洲成av人片在www色猫咪| 亚洲一区二区三区中文字幕在线| 香蕉av福利精品导航| 奇米色777欧美一区二区| 久久精品国产99久久6| 国产精品一区二区久激情瑜伽| eeuss鲁片一区二区三区| 色久综合一二码| 欧美一级淫片007| 久久久综合视频| 自拍偷拍亚洲欧美日韩| 午夜电影网一区| 国产一区二区久久| 91麻豆免费观看| 日韩一区二区在线免费观看| 久久午夜老司机| 亚洲综合久久久久| 精品亚洲免费视频| 91视视频在线直接观看在线看网页在线看| 欧美日韩精品系列| 久久精品视频免费| 亚洲综合男人的天堂| 久草在线在线精品观看| 97精品久久久久中文字幕| 欧美日韩成人在线一区| 久久久久久久国产精品影院| 亚洲精选视频在线| 国产一区在线视频| 欧美专区日韩专区| 中文字幕av一区二区三区| 婷婷激情综合网| 99久久777色| 欧美成人高清电影在线| 亚洲美女免费在线| 国产九九视频一区二区三区| 欧美在线高清视频| 国产亚洲一二三区| 日日夜夜一区二区| 色综合中文字幕国产 | av在线不卡观看免费观看| 欧美日韩国产系列| 国产精品成人免费| 精品中文字幕一区二区小辣椒| 91网上在线视频| 久久久一区二区| 偷偷要91色婷婷| 91国内精品野花午夜精品 | 偷拍自拍另类欧美| 91蝌蚪porny九色| 国产色婷婷亚洲99精品小说| 日韩二区三区在线观看| 日本精品一区二区三区四区的功能| 久久久久久久久蜜桃| 青青草原综合久久大伊人精品| 色欧美片视频在线观看在线视频| 久久综合九色综合97婷婷女人| 婷婷综合久久一区二区三区| 97精品国产97久久久久久久久久久久 | 国产风韵犹存在线视精品| 717成人午夜免费福利电影| 一区二区三区免费观看| 成人久久18免费网站麻豆 | 中文字幕av资源一区| 韩国女主播一区二区三区| 欧美日韩视频在线观看一区二区三区 | 国产精品麻豆视频| 国产精品一二二区| 欧美成人性战久久| 久热成人在线视频| 日韩三级av在线播放| 午夜国产精品一区| 欧美精品自拍偷拍动漫精品| 一区二区三区美女视频| 一本色道久久综合狠狠躁的推荐| 中文在线一区二区| 成人黄色小视频| 国产精品国产精品国产专区不蜜| 成人福利视频网站| 成人欧美一区二区三区白人| 成人国产免费视频| 国产精品成人免费| 91色porny在线视频| 亚洲三级电影网站| 色婷婷久久一区二区三区麻豆| 国产精品久久精品日日| voyeur盗摄精品| 亚洲精品日韩综合观看成人91| 91视频在线观看| 亚洲午夜久久久| 在线不卡欧美精品一区二区三区| 日韩国产高清在线| 精品免费一区二区三区| 极品尤物av久久免费看| 国产午夜精品福利| 不卡电影免费在线播放一区| 亚洲精品视频在线| 欧美电影一区二区| 久久激情五月婷婷| 国产精品天天看| 色综合久久天天综合网| 亚洲欧美一区二区三区久本道91| 色欧美乱欧美15图片| 亚洲一级电影视频| 91精品国产综合久久久蜜臀图片 | 欧美一级黄色大片| 国模套图日韩精品一区二区| 日本一区二区三区国色天香| 色综合欧美在线视频区| 日本人妖一区二区| 国产嫩草影院久久久久| 91亚洲精品一区二区乱码| 亚洲成年人网站在线观看| 亚洲精品一线二线三线| 99久久精品国产导航| 天堂精品中文字幕在线| 精品国产一区二区在线观看| 99久久er热在这里只有精品15| 亚洲超碰精品一区二区| 精品1区2区在线观看| 99精品桃花视频在线观看| 婷婷综合在线观看| 国产精品免费av| 欧美日本一道本| 成人性视频网站| 午夜精品一区二区三区免费视频| 精品国产乱子伦一区| 色综合久久久久久久| 美女在线观看视频一区二区| 国产精品三级久久久久三级| 欧美三电影在线| 粉嫩av一区二区三区在线播放| 樱花草国产18久久久久| 精品国产欧美一区二区| 色婷婷综合久久久中文字幕| 久久99国产精品尤物| 亚洲一区二区三区在线播放| 久久久99精品免费观看不卡| 欧美视频在线播放| 国产成人鲁色资源国产91色综| 亚洲第一av色| 国产精品久久久久四虎| 日韩欧美一级二级三级 | 亚洲色图一区二区三区| 欧美v日韩v国产v| 欧美伊人久久大香线蕉综合69| 国产精品99久久久久久久女警 | 在线中文字幕不卡| 国产不卡视频一区二区三区| 日韩成人精品在线观看| 中文字幕在线一区免费| 精品成人私密视频| 欧美老女人在线| 一本一道久久a久久精品 | 欧美成人一区二区| 欧洲精品视频在线观看| gogogo免费视频观看亚洲一| 国产美女娇喘av呻吟久久| 日本女优在线视频一区二区| 亚洲精品国产品国语在线app| 日本一区二区成人| 精品国产91乱码一区二区三区| 欧美日韩mp4| 日本韩国精品在线| 99久久精品免费看国产| 成人中文字幕电影| 国产高清不卡一区二区| 国产一区二区中文字幕| 久久福利视频一区二区| 琪琪久久久久日韩精品| 亚洲国产精品久久久男人的天堂| 一区二区三区在线播| 一色桃子久久精品亚洲| 国产精品欧美极品| 中文字幕av不卡| 国产女人18毛片水真多成人如厕|