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

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

?? scsi_decoder.c

?? 基于at90usb1287的數據存儲器例子
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**
 * @file scsi_decoder.c,v
 *
 * Copyright (c) 2004 Atmel.
 *
 * Please read file license.txt for copyright notice.
 *
 * @brief This file is the SCSI decoder module
 *
 * This file contains the routines to decode and to manage the SCSI commands
 *
 * @version 1.4 at90usb128-usbkey-demo-storage-df-1_0_4 $Id: scsi_decoder.c,v 1.4 2006/03/13 17:38:51 rletendu Exp $
 *
 * @todo
 * @bug
 */

//_____  I N C L U D E S ___________________________________________________

#include "config.h"
#include "scsi_decoder.h"
#include "conf_usb.h"
#include "lib_mcu\usb\usb_drv.h"                    // FIXME
#include "modules\control_access\ctrl_status.h"
#include "modules\control_access\ctrl_access.h"


//_____ M A C R O S ________________________________________________________


//_____ D E F I N I T I O N S ______________________________________________


_MEM_TYPE_MEDFAST_ U8  g_scsi_command[16];
_MEM_TYPE_MEDFAST_ U8  g_scsi_status;
_MEM_TYPE_MEDFAST_ U32 g_scsi_data_remaining;

code    U8    g_sbc_vendor_id[8]   = SBC_VENDOR_ID;
code    U8    g_sbc_product_id[16] = SBC_PRODUCT_ID;
code    U8    g_sbc_revision_id[4] = SBC_REVISION_ID;

extern  _MEM_TYPE_MEDFAST_  U8  usb_LUN;

_MEM_TYPE_MEDFAST_ s_scsi_sense  g_scsi_sense;


code  struct sbc_st_std_inquiry_data sbc_std_inquiry_data =
{
   /* Byte 0 : 0x00 */
   0x00,        /* DeviceType: Direct-access device */
   0,           /* PeripheralQualifier : Currently connected */

   /* Byte 1 : 0x80 */
   0,           /* Reserved1 */
   1,           /* RMB : Medium is removable (this bit must be at 1, else the medium isn't see on Windows) */

 //  /* Byte 2 : 0x02 */
 //  0x02,        /* Version: Device compliant to ANSI X3.131:1994 */

   /* Byte 2 : 0x00 */
   0x00,        /* Version: Device not compliant to any standard */

   /* Byte 3 : 0x02 */
   2,           /* Response data format */
   0,           /* NormACA */
   0,           /* Obsolete0 */
   0,           /* AERC */

   /* Byte 4 : 0x1F */
   /* Byte 5 : 0x00 */
   /* Byte 6 : 0x00 */
                /* Reserved4[3] */
   {
      0x1F,     /* Additional Length (n-4) */
      0,        /* SCCS : SCC supported */
      0
   },

   /* Byte 7 : 0x00 */
   0,          /* SoftReset */
   0,          /* CommandQueue */
   0,          /* Reserved5 */
   0,          /* LinkedCommands */
   0,          /* Synchronous */
   0,          /* Wide16Bit */
   0,          /* Wide32Bit */
   0,          /* RelativeAddressing */
};


static  void  send_informational_exceptions_page (void);
static  void  send_read_write_error_recovery_page (U8);
static  void sbc_header_mode_sense( Bool b_sense_10 , U8 u8_data_length );


//_____ D E C L A R A T I O N S ____________________________________________
/**
 * @brief SCSI decoder function
 *
 * This function read the SCSI command and launches the appropriate function
 *
 * @warning Code:.. bytes (function code length)
 *
 * @param nonr
 *
 * @return  FALSE: result KO,
 *          TRUE:  result OK
 *
 */
Bool scsi_decode_command(void)
{
Bool status;

   if (g_scsi_command[0] == SBC_CMD_WRITE_10)
   {
      Scsi_start_write_action();
      status = sbc_write_10();
	  Scsi_stop_write_action();
      return status;
   }
   if (g_scsi_command[0] == SBC_CMD_READ_10 )
   {
      Scsi_start_read_action();
      status = sbc_read_10();
      Scsi_stop_read_action();
      return status;
   }

   switch (g_scsi_command[0])                /* check other command received */
   {
      case SBC_CMD_REQUEST_SENSE:             /* 0x03 - Mandatory */
           return sbc_request_sense();
           break;

      case SBC_CMD_INQUIRY:                   /* 0x12 - Mandatory */
           return sbc_inquiry();
           break;

      case SBC_CMD_TEST_UNIT_READY:           /* 0x00 - Mandatory */
           return sbc_test_unit_ready();
           break;

      case SBC_CMD_READ_CAPACITY:             /* 0x25 - Mandatory */
           return sbc_read_capacity();
           break;

      case SBC_CMD_MODE_SENSE_6:              /* 0x1A - Optional */
           return sbc_mode_sense( FALSE );
           break;

      case SBC_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:/* 0x1E */
           return sbc_prevent_allow_medium_removal();
           break;

      case SBC_CMD_VERIFY_10:                 /* 0x2F - Optional */
           sbc_lun_status_is_good();
           break;
      case SBC_CMD_MODE_SENSE_10:             /* 0x5A - Optional */
           return sbc_mode_sense( TRUE );
           break;

      case SBC_CMD_FORMAT_UNIT:               /* 0x04 - Mandatory */

      case SBC_CMD_MODE_SELECT_6:             /* 0x15 - Optional */




      case SBC_CMD_START_STOP_UNIT:           /* 0x1B - Optional */
      case SBC_CMD_SEND_DIAGNOSTIC:           /* 0x1D -  */
      case SBC_CMD_READ_LONG:                 /* 0x23 - Optional */
      case SBC_CMD_SYNCHRONIZE_CACHE:         /* 0x35 - Optional */
      case SBC_CMD_WRITE_BUFFER:              /* 0x3B - Optional */
      case SBC_CMD_RESERVE_10:                /* 0x56 - Mandatory */
      case SBC_CMD_RELEASE_10:                /* 0x57 - Mandatory - see chapter 7.16 - SPC 2 */
      default:
           { /* Command not supported */
              Sbc_send_failed();
              Sbc_build_sense(SBC_SENSE_KEY_ILLEGAL_REQUEST, SBC_ASC_INVALID_COMMAND_OPERATION_CODE, 0x00);
              return FALSE;
              break;
           }
   }
   return TRUE;
}


/**
 * @brief This function manages the SCSI REQUEST SENSE command (0x03)
 *
 * The SCSI Sense contains the status of the last command
 * This status is composed of 3 Bytes :
 * - sense key  (g_scsi_sense.key)
 * - additional sense code  (g_scsi_sense.asc)
 * - additional sense code qualifier  (g_scsi_sense.ascq)
 *
 * @warning Code:.. bytes (function code length)
 *
 * @param none
 *
 * @return  FALSE: result KO,
 *          TRUE:  result OK
 *
 */
Bool sbc_request_sense (void)
{
  U8  allocation_length, i;
  U8  request_sens_output[18];   /* the maximum size of request is 17 */

  allocation_length = g_scsi_command[4];  /* Allocation length */

  /* Initialize the request sense data */
  request_sens_output[0] = SBC_RESPONSE_CODE_SENSE; /* 70h */
  request_sens_output[1] = 0x00;                    /* Obsolete */
  request_sens_output[2] = g_scsi_sense.key;

  request_sens_output[3] = 0x00;   /* For direct access media, Information field */
  request_sens_output[4] = 0x00;   /* give the unsigned logical block */
  request_sens_output[5] = 0x00;   /* address associated with the sense key */
  request_sens_output[6] = 0x00;

  request_sens_output[7] = SBC_ADDITIONAL_SENSE_LENGTH; /* !! UFI device shall not adjust the Additional sense length to reflect truncation */
  request_sens_output[8] = SBC_COMMAND_SPECIFIC_INFORMATION_3;
  request_sens_output[9] = SBC_COMMAND_SPECIFIC_INFORMATION_2;
  request_sens_output[10] = SBC_COMMAND_SPECIFIC_INFORMATION_1;
  request_sens_output[11] = SBC_COMMAND_SPECIFIC_INFORMATION_0;

  request_sens_output[12] = g_scsi_sense.asc;
  request_sens_output[13] = g_scsi_sense.ascq;

  request_sens_output[14] = SBC_FIELD_REPLACEABLE_UNIT_CODE;
  request_sens_output[15] = SBC_SENSE_KEY_SPECIFIC_2;
  request_sens_output[16] = SBC_SENSE_KEY_SPECIFIC_1;
  request_sens_output[17] = SBC_SENSE_KEY_SPECIFIC_0;

  /* Send the request data */
  for( i=0 ; i<allocation_length ; i++ )
  {
    Usb_write_byte( request_sens_output[i] );
  }
  Sbc_valid_write_usb( allocation_length );

  sbc_lun_status_is_good();

  return TRUE;
}

/**
 * @brief This function manages the SCSI INQUIRY command (0x12)
 *
 * The SCSI Inquiry field contains information regarding parameters
 * of the target. For example:
 * - vendor identification
 * - product identification
 * - peripheral qualifier
 * - peripheral device type
 * - etc
 *
 * @warning Code:.. bytes (function code length)
 *
 * @param none
 *
 * @return  FALSE: result KO,
 *          TRUE:  result OK
 *
 */
Bool sbc_inquiry (void)
{
   U8 allocation_length, i;

#ifdef AVRGCC
   PGM_VOID_P ptr;
#else
   U8 code *ptr;
#endif

   if( (0 == (g_scsi_command[1] & 0x03) )    // CMDT and EPVD bits are 0
   &&  (0 ==  g_scsi_command[2]         ) )  // PAGE or OPERATION CODE fields = 0x00?
   {
      //** send standard inquiry data

      // Check the size of inquiry data
      allocation_length = g_scsi_command[4];
      if (allocation_length > SBC_MAX_INQUIRY_DATA)
      {
         allocation_length = SBC_MAX_INQUIRY_DATA;
      }

      // send first inquiry data (0 to 8)
      ptr = (code U8*) &sbc_std_inquiry_data;

      for ( i=0 ; ((i != 36) && (allocation_length > i)); i++)
      {
         if( 8 == i )
         {  // send vendor id (8 to 16)
              ptr = (code U8 *) &g_sbc_vendor_id;
         }
         if( 16 == i )
         {  // send product id (16 to 32)
            ptr = (code U8 *) &g_sbc_product_id;
         }
         if( 32 == i )
         {  // send revision id (32 to 36)
            ptr = (code U8 *) &g_sbc_revision_id;
         }
#ifndef AVRGCC
         Usb_write_byte((U8)(*ptr++));     // send tab
#else    // AVRGCC does not support point to PGM space
#warning with avrgcc assumes devices descriptors are stored in the lower 64Kbytes of on-chip flash memory
         Usb_write_byte(pgm_read_byte_near((unsigned int)ptr++));
#endif

      }

      //  send data (36 to SBC_MAX_INQUIRY_DATA), and can be tranmitted by Bulk
      //  Description of next bytes (this bytes is always egal to 0) :
      //  VendorSpecific    : 20 Bytes
      //  Next byte         : 1 byte
      //       - InfoUnitSupport   : 1 bit
      //       - QuickArbitSupport : 1 bit
      //       - Clocking          : 2 bits
      //       - Reserved6         : 4 bits
      //  Reserved7         : 1 byte
      //  VersionDescriptor : 8 bytes
      //  Reserved8         : 22 bytes
      //  ...
      while( allocation_length > i )
      {
         if (64 == i)
         {  // for each 64 bytes, send USB packet
            Sbc_valid_write_usb(64);
            allocation_length -= 64;
            i = 0;
         }
         Usb_write_byte(0);       // write value of last bytes of inquiry data
         i++;
      }
      // send last USB packet
      Sbc_valid_write_usb(allocation_length);
      sbc_lun_status_is_good();
      return TRUE;
   }
   else
   {  // (CMDT=EVPD <> 0) or (PAGE CODE <> 0x00)
      Sbc_send_failed();
      Sbc_build_sense(SBC_SENSE_KEY_ILLEGAL_REQUEST, SBC_ASC_INVALID_FIELD_IN_CDB, 0x00);
      return FALSE;
   }
}


Bool sbc_test_unit_ready(void)
{
   switch ( mem_test_unit_ready(usb_LUN) )
   {
   case CTRL_GOOD :
      sbc_lun_status_is_good();
      break;

   case CTRL_NO_PRESENT :
      sbc_lun_status_is_not_present();
      break;

   case CTRL_BUSY :
      sbc_lun_status_is_busy_or_change();
      break;

   case CTRL_FAIL :
   default :
      sbc_lun_status_is_fail();
      break;
   }
   return TRUE;
}


Bool sbc_read_capacity (void)
{
   _MEM_TYPE_SLOW_ U32 mem_size_nb_sector;

   switch ( mem_read_capacity( usb_LUN, &mem_size_nb_sector ) )
   {
   case CTRL_GOOD :

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线精品秘密一区二区| 日本一区二区三区免费乱视频| 日韩和欧美一区二区三区| 欧美xxxx在线观看| 精品一区二区三区久久久| 18成人在线视频| 精品免费日韩av| 色哟哟一区二区三区| 乱一区二区av| 亚洲乱码国产乱码精品精可以看| 欧美一区二区三区喷汁尤物| 久久99久久精品| 偷偷要91色婷婷| 亚洲人妖av一区二区| 日韩免费看网站| 欧美性videosxxxxx| 国产精品99久久久久久有的能看| 午夜精品福利在线| 国模一区二区三区白浆| 亚洲日本乱码在线观看| 日韩欧美不卡在线观看视频| 91麻豆国产在线观看| 美女视频黄久久| 亚洲影视在线观看| 国产日韩欧美高清| 欧美一区二区高清| 在线影视一区二区三区| 国产成人三级在线观看| 青椒成人免费视频| 一区二区三区小说| 中文字幕一区二区三区不卡在线| 日韩欧美的一区二区| 在线观看成人小视频| 9人人澡人人爽人人精品| 乱中年女人伦av一区二区| 午夜精品久久久久影视| 综合电影一区二区三区| 国产亚洲精品中文字幕| 欧美一卡二卡三卡四卡| 91久久精品国产91性色tv| 粉嫩13p一区二区三区| 麻豆精品一二三| 蜜臀av性久久久久蜜臀aⅴ流畅| 亚洲国产精品一区二区久久恐怖片 | 日本欧美一区二区| 欧美激情自拍偷拍| 国产片一区二区三区| 2022国产精品视频| 欧美xxxx老人做受| 欧美成人精品福利| 日韩欧美一级二级三级久久久 | 久久久精品影视| 久久色在线观看| 久久久欧美精品sm网站| 26uuu亚洲婷婷狠狠天堂| 日韩欧美久久一区| 精品久久人人做人人爽| 中文av字幕一区| 亚洲自拍偷拍综合| 麻豆成人久久精品二区三区小说| 黄一区二区三区| 成人午夜视频网站| 欧美在线观看视频一区二区三区| 欧美电影在线免费观看| 日韩欧美资源站| 国产精品无遮挡| 亚洲电影中文字幕在线观看| 蜜桃传媒麻豆第一区在线观看| 国产成人免费视频一区| 在线免费观看一区| 日韩精品一区国产麻豆| 国产精品色呦呦| 亚洲图片自拍偷拍| 国产精品一线二线三线| 91久久精品一区二区三| 日韩精品中文字幕在线不卡尤物 | 久久久综合精品| 亚洲免费资源在线播放| 蜜臀av一区二区三区| 99精品在线免费| 欧美哺乳videos| 亚洲三级在线免费观看| 青青青爽久久午夜综合久久午夜| 国产成人免费高清| 欧美日韩亚州综合| 国产女人水真多18毛片18精品视频 | 国产福利不卡视频| 欧美日韩在线直播| 久久精品在这里| 91福利在线看| 久久99蜜桃精品| 91在线观看视频| 91精品黄色片免费大全| 日本一区二区综合亚洲| 日韩 欧美一区二区三区| 成人丝袜高跟foot| 日韩欧美国产一区二区三区 | 日韩情涩欧美日韩视频| 亚洲精选在线视频| 国产一区在线不卡| 欧美日韩高清不卡| 亚洲丝袜自拍清纯另类| 国产一区视频导航| 91精品国产91综合久久蜜臀| 亚洲女女做受ⅹxx高潮| 国产69精品久久久久毛片| 91精品免费在线观看| 一区二区三区精品久久久| 成人性生交大片免费| 精品日产卡一卡二卡麻豆| 日韩综合一区二区| 91黄色免费版| 亚洲欧美国产77777| 国产精品亚洲人在线观看| 欧美成人vr18sexvr| 视频精品一区二区| 欧美日韩亚洲综合一区二区三区| 亚洲视频1区2区| 不卡免费追剧大全电视剧网站| 精品盗摄一区二区三区| 免费在线观看不卡| 7777精品伊人久久久大香线蕉经典版下载 | 国产欧美日韩久久| 精品亚洲国内自在自线福利| 欧美精选在线播放| 午夜欧美在线一二页| 欧美综合一区二区| 亚洲精品国产a| 色狠狠综合天天综合综合| 日韩理论片在线| 99国产精品一区| 亚洲欧洲制服丝袜| 91久久精品一区二区三区| 一区二区激情视频| 欧美无砖专区一中文字| 亚洲一区二区三区美女| 欧美精品18+| 青青草精品视频| 精品久久久久久综合日本欧美| 国产综合色产在线精品| 欧美精品一区二区三区一线天视频| 麻豆91在线观看| 久久综合九色欧美综合狠狠| 国产一区二区美女| 久久精品亚洲国产奇米99| 国产成人精品一区二| 亚洲欧洲精品成人久久奇米网| 91香蕉视频污在线| 亚洲一线二线三线视频| 欧美精选一区二区| 国产自产高清不卡| 欧美国产视频在线| 色综合天天狠狠| 偷拍自拍另类欧美| 精品国产一区二区三区不卡| 国产精品白丝jk白祙喷水网站| 中文字幕制服丝袜成人av | 国产精品一区二区你懂的| 国产精品你懂的在线欣赏| 91蜜桃在线观看| 午夜久久久久久| 亚洲精品在线免费播放| 99热这里都是精品| 婷婷中文字幕综合| 欧美精品一区视频| 91国在线观看| 黄色日韩网站视频| 国产精品久久久久国产精品日日| 欧美色视频在线| 国产又黄又大久久| 亚洲欧美激情视频在线观看一区二区三区| 欧美日韩精品一二三区| 精品一区中文字幕| 亚洲人成网站色在线观看| 欧美一区二区三区的| voyeur盗摄精品| 日产欧产美韩系列久久99| 亚洲国产精品二十页| 欧美日韩三级一区二区| 国产盗摄一区二区三区| 亚洲高清一区二区三区| 久久嫩草精品久久久精品 | 久久久影院官网| 日本韩国欧美在线| 国产中文字幕精品| 一区二区三区在线高清| 久久久久国产精品麻豆ai换脸| 色综合久久久久| 国产激情精品久久久第一区二区 | 免费久久精品视频| 亚洲人成精品久久久久久| 精品国产一区二区精华| 色婷婷综合在线| 极品销魂美女一区二区三区| 一区二区三区在线免费视频| 欧美国产视频在线| 精品理论电影在线观看| 欧美人牲a欧美精品| www.成人网.com| 国产成人激情av|