📄 ata.h
字号:
/*============================================================================
____________________________________________________________________________
______________________________________________
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 + -