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

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

?? mscuser.c

?? 本代碼實現了USB slave驅動
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*----------------------------------------------------------------------------
 *      U S B  -  K e r n e l
 *----------------------------------------------------------------------------
 *      Name:    MSCUSER.C
 *      Purpose: Mass Storage Class Custom User Module
 *      Version: V1.10
 *----------------------------------------------------------------------------
 *      This software is supplied "AS IS" without any warranties, express,
 *      implied or statutory, including but not limited to the implied
 *      warranties of fitness for purpose, satisfactory quality and
 *      noninfringement. Keil extends you a royalty-free right to reproduce
 *      and distribute executable files created using this software for use
 *      on Philips LPC2xxx microcontroller devices only. Nothing else gives
 *      you the right to use this software.
 *
 *      Copyright (c) 2005-2006 Keil Software.
 *---------------------------------------------------------------------------*/

#include <LPC214X.H>                        /* LPC214x definitions */

#include "type.h"

#include "usb.h"
#include "msc.h"
#include "usbcfg.h"
#include "usbhw.h"
#include "usbcore.h"
#include "mscuser.h"

#include "memory.h"


BYTE  Memory[MSC_MemorySize] __at MSC_MemoryStart;   /* MSC RAM */

BOOL  MemOK;                   /* Memory OK */

DWORD Offset;                  /* R/W Offset */
DWORD Length;                  /* R/W Length */

BYTE  BulkStage;               /* Bulk Stage */

BYTE  BulkBuf[MSC_MAX_PACKET]; /* Bulk In/Out Buffer */
BYTE  BulkLen;                 /* Bulk In/Out Length */

MSC_CBW CBW;                   /* Command Block Wrapper */
MSC_CSW CSW;                   /* Command Status Wrapper */


/*
 *  MSC Mass Storage Reset Request Callback
 *   Called automatically on Mass Storage Reset Request
 *    Parameters:      None (global SetupPacket and EP0Buf)
 *    Return Value:    TRUE - Success, FALSE - Error
 */

BOOL MSC_Reset (void) {

  IOCLR1 = (LED_RD | LED_WR);  /* Turn Off R/W LED */
  BulkStage = MSC_BS_CBW;
  return (TRUE);
}


/*
 *  MSC Get Max LUN Request Callback
 *   Called automatically on Get Max LUN Request
 *    Parameters:      None (global SetupPacket and EP0Buf)
 *    Return Value:    TRUE - Success, FALSE - Error
 */

BOOL MSC_GetMaxLUN (void) {

  EP0Buf[0] = 0;               /* No LUN associated with this device */
  return (TRUE);
}


/*
 *  MSC Memory Read Callback
 *   Called automatically on Memory Read Event
 *    Parameters:      None (global variables)
 *    Return Value:    None
 */

void MSC_MemoryRead (void) {
  DWORD n;

  if (Length > MSC_MAX_PACKET) {
    n = MSC_MAX_PACKET;
  } else {
    n = Length;
  }

  if ((Offset + n) > MSC_MemorySize) {
    n = MSC_MemorySize - Offset;
    BulkStage = MSC_BS_DATA_IN_LAST_STALL;
  }

  USB_WriteEP(MSC_EP_IN, (BYTE *)(MSC_MemoryStart + Offset), n);
  Offset += n;
  Length -= n;

  CSW.dDataResidue -= n;

  if (Length == 0) {
    BulkStage = MSC_BS_DATA_IN_LAST;
  }

  if (BulkStage != MSC_BS_DATA_IN) {
    IOCLR1 = LED_RD;            /* Turn Off Read LED */
    CSW.bStatus = CSW_CMD_PASSED;
  }
}


/*
 *  MSC Memory Write Callback
 *   Called automatically on Memory Write Event
 *    Parameters:      None (global variables)
 *    Return Value:    None
 */

void MSC_MemoryWrite (void) {
  DWORD n;

  if ((Offset + BulkLen) > MSC_MemorySize) {
    BulkLen = MSC_MemorySize - Offset;
    BulkStage = MSC_BS_CSW;
    USB_SetStallEP(MSC_EP_OUT);
  }

  for (n = 0; n < BulkLen; n++) {
    Memory[Offset + n] = BulkBuf[n];
  }

  Offset += BulkLen;
  Length -= BulkLen;

  CSW.dDataResidue -= BulkLen;

  if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {
    IOCLR1 = LED_WR;            /* Turn Off Write LED */
    CSW.bStatus = CSW_CMD_PASSED;
    MSC_SetCSW();
  }
}


/*
 *  MSC Memory Verify Callback
 *   Called automatically on Memory Verify Event
 *    Parameters:      None (global variables)
 *    Return Value:    None
 */

void MSC_MemoryVerify (void) {
  DWORD n;

  if ((Offset + BulkLen) > MSC_MemorySize) {
    BulkLen = MSC_MemorySize - Offset;
    BulkStage = MSC_BS_CSW;
    USB_SetStallEP(MSC_EP_OUT);
  }

  for (n = 0; n < BulkLen; n++) {
    if (Memory[Offset + n] != BulkBuf[n]) {
      MemOK = FALSE;
      break;
    }
  }

  Offset += BulkLen;
  Length -= BulkLen;

  CSW.dDataResidue -= BulkLen;

  if ((Length == 0) || (BulkStage == MSC_BS_CSW)) {
    CSW.bStatus = (MemOK) ? CSW_CMD_PASSED : CSW_CMD_FAILED;
    MSC_SetCSW();
  }
}


/*
 *  MSC SCSI Read/Write Setup Callback
 *    Parameters:      None (global variables)
 *    Return Value:    TRUE - Success, FALSE - Error
 */

BOOL MSC_RWSetup (void) {
  DWORD n;

  /* Logical Block Address of First Block */
  n = (CBW.CB[2] << 24) |
      (CBW.CB[3] << 16) |
      (CBW.CB[4] <<  8) |
      (CBW.CB[5] <<  0);

  Offset = n * MSC_BlockSize;

  /* Number of Blocks to transfer */
  n = (CBW.CB[7] <<  8) |
      (CBW.CB[8] <<  0);

  Length = n * MSC_BlockSize;

  if (CBW.dDataLength != Length) {
    USB_SetStallEP(MSC_EP_IN);
    USB_SetStallEP(MSC_EP_OUT);
    CSW.bStatus = CSW_PHASE_ERROR;
    MSC_SetCSW();
    return (FALSE);
  }

  return (TRUE);
}


/*
 *  Check Data IN Format
 *    Parameters:      None (global variables)
 *    Return Value:    TRUE - Success, FALSE - Error
 */

BOOL DataInFormat (void) {

  if (CBW.dDataLength == 0) {
    CSW.bStatus = CSW_PHASE_ERROR;
    MSC_SetCSW();
    return (FALSE);
  }
  if ((CBW.bmFlags & 0x80) == 0) {
    USB_SetStallEP(MSC_EP_OUT);
    CSW.bStatus = CSW_PHASE_ERROR;
    MSC_SetCSW();
    return (FALSE);
  }
  return (TRUE);
}


/*
 *  Perform Data IN Transfer
 *    Parameters:      None (global variables)
 *    Return Value:    TRUE - Success, FALSE - Error
 */

void DataInTransfer (void) {

  if (BulkLen > CBW.dDataLength) {
    BulkLen = CBW.dDataLength;
  }

  USB_WriteEP(MSC_EP_IN, BulkBuf, BulkLen);
  BulkStage = MSC_BS_DATA_IN_LAST;

  CSW.dDataResidue -= BulkLen;
  CSW.bStatus = CSW_CMD_PASSED;
}


/*
 *  MSC SCSI Test Unit Ready Callback
 *    Parameters:      None (global variables)
 *    Return Value:    None
 */

void MSC_TestUnitReady (void) {

  if (CBW.dDataLength != 0) {
    if ((CBW.bmFlags & 0x80) != 0) {
      USB_SetStallEP(MSC_EP_IN);
    } else {
      USB_SetStallEP(MSC_EP_OUT);
    }
  }

  CSW.bStatus = CSW_CMD_PASSED;
  MSC_SetCSW();
}


/*
 *  MSC SCSI Request Sense Callback
 *    Parameters:      None (global variables)
 *    Return Value:    None
 */

void MSC_RequestSense (void) {

  if (!DataInFormat()) return;

  BulkBuf[ 0] = 0x70;          /* Response Code */
  BulkBuf[ 1] = 0x00;
  BulkBuf[ 2] = 0x02;          /* Sense Key */
  BulkBuf[ 3] = 0x00;
  BulkBuf[ 4] = 0x00;
  BulkBuf[ 5] = 0x00;
  BulkBuf[ 6] = 0x00;
  BulkBuf[ 7] = 0x0A;          /* Additional Length */
  BulkBuf[ 8] = 0x00;
  BulkBuf[ 9] = 0x00;
  BulkBuf[10] = 0x00;
  BulkBuf[11] = 0x00;
  BulkBuf[12] = 0x30;          /* ASC */
  BulkBuf[13] = 0x01;          /* ASCQ */
  BulkBuf[14] = 0x00;
  BulkBuf[15] = 0x00;
  BulkBuf[16] = 0x00;
  BulkBuf[17] = 0x00;

  BulkLen = 18;
  DataInTransfer();
}


/*
 *  MSC SCSI Inquiry Callback
 *    Parameters:      None (global variables)
 *    Return Value:    None
 */

void MSC_Inquiry (void) {

  if (!DataInFormat()) return;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕国产一区二区| 九色综合国产一区二区三区| 国产精品国产三级国产普通话三级| 精品日本一线二线三线不卡| 日韩午夜精品电影| 欧美一区二区视频在线观看2020 | 国产一区二区三区国产| 极品少妇xxxx精品少妇偷拍| 国产一区二区三区在线观看免费| 精品在线播放免费| 国产精品一区久久久久| 国产成人av电影在线| av中文字幕不卡| 色婷婷综合久久久久中文一区二区 | 毛片一区二区三区| 狠狠狠色丁香婷婷综合久久五月| 国产一区二区三区在线观看精品 | 欧美在线观看一区| 欧美久久久久免费| 26uuu精品一区二区| 中文字幕欧美国产| 亚洲综合色噜噜狠狠| 五月天中文字幕一区二区| 蜜桃一区二区三区在线| 国产九色sp调教91| 91视频免费观看| 欧美疯狂做受xxxx富婆| 久久新电视剧免费观看| 亚洲色图欧美在线| 婷婷中文字幕综合| 国产成人精品午夜视频免费| 91成人看片片| 欧美成人官网二区| 国产精品久久久久久久久搜平片 | 国产综合成人久久大片91| 粗大黑人巨茎大战欧美成人| 欧美综合久久久| 欧美大白屁股肥臀xxxxxx| 久久嫩草精品久久久精品一| 国产精品色眯眯| 图片区日韩欧美亚洲| 国产一区二区三区精品欧美日韩一区二区三区 | 99久久久国产精品| 欧美一区二区三级| 国产精品嫩草影院av蜜臀| 香蕉影视欧美成人| 国产不卡视频一区| 欧美中文字幕不卡| 国产目拍亚洲精品99久久精品| 亚洲图片欧美视频| 国产美女在线观看一区| 欧美在线短视频| 久久久午夜电影| 午夜精品福利久久久| 国产成人在线影院| 7777精品伊人久久久大香线蕉的| 中文字幕av不卡| 久久国产精品99久久人人澡| 91原创在线视频| 精品99一区二区三区| 亚洲成av人片在线| 99久久精品免费看| 久久人人97超碰com| 水蜜桃久久夜色精品一区的特点| 成人国产精品视频| 精品国产免费一区二区三区香蕉| 一个色综合网站| 豆国产96在线|亚洲| 日韩欧美激情四射| 亚洲国产精品久久人人爱蜜臀| 成人午夜av电影| 26uuu精品一区二区三区四区在线| 亚洲国产三级在线| 色妹子一区二区| 国产精品全国免费观看高清| 久久精品国产亚洲a| 欧美日韩国产色站一区二区三区| 中文字幕日韩av资源站| 国产在线一区观看| 91精品国产综合久久久久久漫画| 一区二区在线观看不卡| 国产成人鲁色资源国产91色综| 日韩午夜激情av| 手机精品视频在线观看| 欧美在线一二三| 依依成人精品视频| 91免费观看视频| 成人欧美一区二区三区在线播放| 国产一区二区三区在线观看免费| 欧美一二三四区在线| 日韩高清不卡一区二区三区| 欧美色老头old∨ideo| 亚洲激情在线播放| 91行情网站电视在线观看高清版| 国产精品的网站| 99国产一区二区三精品乱码| 国产精品福利影院| 99精品热视频| 综合激情成人伊人| 色女孩综合影院| 亚洲国产日韩a在线播放性色| 91久久精品一区二区二区| 亚洲精品免费电影| 91国产丝袜在线播放| 亚洲女同女同女同女同女同69| 91网址在线看| 一区二区三区在线播| 欧美日韩午夜在线| 香蕉久久夜色精品国产使用方法 | 97精品久久久久中文字幕| 国产精品欧美一区二区三区| 成人动漫中文字幕| **欧美大码日韩| 欧洲人成人精品| 丝袜脚交一区二区| 精品国产一区二区三区久久影院| 国内不卡的二区三区中文字幕| 日韩视频一区二区三区在线播放 | 国产传媒一区在线| 国产午夜亚洲精品理论片色戒 | 中文字幕乱码亚洲精品一区| 成人一区二区三区视频| 亚洲天堂福利av| 欧美日韩一卡二卡三卡| 午夜电影一区二区三区| 精品少妇一区二区三区在线播放| 欧美一区二区三区影视| 欧美视频一区二区在线观看| 风间由美一区二区三区在线观看 | 欧美精选一区二区| www.色精品| 色综合欧美在线| 成人综合婷婷国产精品久久| 精品无码三级在线观看视频| 久久99精品国产麻豆婷婷| 亚洲一区二区成人在线观看| 久久久精品天堂| 777色狠狠一区二区三区| 日本乱人伦aⅴ精品| 欧美理论电影在线| 亚洲男同性视频| 99热99精品| 欧美亚洲国产bt| 欧美精品一区在线观看| 欧美一区二区观看视频| 6080午夜不卡| 5858s免费视频成人| 日韩一级二级三级精品视频| 日韩美女在线视频| 91麻豆精品国产| 国产欧美一区二区三区网站| 欧美成人aa大片| 久久久亚洲国产美女国产盗摄 | 成人福利电影精品一区二区在线观看| 日本欧美肥老太交大片| 久久99热99| 国内精品伊人久久久久av影院 | 欧美国产一区在线| 中文字幕高清一区| 日韩美女视频一区二区| 亚洲成人免费av| 激情六月婷婷久久| av一本久道久久综合久久鬼色| 91久久精品网| 国产精品妹子av| 美女高潮久久久| 视频一区视频二区中文| 奇米影视7777精品一区二区| 一区二区三区中文在线观看| 丝袜a∨在线一区二区三区不卡| 精品一区免费av| 精品国产乱码久久久久久蜜臀| 99精品国产91久久久久久 | 亚洲一区二区三区在线播放| 91精品在线一区二区| 99re66热这里只有精品3直播 | 亚洲大型综合色站| 中文字幕一区av| 久久综合久久综合九色| 亚洲黄色av一区| 久久99热狠狠色一区二区| 在线一区二区三区四区五区| 欧美精品一区二区三区四区| 亚洲欧美电影院| 极品少妇xxxx偷拍精品少妇| 欧美午夜精品久久久久久孕妇 | 国产一区二区三区四区五区美女| 国产精品无码永久免费888| 欧美一区二区三区电影| 在线一区二区视频| 91福利区一区二区三区| 99视频精品在线| 99久久精品情趣| 成人高清视频免费观看| 蜜桃视频一区二区| 亚洲一级在线观看| 国产iv一区二区三区| √…a在线天堂一区| 久久精品一区二区三区av | 欧美一区二区三区在线观看 |