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

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

?? upsd3400_usb_app.c

?? upsd34xx系列單片機keil環(huán)境中的開發(fā)例程
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*------------------------------------------------------------------------------
upsd3400_usb_app.c

Version:
March 22, 2005 - Version 1.0 - Initial Release.

Description:  USB Mass Storage Class application module. 


Copyright (c) 2005 STMicroelectronics Inc.

This example demo code is provided as is and has no warranty,
implied or otherwise.  You are free to use/modify any of the provided
code at your own risk in your applications with the expressed limitation
of liability (see below) so long as your product using the code contains
at least one uPSD product (device).

LIMITATION OF LIABILITY:   NEITHER STMicroelectronics NOR ITS VENDORS OR 
AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA,
INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR
OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
------------------------------------------------------------------------------*/

#pragma NOAREGS

#include "upsd3400.h"
#include "upsd3400_hardware.h"
#include "upsd3400_usb.h"
#include "upsd3400_upsd_usb.h"
#include "upsd3400_usb_app.h"


#define USB_MS_SectorSize 512
#define USB_MS_UnitSize   (USB_MS_SectorSize*9*64)


extern xdata PSD_REGS UPSD_xreg;

data unsigned      char gbCBWCB[16];
data unsigned long  int gdwCBWTag;
data unsigned long  int gdwCBWDataTransferLength;
data unsigned      char gbCBWFlags;
data unsigned      char gbCBWLUN;
data unsigned      char gbCBWCBLength;
data unsigned      char gbCSWStatus;
data unsigned      char gbBulkPipeStage;

static data unsigned int TransferLength;
static data unsigned int PhysicalDataAddr;



extern unsigned char data usbState, ep0state, ep1state;
extern setup_buffer setupPacket;





#define USB_FIFO ((unsigned char volatile xdata *) USB_BASE_ADDR)

#define UMSC_IN_ENDPOINT SELEP1
#define UMSC_OUT_ENDPOINT SELEP3

#define UMSC_MASK_IN_ENDPOINT IN1F
#define UMSC_MASK_OUT_ENDPOINT OUT3F

















void ReturnCSW(void)
/******************************************************************************
  Function   : void ReturnCSW(void)
  Parameters : none
  Description: Handle CSW package.
               Command Status Wrapper (CSW) shall start on a packet boundary
               and shall end as a short packet with exactly 13 (0Dh) bytes
               transferred. Fields appear aligned to byte offsets equal to
               a multiple of their byte size. All CSW transfers shall
               be ordered with the LSB (byte 0) first (little endian).
               Refer to the USB Specification Terms and Abbreviations
               for clarification.
  ******************************************************************************/
 {
  USEL  = INDIR | UMSC_IN_ENDPOINT;          //Select EP1 IN

/*dCSWSignature:
  Signature that helps identify this data packet as a CSW. The signature field
  shall contain the value 53425355h (little endian), indicating CSW. */
  USB_FIFO[ 0] = 0x55;                       // dCSWSignature
  USB_FIFO[ 1] = 0x53;
  USB_FIFO[ 2] = 0x42;
  USB_FIFO[ 3] = 0x53;
/*dCSWTag:
  The device shall set this field to the value received in the dCBWTag
  of the associated CBW.*/
  USB_FIFO[ 4] = *((uchar *)&gdwCBWTag+3);   // dCSWTag, LSB read first
  USB_FIFO[ 5] = *((uchar *)&gdwCBWTag+2);
  USB_FIFO[ 6] = *((uchar *)&gdwCBWTag+1);
  USB_FIFO[ 7] = *((uchar *)&gdwCBWTag+0);
/*dCSWDataResidue:
  For Data-Out the device shall report in the dCSWDataResidue the difference
  between
  the amount of data expected as stated in the dCBWDataTransferLength,
  and the actual amount of data processed by the device.
  For Data-In the device shall report in the dCSWDataResidue the difference
  between the amount of data expected as stated in the dCBWDataTransferLength
  and the actual amount of relevant data sent by the device.
  The dCSWDataResidue shall not exceed the value sent in the dCBWDataTransferLength.
  We return always zero, it is simple.
  */
  USB_FIFO[ 8] = 0x00;                       // dCSWDataResidue
  USB_FIFO[ 9] = 0x00;
  USB_FIFO[10] = 0x00;
  USB_FIFO[11] = 0x00;
/*bCSWStatus:
  bCSWStatus indicates the success or failure of the command.
  The device shall set this byte to zero if the command completed successfully.
  A non-zero value shall indicate a failure during command execution according
  to the following table:
  00h Command Passed ("good status")
  01h Command Failed
  02h Phase Error
  03h and 04h Reserved (Obsolete)
  05h to FFh Reserved
  */
  USB_FIFO[12] = gbCSWStatus;                // bCSWStatus

  USIZE = 0x0D;                              // fire !

  gbBulkPipeStage = BS_CSW_DONE_PHASE;
 }















void SpecificIncrementSectorAddress(void)
/******************************************************************************
 Function   : void SpecificIncrementSectorAddress(void)
 Parameters : none
 Description: Increments PhysicalDataAddr of 512b (1 sector),
              adjust PAGE and TransferLength.
              Used in Read and Write Commands
 ******************************************************************************/
 {
  PhysicalDataAddr   += 64;                  // next sector physical address
  if (PhysicalDataAddr < 0x8000)
   {
    PhysicalDataAddr += 0x8000;        // adjust address to the top half of memory
    UPSD_xreg.PAGE   += 1;                   // adjust PAGE
   }
  TransferLength--;                          // decrement sector counter
 }







void WriteBufferToFlash(void)
/******************************************************************************
 Function   : void WriteBufferToFlash()
 Parameters : (none)
 Description: Receives (writes) sectors
 ******************************************************************************/
 {

  if (TransferLength != 0)
   {
      UIF2 &= ~UMSC_MASK_OUT_ENDPOINT;       // clear INT Flag

#ifdef __RC51__                              //Compiler: Raisonance
      #pragma asm
        ;The following equates are also defined in usb.h
        ; and should be the same in both places.
		;The following EQUates are only needed when using RIDE. 
              USB_BASE_ADDR    EQU 7000H    ;USB FIFO mapped in XDATA space
              INDIR            EQU 0
              SELEP1           EQU 1
              UMSC_IN_ENDPOINT EQU SELEP1
      #pragma endasm
#endif
      #pragma asm
              mov    DPTM,#0
              mov    DPTC,#1
              mov    DPTR,#USB_BASE_ADDR
              mov    DPTC,#0
              mov    DPH,PhysicalDataAddr+0
              mov    DPL,PhysicalDataAddr+1
              mov    DPTC,#64+1
              mov    DPTM,#10
              mov    B,#8
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              djnz   B,$-16
              mov    DPTM,#0
              mov    DPTC,#0
      #pragma endasm

      UCON |= EPFIFO_BSY;                 // release buffer, new OUT data can come

    SpecificIncrementSectorAddress();
   }

  if (TransferLength == 0)
   {
    ReturnCSW();                             // return status
   }
 }







void ReadBufferFromFlash(void)
/******************************************************************************
 Function   : void ReadBufferFromFlash()
 Parameters : (none)
 Description: Reads (sends) sectors to a host
 ******************************************************************************/
 {


  if (TransferLength == 0)
   {
    ReturnCSW();                             // return status
   }
  else
   {


    #pragma asm
              mov    DPTM,#0
              mov    DPTC,#1
              mov    DPH,PhysicalDataAddr+0
              mov    DPL,PhysicalDataAddr+1
              mov    DPTM,#10
              mov    USEL,#INDIR+UMSC_IN_ENDPOINT
              mov    DPTC,#0
              mov    DPTR,#USB_BASE_ADDR
              mov    DPTC,#64+1
              mov    B,#8
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              movx   A,@DPTR
              movx   @DPTR,A
              djnz   B,$-16
              mov    USIZE,#64                                         ; FIRE!
              mov    DPTM,#0
              mov    DPTC,#0
    #pragma endasm

    SpecificIncrementSectorAddress();
/*gbCSWStatus = FAIL;*/
   }
}








void DoReadWrite(void)
/*--------------------------------------------------------------------
  Function   : void DoReadWrite()
  Parameters : none
  Description: Handler for READ and WRITE command
  ---------------------------------------------------------------------*/
 {
  data unsigned long LogicalBlockAddr;

/* Decode the Command Descriptor Block (CDB)
  Byte 0 OPERATION CODE
  Byte 1 Reserved
  Byte 2,3,4,5 (MSB) LOGICAL BLOCK ADDRESS (LSB)
  Byte 6 Reserved
  Byte 7 (MSB)
  Byte 8 TRANSFER LENGTH (LSB)
  Byte 9 CONTROL = 00h
  The LOGICAL BLOCK ADDRESS field specifies the first logical block of the range
  of logical blocks that shall be read.
  The TRANSFER LENGTH field specifies the number of contiguous logical blocks of
  data that shall be transferred. A TRANSFER LENGTH of zero indicates that no logical
  blocks shall be transferred. This condition shall not be considered an error.
  Any other value indicates the number of logical blocks that shall be transferred.
  */
  LogicalBlockAddr  = *(unsigned long int *)&gbCBWCB[2];

  PhysicalDataAddr =  ((unsigned int )(LogicalBlockAddr << 9)) | 0x8000;
  UPSD_xreg.PAGE   =   (unsigned char)(LogicalBlockAddr >> 6);
  TransferLength   =  *(unsigned int *)&gbCBWCB[7];
  TransferLength   = TransferLength*8;

  gbBulkPipeStage  = BS_DATA_PHASE;

  if (gbCBWFlags & 0x80)                     // READ command
   {
    ReadBufferFromFlash();
   }
 }




















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91免费视频网| 亚洲精品久久7777| 亚洲欧美日韩精品久久久久| 亚洲第一会所有码转帖| 成人一级视频在线观看| 67194成人在线观看| 亚洲精品国产一区二区精华液 | 九九九精品视频| 色天天综合久久久久综合片| 久久综合九色综合欧美98| 亚洲国产成人91porn| 91女厕偷拍女厕偷拍高清| 久久精品人人做人人爽97 | 一区二区三区.www| 成人av在线资源网站| 精品久久免费看| 日韩不卡一二三区| 欧美日韩综合在线免费观看| 亚洲同性同志一二三专区| 成人永久免费视频| 国产日韩亚洲欧美综合| 激情久久五月天| 欧美一区二区三区人| 亚洲成人自拍一区| 欧美日韩一区二区三区在线看| 国产精品三级视频| 成人黄色在线视频| 国产精品毛片无遮挡高清| 粉嫩av一区二区三区粉嫩| 久久久91精品国产一区二区精品 | 亚洲乱码国产乱码精品精的特点 | 最新国产精品久久精品| 成人精品免费网站| 国产精品嫩草影院av蜜臀| 成人综合激情网| 亚洲欧美中日韩| 91天堂素人约啪| 亚洲美女淫视频| 欧美日韩视频一区二区| 亚洲狼人国产精品| 91色porny在线视频| 亚洲精品国产一区二区精华液| 在线免费观看日本一区| 亚洲精品欧美二区三区中文字幕| 在线免费观看日本欧美| 亚洲午夜久久久久中文字幕久| 欧美日韩中文国产| 奇米影视7777精品一区二区| 26uuu国产电影一区二区| 国产精品123| 亚洲精品视频一区| 欧美日韩精品免费观看视频| 蜜臀av在线播放一区二区三区| 精品日产卡一卡二卡麻豆| 国产一区二区不卡| 一区二区三国产精华液| 欧美亚洲高清一区| 麻豆精品新av中文字幕| 欧美国产亚洲另类动漫| 欧美在线观看视频在线| 欧美96一区二区免费视频| 国产午夜精品久久久久久免费视| 99久久精品国产麻豆演员表| 日日摸夜夜添夜夜添精品视频 | 亚洲精品videosex极品| 欧美疯狂做受xxxx富婆| 国产精品99久久不卡二区| 一区二区在线观看视频| 日韩精品资源二区在线| 9i在线看片成人免费| 首页国产丝袜综合| 中文欧美字幕免费| 日韩三级.com| 色诱视频网站一区| 精品在线播放午夜| 亚洲一区二区三区激情| 国产日产精品一区| 91精品国产综合久久婷婷香蕉 | 高清在线观看日韩| 午夜视频一区二区| 国产精品国产三级国产有无不卡 | 欧美丰满少妇xxxbbb| 成人一区二区三区视频在线观看| 日韩av一区二区三区| 亚洲另类一区二区| 国产精品欧美极品| 精品久久久久久久久久久久包黑料| 91色九色蝌蚪| 欧美午夜宅男影院| 国产suv精品一区二区6| 麻豆精品在线观看| 日韩av电影免费观看高清完整版 | 老司机午夜精品99久久| 一区二区三区在线不卡| 国产精品蜜臀av| 久久综合狠狠综合久久综合88 | 亚洲欧美一区二区三区孕妇| 久久精品亚洲一区二区三区浴池 | 床上的激情91.| 国产伦精品一区二区三区视频青涩| 婷婷亚洲久悠悠色悠在线播放| 国产精品成人一区二区艾草| 国产日韩欧美综合在线| 久久久久99精品一区| 欧美电影精品一区二区| 欧美二区三区的天堂| 精品视频999| 欧美日韩精品一区二区三区蜜桃 | 美女视频黄频大全不卡视频在线播放| 一区二区三区免费观看| 亚洲人成网站色在线观看| 亚洲天堂中文字幕| 综合激情成人伊人| 一区二区三区**美女毛片| 洋洋av久久久久久久一区| 亚洲另类春色国产| 亚洲午夜电影在线观看| 亚洲国产日日夜夜| 午夜精品一区二区三区免费视频 | 亚洲成人精品在线观看| 亚洲一区二区三区影院| 亚洲成人7777| 日韩高清一级片| 蜜桃91丨九色丨蝌蚪91桃色| 蜜臀久久99精品久久久久宅男| 日韩精品一级二级| 久久不见久久见免费视频7| 国产一区二区三区精品欧美日韩一区二区三区 | 日本不卡的三区四区五区| 日韩av电影免费观看高清完整版 | 久久电影网站中文字幕| 国产一本一道久久香蕉| 国产成人综合网站| 99久久婷婷国产综合精品| 97久久久精品综合88久久| 欧美三级韩国三级日本一级| 91精品国产综合久久精品图片| 欧美va天堂va视频va在线| 最新高清无码专区| 天天射综合影视| 国产一区二区三区四区五区美女| 丁香婷婷深情五月亚洲| 一本一本久久a久久精品综合麻豆| 欧美三级日韩在线| 精品少妇一区二区| 一区免费观看视频| 丝袜美腿亚洲一区| 国产成人8x视频一区二区| 欧美在线一区二区| 欧美电视剧在线看免费| 亚洲精品视频免费观看| 激情综合色播激情啊| 91丝袜国产在线播放| 日韩精品一区二区三区视频播放| 中文一区二区在线观看| 亚洲成人av电影在线| 国产98色在线|日韩| 91精品黄色片免费大全| 国产精品久久久久影院亚瑟| 日韩精品福利网| 99re亚洲国产精品| 日韩三级精品电影久久久| 亚洲免费在线视频一区 二区| 九九精品一区二区| 欧美系列一区二区| 国产精品区一区二区三区| 麻豆精品一区二区av白丝在线| 91年精品国产| 中文字幕av不卡| 理论电影国产精品| 精品视频在线免费观看| 中文字幕视频一区| 精品亚洲国产成人av制服丝袜| 在线观看日产精品| 中文字幕精品三区| 精彩视频一区二区| 欧美二区三区91| 亚洲国产视频在线| 色综合夜色一区| 中文字幕在线不卡视频| 国产乱一区二区| 久久在线观看免费| 美女视频一区二区三区| 欧美日韩一卡二卡| 亚洲欧洲日本在线| www.色精品| 国产精品动漫网站| 国产 欧美在线| 国产免费观看久久| 国产精品12区| 欧美激情一区二区| 粉嫩绯色av一区二区在线观看| 久久久午夜电影| 精品一区二区免费在线观看| 久久精品这里都是精品| 国产福利一区在线观看| 久久人人97超碰com| 国产乱色国产精品免费视频| 26uuu欧美| 成人小视频免费在线观看|