📄 ata._h
字号:
#ifndef __ata_h
#define __ata_h
//******************************************************************
//* FUNCTION PROTOTYPES
//******************************************************************
int init_ata(unsigned char device);
void ata_hard_reset(void);
void ata_select_device(unsigned char device);
void ata_write_word(unsigned char reg,unsigned int wordout);
void ata_write_byte(unsigned char reg,unsigned char byteout);
unsigned int ata_read_word(unsigned char reg);
unsigned char ata_read_byte(unsigned char reg);
unsigned char ata_rdy(void);
unsigned char ata_bsy(void);
unsigned char ata_drq(void);
unsigned char ata_err(void);
void ata_write_sector(unsigned char device, unsigned long lbasector, unsigned int *ptr);
void ata_read_sector_byte(unsigned char device, unsigned long lbasector,
unsigned int from, unsigned int qte,unsigned char *ptr);
//******************************************************************
//* ATA Definitions
//******************************************************************
// CB_ERR ERROR REGISTER BITS
#define ATA_ER_BBK 0x80 // ATA bad block
#define ATA_ER_UNC 0x40 // ATA uncorrected error
#define ATA_ER_MC 0x20 // ATA media change
#define ATA_ER_IDNF 0x10 // ATA id not found
#define ATA_ER_MCR 0x08 // ATA media change request
#define ATA_ER_ABRT 0x04 // ATA command aborted
#define ATA_ER_NTK0 0x02 // ATA track 0 not found
#define ATA_ER_NDAM 0x01 // ATA address mark not found
// CB_DH bits 7-4 OF THE DEVICE/HEAD REGISTER
#define ATA_DH_DEV0 0xE0 // select device 0 LBA MODE
#define ATA_DH_DEV1 0xF0 // select device 1 LBA MODE
// CB_STAT REGISTER BITS
#define ATA_STAT_BSY 0x80 // ATA busy
#define ATA_STAT_RDY 0x40 // ATA ready
#define ATA_STAT_DF 0x20 // ATA device fault
#define ATA_STAT_SKC 0x10 // ATA seek complete
#define ATA_STAT_DRQ 0x08 // ATA data request
#define ATA_STAT_CORR 0x04 // ATA corrected
#define ATA_STAT_IDX 0x02 // ATA index
#define ATA_STAT_ERR 0x01 // ATA error
// CB_DC REGISTER BITS
#define ATA_DC_HD15 0x08 // bit should always be set to one
#define ATA_DC_SRST 0x04 // soft reset
#define ATA_DC_NIEN 0x02 // disable interrupts
//ATA commands (from ATA-3),
#define CMD_CFA_ERASE_SECTORS 0xC0
#define CMD_CFA_REQUEST_EXT_ERR_CODE 0x03
#define CMD_CFA_TRANSLATE_SECTOR 0x87
#define CMD_CFA_WRITE_MULTIPLE_WO_ERASE 0xCD
#define CMD_CFA_WRITE_SECTORS_WO_ERASE 0x38
#define CMD_CHECK_POWER_MODE1 0xE5
#define CMD_CHECK_POWER_MODE2 0x98
#define CMD_DEVICE_RESET 0x08
#define CMD_EXECUTE_DEVICE_DIAGNOSTIC 0x90
#define CMD_FLUSH_CACHE 0xE7
#define CMD_FORMAT_TRACK 0x50
#define CMD_IDENTIFY_DEVICE 0xEC
#define CMD_IDENTIFY_DEVICE_PACKET 0xA1
#define CMD_IDENTIFY_PACKET_DEVICE 0xA1
#define CMD_IDLE1 0xE3
#define CMD_IDLE2 0x97
#define CMD_IDLE_IMMEDIATE1 0xE1
#define CMD_IDLE_IMMEDIATE2 0x95
#define CMD_INITIALIZE_DRIVE_PARAMETERS 0x91
#define CMD_INITIALIZE_DEVICE_PARAMETERS 0x91
#define CMD_NOP 0x00
#define CMD_PACKET 0xA0
#define CMD_READ_BUFFER 0xE4
#define CMD_READ_DMA 0xC8
#define CMD_READ_DMA_QUEUED 0xC7
#define CMD_READ_MULTIPLE 0xC4
#define CMD_READ_SECTORS 0x20
#define CMD_READ_VERIFY_SECTORS 0x40
#define CMD_RECALIBRATE 0x10
#define CMD_SEEK 0x70
#define CMD_SET_FEATURES 0xEF
#define CMD_SET_MULTIPLE_MODE 0xC6
#define CMD_SLEEP1 0xE6
#define CMD_SLEEP2 0x99
#define CMD_STANDBY1 0xE2
#define CMD_STANDBY2 0x96
#define CMD_STANDBY_IMMEDIATE1 0xE0
#define CMD_STANDBY_IMMEDIATE2 0x94
#define CMD_WRITE_BUFFER 0xE8
#define CMD_WRITE_DMA 0xCA
#define CMD_WRITE_DMA_QUEUED 0xCC
#define CMD_WRITE_MULTIPLE 0xC5
#define CMD_WRITE_SECTORS 0x30
#define CMD_WRITE_VERIFY 0x3C
//ATA I/O PORT FUNCTIONS AND ADDRESS DEFINITIONS
//*CONTROL BLOCK REGISTERS
// DIOW
// |DIOR
// ||DA1
// |||DA2
// ||||DA0
// |||||CS1
// ||||||CS0
// |||||||NC
// ||||||||
#define ATA_IO_HIZ 0b11111111
#define ATA_IO_ASTAT 0b11110011
#define ATA_IO_DEVICECNTL 0b11110011
//*COMMAND BLOCK REGISTER ADDRESSES
#define ATA_IO_DATA 0b11000101
#define ATA_IO_ERROR 0b11001101
#define ATA_IO_FEATURES 0b11001101
#define ATA_IO_SECTORCNT 0b11100101
#define ATA_IO_SECTORNUM 0b11101101
#define ATA_IO_CYL_L 0b11010101
#define ATA_IO_CYL_H 0b11011101
#define ATA_IO_DEVICE_HEAD 0b11110101
#define ATA_IO_STATUS 0b11111101
#define ATA_IO_CMD 0b11111101
//ATMega128 PIN DEFINITIONS
//ATA Drive
#define PORT_ATA_DATA1_DDR DDRA
#define PORT_ATA_DATA1_OUT PORTA
#define PORT_ATA_DATA1_IN PINA
#define PORT_ATA_DATA2_DDR DDRC
#define PORT_ATA_DATA2_OUT PORTC
#define PORT_ATA_DATA2_IN PINC
#define PORT_ATA_IO_CNTL_DDR DDRF
#define PORT_ATA_IO_CNTL PORTF
#define PORT_ATA_RST_CNTL_DDR DDRG
#define PORT_ATA_RST_CNTL PORTG
#define ATA_CS0 0x02
#define ATA_CS1 0x04
#define ATA_A0 0x08
#define ATA_A1 0x20
#define ATA_A2 0x10
#define ATA_IOR 0x40
#define ATA_IOW 0x80
#define ATA_RESET 0x02
#define ata_databus_in PORT_ATA_DATA1_DDR = 0x00; \
PORT_ATA_DATA2_DDR = 0x00;
#define ata_databus_out PORT_ATA_DATA1_DDR = 0xff; \
PORT_ATA_DATA2_DDR = 0xff;
#define ata_write_pulse PORT_ATA_IO_CNTL &= ~ATA_IOW; \
delay_us(1); \
PORT_ATA_IO_CNTL |= ATA_IOW;
#define busy ata_bsy()
#define drq ata_drq()
#define error ata_err()
#define ready ata_rdy()
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -