⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 protocol.h

📁 <B>SMSC USB2.0 Flash硬盘驱动源码</B>
💻 H
📖 第 1 页 / 共 3 页
字号:
typedef struct s_medium_types_supported_page
{
  uint8 page_code;
  uint8 page_length;
  uint8 reserved_1;
  uint8 reserved_2;
  uint8 medium_type_1;
  uint8 medium_type_2;
  uint8 medium_type_3;
  uint8 medium_type_4;
} t_str_medium_types_supported_page;

typedef uint8 t_buf_medium_types_page[k_sz_mode_page_medium_types];

extern code t_buf_medium_types_page mode_page_medium_types;

//------------------------------------------------------------------------------
// notch and partition page (0x0c)
#define k_mode_page_notch_page_length    0x16
#define k_sz_mode_page_notch             (k_mode_page_notch_page_length + 2)
#define kbm_opt_2_nd                     0x80
#define kbm_opt_2_lpn                    0x40

typedef struct s_notch_page
{
  uint8     page_code;
  uint8     page_length;
  uint8     opt_2;
  uint8     reserved;
  uint16    max_notches;
  uint16    active_notch;
  uint16    starting_boundry;
  uint16    ending_boundry;
  uint16    pages_notched;
} t_str_notch_page;

typedef uint8 t_buf_notch_page[k_sz_mode_page_notch];

extern code t_buf_notch_page mode_page_notch;

//------------------------------------------------------------------------------
// power condition 0d page (0x0d or 0x1a)
#define k_mode_page_power_condition_page_length     0x0a
#define k_sz_mode_page_power_condition              (k_mode_page_power_condition_page_length+2)
#define kbm_mode_page_power_condition_opt3_idle     0x02
#define kbm_mode_page_power_condition_opt3_standby  0x01

typedef struct s_power_condition_page
{
  uint8     page_code;
  uint8     page_length;
  uint8     reserved;
  uint8     opt_3;
  uint32    idle_condition_timer;
  uint32    standby_condition_timer;
} t_str_power_condition_page;

typedef uint8 t_buf_power_condition[k_sz_mode_page_power_condition];

extern code t_buf_power_condition mode_page_power_condition;

//------------------------------------------------------------------------------
// xor control mode page (0x10)
#define k_mode_page_xor_control_page_length         0x16
#define kbm_mode_page_xor_control_opt2_xordis       0x02

typedef struct s_xor_control_page
{
  uint8     page_code;
  uint8     page_length;
  uint8     opt_2;
  uint8     reserved;
  uint32    maximum_xor_write_size;
  uint32    reserved2;
  uint32    max_regenerate_size;
  uint32    max_rebuild_read_size;
  uint16    reserved3;
  uint16    rebuild_delay;
} t_str_xor_control_page;

#define k_sz_mode_page_xor_control                  (k_mode_page_xor_control_page_length+2)
typedef uint8   t_buf_xor_control_page[k_sz_mode_page_xor_control];

extern code t_buf_xor_control_page mode_page_xor_control;

// ----------------------------------------------------------------------
// informational exceptions control page (0x1c)
// ----------------------------------------------------------------------
#define k_mode_page_info_excpt_ctl_page_length      0x0a
#define kbm_mode_page_info_excpt_ctl_opt2_perf      0x80 // performance bit
#define kbm_mode_page_info_excpt_ctl_opt2_dexcpt    0x08
#define kbm_mode_page_info_excpt_ctl_opt2_test      0x04
#define kbm_mode_page_info_excpt_ctl_opt2_logerr    0x01
#define k_mode_page_info_excpt_ctl_mrie_none        0x00 // no reporting
#define k_mode_page_info_excpt_ctl_aer              0x01 // asynch event reporting
#define k_mode_page_info_excpt_ctl_gua              0x02 // generate unit attention
#define k_mode_page_info_excpt_ctl_cgre             0x03 // conditionally generate recovered err
#define k_mode_page_info_excpt_ctl_ugre             0x04 // unconditionally generate recovered err
#define k_mode_page_info_excpt_ctl_nosense          0x05 // generate no sense
#define k_mode_page_info_excpt_ctl_onrequest        0x06 // only report info exception on request

typedef struct s_info_excpt_control_page
{
  uint8     page_code;
  uint8     page_length;
  uint8     opt_2;
  uint8     mrie;
  uint32    interval_timer;
  uint32    report_count;
} t_str_info_excpt_control_page;

#define k_sz_mode_page_info_excpt_ctl (k_mode_page_info_excpt_ctl_page_length+2)
typedef uint8 t_buf_info_excpt_ctl[k_sz_mode_page_info_excpt_ctl];

extern code t_buf_info_excpt_ctl mode_page_info_excpt_ctl;

extern code uint8 mode_page_all[];
#define k_sz_mode_page_all                   \
  sizeof(mode_page_rw_err)                +  \
  sizeof(mode_page_dct_rct)               +  \
  sizeof(mode_page_format_device)         +  \
  sizeof(mode_page_rigid_disk)            +  \
  sizeof(mode_page_verify_error_recovery) +  \
  sizeof(mode_page_caching)               +  \
  sizeof(mode_page_control)               +  \
  sizeof(mode_page_medium_types)          +  \
  sizeof(mode_page_notch)                 +  \
  sizeof(mode_page_power_condition)       +  \
  sizeof(mode_page_info_excpt_ctl)


//------------------------------------------------------------------------------
// Request Sense
typedef struct s_sense
{
  uint8 error_code;
  uint8 reserved;
  uint8 sense_key;
  uint8 vendor_specific0[4];
  uint8 additional_length;
  uint8 vendor_specific1[4];
  uint8 additional_sense_code;
  uint8 asc_qualifier;
  uint8 field_replacable_unit_code;
  uint8 sense_key_specific[3];
} t_sense;

extern code t_sense sense_none;
extern code t_sense sense_bad_lun;
extern code t_sense sense_media_change;
extern code t_sense sense_no_media;
extern code t_sense sense_read_error;
extern code t_sense sense_fmt_failed;
extern code t_sense sense_no_seek;
extern code t_sense sense_por;
extern code t_sense sense_illegal_request;
extern code t_sense sense_write_error;
extern code t_sense sense_no_fmt;
extern code t_sense sense_write_protect;
extern code t_sense sense_write_protect_hw;
extern code t_sense sense_write_protect_sw_lun;
extern code t_sense sense_write_protect_assoc;
extern code t_sense sense_write_protect_persist;
extern code t_sense sense_write_protect_perm;
extern code t_sense sense_illegal_cmdpkt;
extern code t_sense sense_saving_not_support;
extern code t_sense sense_illegal_length;
extern code t_sense sense_illegal_address;
extern code t_sense sense_illegal_opcode;
extern code t_sense sense_becoming_ready;

//------------------------------------------------------------------------------
// Start Stop Unit
#define kbm_scsi_ssu_msk_immed        0x01  // 0 => return on completion, 1 => return after cbw validation
#define kbm_scsi_ssu_msk_pc           0xf0  // power conditions
  #define k_scsi_ssu_pc_nc            0x00  // no change in pc
  #define k_scsi_ssu_pc_active        0x10  // place device in active power condition
  #define k_scsi_ssu_pc_idle          0x20  // place device in idle power condition
  #define k_scsi_ssu_pc_standby       0x30  // place device in standby power condition
  #define k_scsi_ssu_pc_sleep         0x50  // place device in sleep power condition
  #define k_scsi_ssu_pc_dev_ctl       0x70  // leave control of power condition to device
  #define k_scsi_ssu_pc_idle_cdm_0    0xa0  // force idle timer (chronal displacement monitor) to 0
  #define k_scsi_ssu_pc_standby_cdm_0 0xb0  // force standby time to 0
#define kbm_scsi_ssu_msk_action       0x03  // load-or-eject / start-stop action
  #define kbm_scsi_ssu_action_stop    0x00  // stop device only (do not unload)
  #define kbm_scsi_ssu_action_start   0x01  // start device only (do not load media)
  #define kbm_scsi_ssu_action_unload  0x02  // eject (or unload) media
  #define kbm_scsi_ssu_action_load    0x03  // load media

typedef struct s_param_start_stop_unit
{
  uint8    opts;
  uint8    reserved1 ;
  uint8    reserved2 ;
  uint8    pc_action ;
  uint8    control;
} t_param_start_stop_unit;


//------------------------------------------------------------------------------
// union of all that is atapi
typedef struct s_atapi_cb
{
  uint8  opcode;
  union u_atapi_parameters
  {
    t_param_rw     rw;
    t_param_verify verify;
#if 0
    t_param_req_sense    req_sense;
    t_param_inquiry      inquiry;
    t_param_mode_sense   mode_sense;
    t_param_mode_select  mode_select;
    t_param_rd_cap       rd_cap;
    t_param_rd_fmt_cap   rd_fmt_cap;
#endif
    uint8 bytes[15];
  } param;
} t_atapi_cb;

// union of all that is scsi
typedef struct s_scsi_cb
{
  uint8 opcode;
  union u_scsi_params
  {
    t_param_rw                    rw ;
    t_param_verify                verify ;
    t_param_start_stop_unit       start_stop_unit ;
    t_param_read_format_capacity  read_format_capacity ;

#if 0
    t_param_mode_sense6   mode_sense6 ;
    t_param_mode_sense10  mode_sense10 ;
#endif
    uint8 bytes[15];
  } param ;
} t_scsi_cb ;

//------------------------------------------------------------------------------
// globally accessible flags and variables
//extern uint16  g_intr_cnt; // count ata intr vs. ide INTR detections
extern bit g_use_dma;
extern bit g_disable_iordy;

// ata device characteristics
extern xdata uint8   g_dev_max_dma_mode;  // represents max DMA mode supported by the device

//------------------------------------------------------------------------------
// fatal exception handling
void dev_exception(uint16 err) reentrant;
#define k_err_none                    (0)
#define k_err_unreachable_code        (1)
#define k_err_unexpected_synchronizer (2)


//---eof------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -