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

📄 ata._h

📁 diy硬盘mp3的程序
💻 _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 + -