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

📄 ata.h

📁 u盘MCU端源代码,开发U盘的可以参考.
💻 H
📖 第 1 页 / 共 3 页
字号:
/*============================================================================
  ____________________________________________________________________________
                                ______________________________________________
   SSSS  M   M          CCCC          Standard Microsystems Corporation
  S      MM MM   SSSS  C                    Austin Design Center
   SSS   M M M  S      C                 11000 N. Mopac Expressway
      S  M   M   SSS   C                Stonelake Bldg. 6, Suite 500
  SSSS   M   M      S   CCCC                Austin, Texas 78759
                SSSS            ______________________________________________
  ____________________________________________________________________________
  Copyright(C) 1999, Standard Microsystems Corporation
  All Rights Reserved.
  This program code listing is proprietary to SMSC and may not be copied,
  distributed, or used without a license to do so.  Such license may have
  Limited or Restricted Rights. Please refer to the license for further
  clarification.
  ____________________________________________________________________________
  Notice: The program contained in this listing is a proprietary trade
  secret of SMSC, Hauppauge, New York, and is copyrighted
  under the United States Copyright Act of 1976 as an unpublished work,
  pursuant to Section 104 and Section 408 of Title XVII of the United
  States code. Unauthorized copying, adaption, distribution, use, or
  display is prohibited by this law.
  ____________________________________________________________________________
  Use, duplication, or disclosure by the Government is subject to
  restrictions as set forth in subparagraph(c)(1)(ii) of the Rights
  in Technical Data and Computer Software clause at DFARS 52.227-7013.
  Contractor/Manufacturer is Standard Microsystems Corporation,
  80 Arkay Drive, Hauppauge, New York, 1178-8847.
  ____________________________________________________________________________
  ____________________________________________________________________________
  ata.h - ata function prototypes
  ____________________________________________________________________________
  comments tbd
  ____________________________________________________________________________
  Revision History
  Date      Who  Comment
  ________  ___  _____________________________________________________________
  04/20/01  cds  initial version
  03/12/02  tbh  minor renaming to fit the fmc project's idiom
  06/05/02  cds  added multi-burst size constant to the identify device 
                 word offset list
  07/23/02  cds  added obsolete PIO Transfer Cycle Mode field (word 51) to 
                 identify device data.  Moved the setting of the cfc_ata_mode_ctl
                 register into the identify device function so that as soon as
                 the mode is determined, the register is set, but before then,
                 PIO mode 0 is used (to obtain the ID data).
  10/17/02  cds  - project-wide lun data & vtbl paging to reduce code space.           
                 - removed g_active_media from _lun_data, _lun_() virtual functions    
                 - added _lun_data_rd() and _lun_data_wr() macros to bypass lun paging 
                 - added lun_set_active(log_lun) function to switch luns               

============================================================================*/
#ifndef __ata_dot_h__
#define __ata_dot_h__

//------------------------------------------------------------------------------
// ata registers
#ifndef __ata_dot_c__
  #define t_ata_register extern unsigned char volatile xdata
  #define at_ata(__addr)
  #define at_ata_alt(__addr)
#else
  #define t_ata_register unsigned char volatile xdata
  #define at_ata(__addr)     _at_ 0x31F##__addr
  #define at_ata_alt(__addr) _at_ 0x33F##__addr
#endif
typedef t_xdata_ref t_ata_register_ref;

//------------------------------------------------------------------------------
// helpful macros for converting cdbs to 16 & 32 bit values
#define _uint16(h,l)          ((uint16)((((uint16)(h))<<8)|(((uint16)(l)))))
#define _uint32(hh,hl,lh,ll)  ((((uint32)(_uint16(hh,hl)))<<16)|((uint32)(_uint16(lh,ll))))
#define _hw(dw)               ((uint16)((uint32)dw>>(uint32)16))
#define _lw(dw)               ((uint16)((uint32)dw&0x0000ffff))

//------------------------------------------------------------------------------
// dma mode support.  choose one of these.
#define k_dma_mode_disabled     0
#define k_dma_mode_multiword_0  0x10
#define k_dma_mode_multiword_1  0x11
#define k_dma_mode_multiword_2  0x12
#define k_dma_mode_ultra_dma_0  0x20
#define k_dma_mode_ultra_dma_1  0x21
#define k_dma_mode_ultra_dma_2  0x22
#define k_dma_mode_ultra_dma_3  0x23
#define k_dma_mode_ultra_dma_4  0x24
#define k_dma_mode_ultra_dma_5  0x25

// k_dma_mode - set the maximum DMA mode that will be set by the firmware
#define k_dma_mode k_dma_mode_disabled

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#ifdef k_mcu_97201
#define _ata_blk_xfer_len_rd(val) \
{ \
  val.u8.hi = _mcu_register_rd(x_ata_cnt3); val.u8.lh = _mcu_register_rd(x_ata_cnt2);\
  val.u8.hl = _mcu_register_rd(x_ata_cnt1); val.u8.lo = _mcu_register_rd(x_ata_cnt0);\
}

#define _ata_blk_xfer_len_wr(val) \
{ \
  _mcu_register_wr(x_ata_cnt3, val.u8.hi); _mcu_register_wr(x_ata_cnt2, val.u8.lh);\
  _mcu_register_wr(x_ata_cnt1, val.u8.hl); _mcu_register_wr(x_ata_cnt0, val.u8.lo);\
}
#endif

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#ifdef k_flash_family
#define _ata_blk_xfer_len_rd(val) \
{ \
  val.u8.hi = _mcu_register_rd(x_fmc_cnt3); val.u8.lh = _mcu_register_rd(x_fmc_cnt2);\
  val.u8.hl = _mcu_register_rd(x_fmc_cnt1); val.u8.lo = _mcu_register_rd(x_fmc_cnt0);\
}

//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
#define _ata_blk_xfer_len_wr(val) \
{ \
  _mcu_register_wr(x_fmc_cnt3, val.u8.hi); _mcu_register_wr(x_fmc_cnt2, val.u8.lh);\
  _mcu_register_wr(x_fmc_cnt1, val.u8.hl); _mcu_register_wr(x_fmc_cnt0, val.u8.lo);\
}
#endif

// ---------------------------------------------------------------------
// Data Register (r/w -> used in conjunction with x_msb_ata/x_lsb_ata
// on the 97200-based systems
t_ata_register    ata_data            at_ata(0);  // rw

// ---------------------------------------------------------------------
// Error register (r)
t_ata_register    ata_error           at_ata(1);  // r

// atapi error bits
#define kbm_ata_error_illegal_length  0x01    // Illegal length
#define kbm_ata_error_eom             0x02    // end of media detected
#define kbm_ata_error_abort           0x04    // command aborted
#define kbm_ata_error_mcr             0x08    // Media change requested
#define kbm_ata_error_sense_msk       0xF0    // Sense Key (SCSI error code)
#define kbm_ata_error_sense_no_sense  0x00
#define k_ata_error_sense_recovered_error     0x10
#define k_ata_error_sense_not_ready           0x20
#define k_ata_error_sense_medium_error        0x30
#define k_ata_error_sense_hardware_error      0x40
#define k_ata_error_sense_illegal_request     0x50
#define k_ata_error_sense_unit_attention      0x60
#define k_ata_error_sense_data_protect        0x70
#define k_ata_error_sense_aborted_command     0xb0
#define k_ata_error_sense_miscompare          0xe0

// ata error bits
#define kbm_ata_error_unc             0x40    // uncorrectable error
#define kbm_ata_error_mc              0x20    // media has changed
#define kbm_ata_error_idnf            0x10    // address not found
#define kbm_ata_error_mcr             0x08    // media change requested
#define kbm_ata_error_abrt            0x04    // command aborted
#define kbm_ata_error_nm              0x02    // no media present

// ---------------------------------------------------------------------
#define ata_features ata_error                  //  w
t_ata_register  ata_sector_cnt      at_ata(2);  // r
t_ata_register  ata_sector_num      at_ata(3);
t_ata_register  ata_cylinder_lo     at_ata(4);
t_ata_register  ata_cylinder_hi     at_ata(5);

// ---------------------------------------------------------------------
// Device/Head Register
t_ata_register    ata_device_head     at_ata(6);  //  w
#define kbm_msk_ata_dev_lba_hi          0x0f        // bits 24 - 27 of lba (ata devices)
#define kbm_ata_dev_0                   0xa0     // Select master device (device 0)
#define kbm_ata_dev_1                   0xb0     // select slave device (device 1)
#define kbm_ata_dev_lba                 0x40     // use LBA addressing (ata devices)

// ---------------------------------------------------------------------
// Device Control Register (w)
t_ata_register  ata_dev_ctl           at_ata_alt(6);
#define kbm_ata_devctl_nien             0x02    // Interrupt Enable (active low)
#define kbm_ata_devctl_srst             0x04    // soft reset
#define kbm_ata_devctl_hob              0x80    // High-Order-Byte

// ---------------------------------------------------------------------------
// Status register, alternate status register (read only)
t_ata_register  ata_status            at_ata(7);  // r
#define ata_alt_status ata_dev_ctl                    // r
#define kbm_ata_status_err              0x01              // r    Check error register
#define kbm_ata_status_cerr             0x04    // Correctable error
#define kbm_ata_status_drq              0x08    // Data request
#define kbm_ata_status_dsc              0x10    // Drive seek complete
#define kbm_ata_status_srv              0x10    // Service request (overlapped only)
#define kbm_ata_status_df               0x20    // drive fault
#define kbm_ata_status_drdy             0x40    // drive ready
#define kbm_ata_status_bsy              0x80    // busy

// ---------------------------------------------------------------------
// Command register (write only)
#define    ata_command       ata_status         //  w

//------------------------------------------------------------------------------
// ATA Command Codes
#define k_ata_command_cfa_erase_sectors             0xc0
#define k_ata_command_cfa_request_ext_err           0x03
#define k_ata_command_cfa_translate_sector          0x87
#define k_ata_command_cfa_write_multiple_wo_erase   0xcd
#define k_ata_command_cfa_write_sectors_wo_erase    0x38
#define k_ata_command_check_power_mode              0xe5
#define k_ata_command_device_configuration_command  0xb1
#define k_ata_command_device_reset                  0x08
#define k_ata_command_download_microcode            0x92
#define k_ata_command_execute_device_diagnostic     0x90
#define k_ata_command_flush_cache                   0xe7
#define k_ata_command_flush_cache_ext               0xea
#define k_ata_command_get_media_status              0xda
#define k_ata_command_identify_device               0xec
#define k_ata_command_identify_packet_device        0xa1
#define k_ata_command_idle                          0xe3
#define k_ata_command_idle_immediate                0xe1
#define k_ata_command_initialize_device_parameters  0x91
#define k_ata_command_media_eject                   0xed
#define k_ata_command_media_lock                    0xde
#define k_ata_command_media_unlock                  0xdf
#define k_ata_command_nop                           0x00

⌨️ 快捷键说明

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