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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? upsd3400_usb_app.c

?? upsd34xx系列單片機(jī)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();
   }
 }




















?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合一区二区三区| 欧美日韩一区二区三区在线看| 日韩欧美中文字幕公布| 日韩国产欧美在线观看| 制服视频三区第一页精品| 日韩专区在线视频| 日韩一区二区在线观看视频播放| 日韩电影免费在线观看网站| 欧美一区二区啪啪| 国产剧情一区在线| 国产精品成人免费| 欧美在线视频全部完| 奇米色一区二区三区四区| 精品国产一区二区三区久久久蜜月 | 最新热久久免费视频| 91亚洲精品久久久蜜桃网站| 亚洲在线中文字幕| 日韩欧美国产精品| 成人精品一区二区三区中文字幕| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩一区国产| 精品一区二区av| 国产精品传媒入口麻豆| 69堂国产成人免费视频| 国产福利一区二区三区视频| 亚洲精品日产精品乱码不卡| 7777精品伊人久久久大香线蕉经典版下载 | 国产日韩欧美激情| 日本精品裸体写真集在线观看| 亚洲va国产va欧美va观看| 亚洲精品在线观| 91黄色免费观看| 国产一区美女在线| 午夜伦理一区二区| 国产喂奶挤奶一区二区三区| 91国产丝袜在线播放| 久久超碰97中文字幕| 亚洲理论在线观看| 国产日产精品1区| 欧美日韩卡一卡二| 成人免费高清在线| 日本不卡一二三| 亚洲欧美日韩电影| 久久久国际精品| 欧美一区二区免费视频| 94色蜜桃网一区二区三区| 极品少妇xxxx精品少妇偷拍| 亚洲r级在线视频| 亚洲色图一区二区| 久久久久国产免费免费| 欧美一区二区不卡视频| 日本韩国一区二区| heyzo一本久久综合| 国产一区二区精品在线观看| 亚洲h精品动漫在线观看| 亚洲三级小视频| 久久九九全国免费| 精品国产髙清在线看国产毛片| 欧美三级三级三级爽爽爽| 97se亚洲国产综合自在线不卡 | 2020国产精品自拍| 欧美久久久久免费| 欧美色区777第一页| 色视频成人在线观看免| av男人天堂一区| 成人妖精视频yjsp地址| 国产黄色成人av| 韩国av一区二区三区| 99久久婷婷国产综合精品| 色狠狠一区二区三区香蕉| 一区二区三区中文字幕电影| 久久久久国产精品麻豆| 精品人伦一区二区色婷婷| 9191国产精品| 欧美一区二区在线免费播放| 欧美日韩激情在线| 欧美三级视频在线观看| 欧美人与性动xxxx| 欧美日韩国产小视频在线观看| 欧美性生活影院| 欧美日韩另类国产亚洲欧美一级| 欧美午夜不卡视频| 欧美色网站导航| 欧美人牲a欧美精品| 欧美二区三区91| 日韩欧美国产麻豆| 精品久久久久久亚洲综合网 | 在线不卡中文字幕播放| 欧美喷潮久久久xxxxx| 欧美乱妇23p| 欧美精品乱人伦久久久久久| 7799精品视频| 精品日韩一区二区三区免费视频| 精品国精品国产尤物美女| 久久精品日产第一区二区三区高清版| 久久久国产精品午夜一区ai换脸| 国产精品久久久一本精品| 亚洲免费电影在线| 婷婷激情综合网| 久久国产精品露脸对白| 国产成人免费在线视频| 91视频一区二区| 制服丝袜国产精品| 久久精品无码一区二区三区| 亚洲欧美日韩在线| 天堂蜜桃91精品| 国产福利精品导航| 在线中文字幕一区| 精品国产免费视频| 最近日韩中文字幕| 午夜一区二区三区视频| 国产一区二区三区香蕉| 一本色道久久加勒比精品| 欧美日韩精品一区二区三区蜜桃 | 久久99蜜桃精品| 成人丝袜18视频在线观看| 一本大道久久a久久精品综合| 欧美精品777| 国产女人aaa级久久久级 | 国产精品乱人伦一区二区| 亚洲精品成a人| 精品一区二区免费| 在线看国产一区二区| 日韩精品一区二区三区蜜臀| 亚洲欧洲精品天堂一级| 日韩av中文在线观看| 成人精品视频网站| 欧美一区二区三区四区在线观看 | 欧美一卡2卡三卡4卡5免费| 日本一区二区三区在线不卡| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品自拍av| 91精品视频网| 亚洲精品视频自拍| 国产精品一区二区三区网站| 欧美日韩在线一区二区| 国产人久久人人人人爽| 日韩av高清在线观看| 91美女视频网站| 国产网站一区二区三区| 免费黄网站欧美| 欧美写真视频网站| 国产精品久久久久久久裸模| 精品一区二区三区的国产在线播放| 欧美在线你懂得| 国产精品久久久久久久久免费丝袜 | 日韩欧美精品三级| 亚洲福利一二三区| 91老师国产黑色丝袜在线| 26uuu国产一区二区三区| 午夜精品久久久久久久久久| 91在线国产福利| 国产精品天干天干在线综合| 久久精品国产第一区二区三区| 欧美日韩综合不卡| 亚洲另类中文字| 色综合久久中文综合久久牛| 中文字幕在线不卡一区二区三区 | 国产精品私人影院| 国产精品资源网| 久久色在线观看| 狠狠色狠狠色合久久伊人| 欧美一级搡bbbb搡bbbb| 日韩极品在线观看| 91精品国产综合久久精品app| 亚洲一区二区三区在线看| 在线亚洲免费视频| 亚洲最色的网站| 精品视频免费在线| 日韩国产欧美三级| 3d成人动漫网站| 免费的成人av| 久久影视一区二区| 国产精品1024| 国产精品天天看| 99精品久久久久久| 亚洲综合激情另类小说区| 在线视频你懂得一区二区三区| 亚洲中国最大av网站| 欧美日韩电影在线| 青椒成人免费视频| 精品成人一区二区三区四区| 精品一区二区精品| 国产精品女主播av| 日本大香伊一区二区三区| 亚洲国产中文字幕| 日韩精品自拍偷拍| 国产馆精品极品| 国产精品对白交换视频 | 欧美色欧美亚洲另类二区| 日韩精品电影在线| 久久久国产精华| 99精品黄色片免费大全| 午夜视频久久久久久| 精品免费日韩av| av午夜精品一区二区三区| 亚洲成人免费视| 久久综合久久鬼色| 91蜜桃在线免费视频| 蜜桃av一区二区三区|