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------------------------------------------------------------------------