www.pudn.com > SMSC USB2.0.zip > 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
#define k_ata_command_packet 0xa0
#define k_ata_command_read_buffer 0xe4
#define k_ata_command_read_dma 0xc8
#define k_ata_command_read_dma_ext 0x25
#define k_ata_command_read_dma_queued 0xc7
#define k_ata_command_read_dma_queued_ext 0x26
#define k_ata_command_read_multiple 0xc4
#define k_ata_command_read_multiple_ext 0x29
#define k_ata_command_read_native_max_address 0xf8
#define k_ata_command_read_native_max_address_ext 0x27
#define k_ata_command_read_sectors 0x20
#define k_ata_command_read_sectors_ext 0x24
#define k_ata_command_read_verify_sectors 0x40
#define k_ata_command_read_verify_sectors_ext 0x42
#define k_ata_command_security_disable_password 0xf6
#define k_ata_command_security_erase_prepare 0xf3
#define k_ata_command_security_erase_unit 0xf4
#define k_ata_command_security_freeze 0xf5
#define k_ata_command_security_set_password 0xf1
#define k_ata_command_security_unlock 0xf2
#define k_ata_command_seek 0x70
#define k_ata_command_service 0xa2
#define k_ata_command_set_features 0xeF
#define k_ata_command_set_max_address 0xf9
#define k_ata_command_set_max_address_ext 0x37
#define k_ata_command_set_multiple_mode 0xc6
#define k_ata_command_sleep 0xe6
#define k_ata_command_smart_command 0xb0
#define k_ata_command_standby 0xe2
#define k_ata_command_standby_immediate 0xe0
#define k_ata_command_write_buffer 0xe8
#define k_ata_command_write_dma 0xcA
#define k_ata_command_write_dma_ext 0x35
#define k_ata_command_write_dma_queued 0xcc
#define k_ata_command_write_dma_queued_ext 0x36
#define k_ata_command_write_multiple 0xc5
#define k_ata_command_write_multiple_ext 0x39
#define k_ata_command_write_sectors 0x30
#define k_ata_command_write_sectors_ext 0x34
//------------------------------------------------------------------------------
// legacy nemae from the 201 code to facilitate code reuse
#define x_msb_ata x_cf_msb_ata
#define x_lsb_ata x_cf_lsb_ata
//------------------------------------------------------------------------------
// some quick macros to aid readability
#define _ata_is_media_removable() (_lun_data(media) & kbm_lun_media_removable)
#define _ata_is_media_present() (_lun_data(media) & kbm_lun_media_present)
//------------------------------------------------------------------------------
// read/write access to ata registers
uint8 ata_register_rd(t_ata_register_ref) reentrant;
void ata_register_wr(t_ata_register_ref, uint8) reentrant;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void ata_detect_media(void) reentrant;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void ata_idle_immediate(void) reentrant;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void ata_standby_immediate(void) reentrant;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void ata_sleep(void) reentrant;
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
t_result ata_wait_status_with_timeout(uint8 mask, uint8 val, uint16 ticks, uint8 *statusp) reentrant;
t_result ata_wait_irq_with_timeout(uint16 ticks) reentrant;
// ----------------------------------------------------------------------------
// ata identify device general config (word 0)
// ----------------------------------------------------------------------------
#define k_ata_iddev_general_config 0
#define kbm_ata_iddev_gc_removable 0x0080
#define kbm_ata_iddev_gc_fixed 0x0040
// ----------------------------------------------------------------------------
#define k_ata_iddev_num_log_cyl 1
// ----------------------------------------------------------------------------
// ata identify device specific configuration (word 2)
// ----------------------------------------------------------------------------
#define k_ata_iddev_specific_config 2
#define k_ata_iddev_sc_sf_spinup_incomplete 0x37c8
#define k_ata_iddev_sc_sf_spinup_complete 0x738C
#define k_ata_iddev_sc_no_sf_spinup_incomplete 0x8c73
#define k_ata_iddev_sc_no_sf_spinup_complete 0xc837
// ----------------------------------------------------------------------------
// ata identify device number of logical heads word
// ----------------------------------------------------------------------------
#define k_ata_iddev_num_log_hds 3
// ----------------------------------------------------------------------------
// ata identify device number of logical sectors per logical track
// ----------------------------------------------------------------------------
#define k_ata_iddev_num_log_sec_per_log_track 6
// ----------------------------------------------------------------------------
// ata identify device serial number (words 10-19)
// ----------------------------------------------------------------------------
#define k_ata_iddev_serial_start 10
#define k_ata_iddev_serial_length 20 // asci chars... not words!
// ----------------------------------------------------------------------------
// burst size for read/write multiple
// ----------------------------------------------------------------------------
#define k_ata_iddev_multi_burst_size 47
// ----------------------------------------------------------------------------
// ata identify device capabilities (word 49, 50)
// ----------------------------------------------------------------------------
#define k_ata_iddev_caps_l 49
#define k_ata_iddev_caps_h 50
#define kbm_ata_iddev_caps_timer_values_per_spec 0x2000
#define kbm_ata_iddev_caps_support_iordy 0x0800
#define kbm_ata_iddev_caps_disable_iordy 0x0400
#define kbm_ata_iddev_caps_support_lba 0x0200
#define kbm_ata_iddev_caps_support_dma 0x0100
// dev_caps_50
#define kbm_ata_iddev_caps_min_standby_timer 0x0001
// ----------------------------------------------------------------------------
// PIO Data Transfer Cycle Timing Mode for device (obsolete in ATA-6)
// ----------------------------------------------------------------------------
#define k_ata_iddev_pio_mode 51
#define k_ata_iddev_pio_mode_0 0x0000
#define k_ata_iddev_pio_mode_1 0x0100
#define k_ata_iddev_pio_mode_2 0x0200
#define k_ata_iddev_pio_mode_3 0x0300
#define k_ata_iddev_pio_mode_4 0x0400
// ----------------------------------------------------------------------------
// valid fields flags (word 53)
// ----------------------------------------------------------------------------
#define k_ata_iddev_valid_fields 53
#define kbm_ata_iddev_valid_fields_cur_log_chs_cap 0x0001
#define kbm_ata_iddev_valid_fields_pio_mwdma_timing 0x0002
#define kbm_ata_iddev_valid_fields_udma_modes 0x0004
// ----------------------------------------------------------------------------
// current num logical cylinders (word 54)
// ----------------------------------------------------------------------------
#define k_ata_iddev_cur_log_cyl 54
// ----------------------------------------------------------------------------
// num logical heads (word 55)
// ----------------------------------------------------------------------------
#define k_ata_iddev_cur_log_hds 55
// ----------------------------------------------------------------------------
// num logical sectors per track (word 56)
// ----------------------------------------------------------------------------
#define k_ata_iddev_cur_log_sec_per_trk 56
// ----------------------------------------------------------------------------
// currect sector capacity (word 57-58)
// ----------------------------------------------------------------------------
#define k_ata_iddev_cur_sector_cap_l 57
#define k_ata_iddev_cur_sector_cap_h 58
// ----------------------------------------------------------------------------
// multiple sector setting (word 59)
// ----------------------------------------------------------------------------
#define k_ata_iddev_multiple_sector_settings 59
#define kbm_ata_iddev_multiple_sector_setting_valid 0x0100
// ----------------------------------------------------------------------------
// total user addressable sectors (lba only) (word 60-61)
// ----------------------------------------------------------------------------
#define k_ata_iddev_total_user_addressable_sectors_l 60
#define k_ata_iddev_total_user_addressable_sectors_h 61
// ----------------------------------------------------------------------------
// ata identify device multiword dma modes supported (word 63)
// ----------------------------------------------------------------------------
#define k_ata_iddev_mwdma_mode_support 63
#define kbm_ata_iddev_mwdma_mode_0_supported 0x0001
#define kbm_ata_iddev_mwdma_mode_1_supported 0x0002
#define kbm_ata_iddev_mwdma_mode_2_supported 0x0004
#define kbm_ata_iddev_mwdma_mode_0_selected 0x0100
#define kbm_ata_iddev_mwdma_mode_1_selected 0x0200
#define kbm_ata_iddev_mwdma_mode_2_selected 0x0400
// ----------------------------------------------------------------------------
// ata pio and mwdma cycle times
// ----------------------------------------------------------------------------
#define k_ata_iddev_pio_mode_support 64
#define k_ata_iddev_min_mwdma_cycles 65
#define k_ata_iddev_mfr_recommened_mwdma_cycles 66
#define k_ata_iddev_min_pio_xfer_cycle_no_flow 67
#define k_ata_iddev_min_pio_xfer_cycle_flow 68
// ----------------------------------------------------------------------------
// command/feature set support (word 82-84)
// command/feature set enabled (word 85-87)
// ----------------------------------------------------------------------------
#define k_ata_dev_cmdset_support_1 82
#define k_ata_dev_cmdset_enabled_1 85
#define kbm_ata_iddev_cmd_nop 0x4000
#define kbm_ata_iddev_cmd_read_buffer 0x2000
#define kbm_ata_iddev_cmd_write_buffer 0x1000
#define kbm_ata_iddev_host_protected_area 0x0400
#define kbm_ata_iddev_cmd_device_reset 0x0200
#define kbm_ata_iddev_service_intrpt 0x0100
#define kbm_ata_iddev_release_intrpt 0x0080
#define kbm_ata_iddev_cmd_look_ahead 0x0040
#define kbm_ata_iddev_cmd_write_cache 0x0020
#define kbm_ata_iddev_fs_packet 0x0010
#define kbm_ata_iddev_fs_power_mgmt 0x0008
#define kbm_ata_iddev_fs_removable_media 0x0004
#define kbm_ata_iddev_fs_security_mode 0x0002
#define kbm_ata_iddev_fs_smart 0x0001
#define k_ata_dev_cmdset_support_2 83
#define k_ata_dev_cmdset_enabled_2 86
#define kbm_ata_iddev_cmd_flush_cache_ext 0x2000
#define kbm_ata_iddev_cmd_flush_cache 0x1000
#define kbm_ata_iddev_fs_device_cfg_overlay 0x0800
#define kbm_ata_iddev_fs_48bit_address 0x0400
#define kbm_ata_iddev_fs_auto_acoustic_mgmt 0x0200
#define kbm_ata_iddev_cmd_set_max_security_ext 0x0100
#define kbm_ata_iddev_cfg_set_features_spinup_req_on_por 0x0040
#define kbm_ata_iddev_fs_powerup_in_standby 0x0020
#define kbm_ata_iddev_fs_removable_media_status_notify 0x0010
#define kbm_ata_iddev_fs_adv_power_mgmt 0x0008
#define kbm_ata_iddev_fs_cfa 0x0004
#define kbm_ata_iddev_cmd_rw_dma_queued 0x0002
#define kbm_ata_iddev_cmd_download_microcode 0x0001
#define k_ata_dev_cmdset_support_3 84
#define k_ata_dev_cmdset_enabled_3 87
#define kbm_ata_iddev_fs_smart_selftest 0x0002
#define kbm_ata_iddev_fs_smart_error_logging 0x0001
// ----------------------------------------------------------------------------
// ata identify device ultra dma mode support (word 88)
// ----------------------------------------------------------------------------
#define k_ata_iddev_udma_mode_support 88
#define kbm_ata_iddev_udma_mode_0_supported 0x0001
#define kbm_ata_iddev_udma_mode_1_supported 0x0002
#define kbm_ata_iddev_udma_mode_2_supported 0x0004
#define kbm_ata_iddev_udma_mode_3_supported 0x0008
#define kbm_ata_iddev_udma_mode_4_supported 0x0010
#define kbm_ata_iddev_udma_mode_5_supported 0x0020
#define kbm_ata_iddev_udma_mode_0_selected 0x0040
#define kbm_ata_iddev_udma_mode_1_selected 0x0080
#define kbm_ata_iddev_udma_mode_2_selected 0x0100
#define kbm_ata_iddev_udma_mode_3_selected 0x0200
#define kbm_ata_iddev_udma_mode_4_selected 0x0400
#define kbm_ata_iddev_udma_mode_5_selected 0x0800
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ata identify packet device
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// ata identify device general config (word 0)
// ----------------------------------------------------------------------------
#define k_ata_idpktdev_general_config 0
#define kbm_msk_ata_idpktdev_general_config_drq_type 0x0060
#define kbm_ata_idpktdev_general_config_drq_poll 0x0000 // host polls for DRQ. Device does not interrupt
#define kbm_ata_idpktdev_general_config_drq_intrpt_10ms 0x0020 // device will interrupt and assert drq w/in 10 ms
#define kbm_ata_idpktdev_general_config_drq_intrpt_50us 0x0040 // device will interrupt and assert drq w/in 50 us
// ----------------------------------------------------------------------------
// ata identify device general config (word 0)
// ----------------------------------------------------------------------------
// Capabilities
#define kbm_ata_idpktdev_capabilities_dma 0x0100 // Capabilities - Device is capable of DMA transfers
#define kbm_ata_idpktdev_capabilities_lba 0x0200 // Capabilities - Device supports Logical Block Addressing - Mandatory for ATAPI devices
#define kbm_ata_idpktdev_capabilities_disable_iordy 0x0400 // Capabilities - Device supports disabling IORDY
#define kbm_ata_idpktdev_capabilities_support_iordy 0x0800 // Capabilities - Device supports use of IORDY bit
// ----------------------------------------------------------------------------
// ata identify device general config (word 0)
// ----------------------------------------------------------------------------
// DMA Mode
#define k_ata_idpktdev_mwdma_mode_support 63
#define kbm_ata_idpktdev_mwdma_mode_0_supported 0x0001
#define kbm_ata_idpktdev_mwdma_mode_1_supported 0x0002
#define kbm_ata_idpktdev_mwdma_mode_2_supported 0x0004
#define kbm_ata_idpktdev_mwdma_mode_0_selected 0x0100
#define kbm_ata_idpktdev_mwdma_mode_1_selected 0x0200
#define kbm_ata_idpktdev_mwdma_mode_2_selected 0x0400
// ----------------------------------------------------------------------------
// ata identify device general config (word 0)
// ----------------------------------------------------------------------------
#define k_ata_idpktdev_udma_mode_support 88
#define kbm_ata_idpktdev_udma_mode_0_supported 0x0001
#define kbm_ata_idpktdev_udma_mode_1_supported 0x0002
#define kbm_ata_idpktdev_udma_mode_2_supported 0x0004
#define kbm_ata_idpktdev_udma_mode_3_supported 0x0008
#define kbm_ata_idpktdev_udma_mode_4_supported 0x0010
#define kbm_ata_idpktdev_udma_mode_5_supported 0x0020
#define kbm_ata_idpktdev_udma_mode_0_selected 0x0040
#define kbm_ata_idpktdev_udma_mode_1_selected 0x0080
#define kbm_ata_idpktdev_udma_mode_2_selected 0x0100
#define kbm_ata_idpktdev_udma_mode_3_selected 0x0200
#define kbm_ata_idpktdev_udma_mode_4_selected 0x0400
#define kbm_ata_idpktdev_udma_mode_5_selected 0x0800
t_result ata_identify_device(uint8 cmd) reentrant;
// ------------------------------------------------------------------
// Set features functions
// ------------------------------------------------------------------
#define k_set_features_enable_write_cache 0x02
#define k_set_features_set_transfer_mode 0x03
#define k_set_features_enable_adv_power_mgmt 0x05
#define k_set_features_enable_powerup_standby 0x06
#define k_set_features_powerup_in_standby_set_dev_spinup 0x07
#define k_set_features_disable_media_status_notification 0x31
#define k_set_features_enable_release_intrpt 0x5d
#define k_set_features_enable_service_intrpt 0x5e
#define k_set_features_disable_revert_to_power_on_defaults 0x66
#define k_set_features_disable_write_cache 0x82
#define k_set_features_disable_adv_power_mgmt 0x85
#define k_set_features_disable_powerup_standby 0x86
#define k_set_features_enable_media_status_notification 0x95
#define k_set_features_enable_read_look_ahead_feature 0xaa
#define k_set_features_enable_reverting_to_power_on_defaults 0xcc
#define k_set_features_disable_release_intrpt 0xdd
#define k_set_features_disable_service_intrpt 0xde
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
extern t_result ata_set_features(uint8 feature, uint8 sc, uint8 sn, uint8 cyl_hi, uint8 cyl_lo) reentrant;
// -----------------------------------------------------------------------------
// set_features sub commands
// _ata_set_transfer_mode(transfer_mode, transfer_level)
// _ata_enable_adv_pwr_mgmt( t_bool )
// _ata_enable_pwrup_in_standby( t_bool )
// _ata_enable_media_sts_notify( t_bool )
// _ata_enable_release_irq( t_bool )
// _ata_enable_service_irq( t_bool )
// _ata_enable_revert_to_por_defaults( t_bool )
// _ata_enable_write_cache( t_bool )
// _ata_enable_rd_lookahead( t_bool )
// -----------------------------------------------------------------------------
#define kbm_sf_tm_pio_default 0x00
#define kbm_sf_tm_pio_flow_control 0x08
#define kbm_sf_tm_mwdma 0x20
#define kbm_sf_tm_udma 0x40
#define kbm_sf_tm_pio_disable_iordy 0x01
#define kbm_sf_tm_mode0 0x00
#define kbm_sf_tm_mode1 0x01
#define kbm_sf_tm_mode2 0x02
#define kbm_sf_tm_mode3 0x03
#define kbm_sf_tm_mode4 0x04
#define kbm_sf_tm_mode5 0x05
#define _ata_set_transfer_mode(transfer_mode, transfer_level) \
ata_set_features(k_set_features_set_transfer_mode, (transfer_mode)|transfer_level, 0, 0, 0 );
// -----------------------------------------------------------------------------
// ata state machine globals
extern xdata uint8 g_dma_mode_current;
// ata device capabilities & properties
// these are all relevant properties from ata identify device data.
//extern xdata uint32 g_total_sectors;
extern xdata uint16 g_ata_dev_cmdset_support_1;
extern xdata uint16 g_ata_dev_cmdset_support_2;
extern xdata uint16 g_ata_dev_cmdset_support_3;
extern xdata uint16 g_ata_dev_cmdset_enabled_1;
extern xdata uint16 g_ata_dev_cmdset_enabled_2;
extern xdata uint16 g_ata_dev_cmdset_enabled_3;
extern xdata uint16 g_ata_dev_num_log_cyl;
extern xdata uint16 g_ata_dev_num_log_hds;
extern xdata uint16 g_ata_dev_num_log_sec_per_trk;
extern xdata uint16 g_ata_dev_caps_1;
extern xdata uint16 g_ata_dev_caps_2;
#define k_sz_ata_dev_str_ser 20
extern xdata uint8 g_ata_dev_has_ser;
extern xdata uint8 g_ata_dev_str_ser_sz;
extern xdata uint8 g_ata_dev_str_ser[k_sz_ata_dev_str_ser]; // $$$ cds -> move to fmc.c
//------------------------------------------------------------------------------
// ata_reset is s function called by dfa_ata_reset_media
void ata_reset(void) reentrant;
void dfa_ata_reset_media(void) reentrant;
#undef _v_dfa_lun_reset_media
#define _v_dfa_lun_reset_media dfa_ata_reset_media
//------------------------------------------------------------------------------
void dfa_ata_initialize_media(void) reentrant;
#undef _v_dfa_lun_initialize_media
#define _v_dfa_lun_initialize_media dfa_ata_initialize_media
//------------------------------------------------------------------------------
void dfa_ata_identify_media(void) reentrant;
#undef _v_dfa_lun_identify_media
#define _v_dfa_lun_identify_media dfa_ata_identify_media
//------------------------------------------------------------------------------
void dfa_ata_read(void) reentrant;
#undef _v_dfa_lun_read
#define _v_dfa_lun_read dfa_ata_read
//------------------------------------------------------------------------------
void dfa_ata_write(void) reentrant;
#undef _v_dfa_lun_write
#define _v_dfa_lun_write dfa_ata_write
//------------------------------------------------------------------------------
void dfa_ata_verify(void) reentrant;
#undef _v_dfa_lun_verify
#define _v_dfa_lun_verify dfa_ata_verify
//------------------------------------------------------------------------------
// ata inherits from lun
#define _v_ata _v_lun
typedef uint8 t_ata_vtbl_ix;
typedef enum e_ata_vtbl_entry
{
k_ata_vtbl_sz = k_lun_vtbl_sz
};
extern code _vtbl_decl(ata);
#else
#error "warning: header included too many times!"
#endif // __ata_dot_h__
//---eof------------------------------------------------------------------------