#pragma once #include // ======== PIO端口定义 ======== #define PORT_DISK0_DATA 0x1f0 // 数据 #define PORT_DISK0_ERR_STATUS 0x1f1 // 错误状态 #define PORT_DISK0_SECTOR_CNT 0x1f2 // 操作扇区数 #define PORT_DISK0_LBA_7_0 0x1f3 // 扇区号 / LBA[7:0] #define PORT_DISK0_LBA_15_8 0x1f4 // 柱面号[7:0] / LBA[15:8] #define PORT_DISK0_LBA_23_16 0x1f5 // 柱面号[15:8] / LBA[23:16] #define PORT_DISK0_DEVICE_CONFIGURE_REG 0x1f6 // 设备配置寄存器 #define PORT_DISK0_CONTROLLER_STATUS_CMD 0x1f7 // 控制器状态端口 / 控制器命令端口 #define PORT_DISK0_STATUS_CTRL_REG 0x3f6 // 状态寄存器 / 控制寄存器 #define PORT_DISK1_DATA 0x170 // 数据 #define PORT_DISK1_ERR_STATUS 0x171 // 错误状态 #define PORT_DISK1_SECTOR_CNT 0x172 // 操作扇区数 #define PORT_DISK1_LBA_7_0 0x173 // 扇区号 / LBA[7:0] #define PORT_DISK1_LBA_15_8 0x174 // 柱面号[7:0] / LBA[15:8] #define PORT_DISK1_LBA_23_16 0x175 // 柱面号[15:8] / LBA[23:16] #define PORT_DISK1_DEVICE_CONFIGURE_REG 0x176 // 设备配置寄存器 #define PORT_DISK1_CONTROLLER_STATUS_CMD 0x177 // 控制器状态端口 / 控制器命令端口 #define PORT_DISK1_STATUS_CTRL_REG 0x376 // 状态寄存器 / 控制寄存器 // ======= 状态寄存器的状态位 ========== #define DISK_STATUS_BUSY (1 << 7) // 控制器忙 #define DISK_STATUS_READY (1 << 6) // 驱动器准备就绪 #define DISK_STATUS_SEEK (1 << 4) // 驱动器寻道 #define DISK_STATUS_DATA_REQ (1 << 3) // 数据请求 #define DISK_STATUS_DATA_ERROR (1 << 0) // 命令执行错误 /** * @brief 执行0xec指令返回的512bytes的硬件设备识别信息 * 位于ATA8-ACS中 Table-22 */ struct ata_identify_device_data { // 0 General configuration bit-significant information unsigned short General_Config; // 1 Obsolete unsigned short Obsolete0; // 2 Specific configuration unsigned short Specific_Coinfig; // 3 Obsolete unsigned short Obsolete1; // 4-5 Retired unsigned short Retired0[2]; // 6 Obsolete unsigned short Obsolete2; // 7-8 Reserved for the CompactFlash Association unsigned short CompactFlash[2]; // 9 Retired unsigned short Retired1; // 10-19 Serial number (20 ASCII characters) unsigned short Serial_Number[10]; // 20-21 Retired unsigned short Retired2[2]; // 22 Obsolete unsigned short Obsolete3; // 23-26 Firmware revision(8 ASCII characters) unsigned short Firmware_Version[4]; // 27-46 Model number (40 ASCII characters) unsigned short Model_Number[20]; // 47 15:8 80h // 7:0 00h=Reserved // 01h-FFh = Maximumnumber of logical sectors that shall be transferred per DRQ data block on READ/WRITE MULTIPLE commands unsigned short Max_logical_transferred_per_DRQ; // 48 Trusted Computing feature set options unsigned short Trusted_Computing_feature_set_options; // 49 Capabilities unsigned short Capabilities0; // 50 Capabilities unsigned short Capabilities1; // 51-52 Obsolete unsigned short Obsolete4[2]; // 53 15:8 Free-fall Control Sensitivity // 7:3 Reserved // 2 the fields reported in word 88 are valid // 1 the fields reported in words (70:64) are valid unsigned short Report_88_70to64_valid; // 54-58 Obsolete unsigned short Obsolete5[5]; // 59 15:9 Reserved // 8 Multiple sector setting is valid // 7:0 xxh current setting for number of logical sectors that shall be transferred per DRQ data block on READ/WRITE Multiple commands unsigned short Mul_Sec_Setting_Valid; // 60-61 Total number of user addresssable logical sectors for 28bit CMD unsigned short Addressable_Logical_Sectors_for_28[2]; // 62 Obsolete unsigned short Obsolete6; // 63 15:11 Reserved // 10:8=1 Multiword DMA mode 210 is selected // 7:3 Reserved // 2:0=1 Multiword DMA mode 210 and below are supported unsigned short MultWord_DMA_Select; // 64 15:8 Reserved // 7:0 PIO mdoes supported unsigned short PIO_mode_supported; // 65 Minimum Multiword DMA transfer cycle time per word unsigned short Min_MulWord_DMA_cycle_time_per_word; // 66 Manufacturer`s recommended Multiword DMA transfer cycle time unsigned short Manufacture_Recommend_MulWord_DMA_cycle_time; // 67 Minimum PIO transfer cycle time without flow control unsigned short Min_PIO_cycle_time_Flow_Control; // 68 Minimum PIO transfer cycle time with IORDY flow control unsigned short Min_PIO_cycle_time_IOREDY_Flow_Control; // 69-70 Reserved unsigned short Reserved1[2]; // 71-74 Reserved for the IDENTIFY PACKET DEVICE command unsigned short Reserved2[4]; // 75 Queue depth unsigned short Queue_depth; // 76 Serial ATA Capabilities unsigned short SATA_Capabilities; // 77 Reserved for Serial ATA unsigned short Reserved3; // 78 Serial ATA features Supported unsigned short SATA_features_Supported; // 79 Serial ATA features enabled unsigned short SATA_features_enabled; // 80 Major Version number unsigned short Major_Version; // 81 Minor version number unsigned short Minor_Version; // 82 Commands and feature sets supported unsigned short Cmd_feature_sets_supported0; // 83 Commands and feature sets supported unsigned short Cmd_feature_sets_supported1; // 84 Commands and feature sets supported unsigned short Cmd_feature_sets_supported2; // 85 Commands and feature sets supported or enabled unsigned short Cmd_feature_sets_supported3; // 86 Commands and feature sets supported or enabled unsigned short Cmd_feature_sets_supported4; // 87 Commands and feature sets supported or enabled unsigned short Cmd_feature_sets_supported5; // 88 15 Reserved // 14:8=1 Ultra DMA mode 6543210 is selected // 7 Reserved // 6:0=1 Ultra DMA mode 6543210 and below are suported unsigned short Ultra_DMA_modes; // 89 Time required for Normal Erase mode SECURITY ERASE UNIT command unsigned short Time_required_Erase_CMD; // 90 Time required for an Enhanced Erase mode SECURITY ERASE UNIT command unsigned short Time_required_Enhanced_CMD; // 91 Current APM level value unsigned short Current_APM_level_Value; // 92 Master Password Identifier unsigned short Master_Password_Identifier; // 93 Hardware resset result.The contents of bits (12:0) of this word shall change only during the execution of a hardware reset. unsigned short HardWare_Reset_Result; // 94 Current AAM value // 15:8 Vendor’s recommended AAM value // 7:0 Current AAM value unsigned short Current_AAM_value; // 95 Stream Minimum Request Size unsigned short Stream_Min_Request_Size; // 96 Streaming Transger Time-DMA unsigned short Streaming_Transger_time_DMA; // 97 Streaming Access Latency-DMA and PIO unsigned short Streaming_Access_Latency_DMA_PIO; // 98-99 Streaming Performance Granularity (DWord) unsigned short Streaming_Performance_Granularity[2]; // 100-103 Total Number of User Addressable Logical Sectors for 48-bit commands (QWord) unsigned short Total_user_LBA_for_48_Address_Feature_set[4]; // 104 Streaming Transger Time-PIO unsigned short Streaming_Transfer_Time_PIO; // 105 Reserved unsigned short Reserved4; // 106 Physical Sector size/Logical Sector Size unsigned short Physical_Logical_Sector_Size; // 107 Inter-seek delay for ISO-7779 acoustic testing in microseconds unsigned short Inter_seek_delay; // 108-111 World wide name unsigned short World_wide_name[4]; // 112-115 Reserved unsigned short Reserved5[4]; // 116 Reserved for TLC unsigned short Reserved6; // 117-118 Logical sector size (DWord) unsigned short Words_per_Logical_Sector[2]; // 119 Commands and feature sets supported (Continued from words 84:82) unsigned short CMD_feature_Supported; // 120 Commands and feature sets supported or enabled (Continued from words 87:85) unsigned short CMD_feature_Supported_enabled; // 121-126 Reserved for expanded supported and enabled settings unsigned short Reserved7[6]; // 127 Obsolete unsigned short Obsolete7; // 128 Security status unsigned short Security_Status; // 129-159 Vendor specific unsigned short Vendor_Specific[31]; // 160 CFA power mode unsigned short CFA_Power_mode; // 161-167 Reserved for the CompactFlash Association unsigned short Reserved8[7]; // 168 Device Nominal Form Factor unsigned short Dev_from_Factor; // 169-175 Reserved unsigned short Reserved9[7]; // 176-205 Current media serial number (ATA string) unsigned short Current_Media_Serial_Number[30]; // 206 SCT Command Transport unsigned short SCT_Cmd_Transport; // 207-208 Reserved for CE-ATA unsigned short Reserved10[2]; // 209 Alignment of logical blocks within a physical block unsigned short Alignment_Logical_blocks_within_a_physical_block; // 210-211 Write-Read-Verify Sector Count Mode 3 (DWord) unsigned short Write_Read_Verify_Sector_Count_Mode_3[2]; // 212-213 Write-Read-Verify Sector Count Mode 2 (DWord) unsigned short Write_Read_Verify_Sector_Count_Mode_2[2]; // 214 NV Cache Capabilities unsigned short NV_Cache_Capabilities; // 215-216 NV Cache Size in Logical Blocks (DWord) unsigned short NV_Cache_Size[2]; // 217 Nominal media rotation rate unsigned short Nominal_media_rotation_rate; // 218 Reserved unsigned short Reserved11; // 219 NV Cache Options unsigned short NV_Cache_Options; // 220 Write-Read-Verify feature set current mode unsigned short Write_Read_Verify_feature_set_current_mode; // 221 Reserved unsigned short Reserved12; // 222 Transport major version number. // 0000h or ffffh = device does not report version unsigned short Transport_Major_Version_Number; // 223 Transport Minor version number unsigned short Transport_Minor_Version_Number; // 224-233 Reserved for CE-ATA unsigned short Reserved13[10]; // 234 Minimum number of 512-byte data blocks per DOWNLOAD MICROCODE command for mode 03h unsigned short Mini_blocks_per_CMD; // 235 Maximum number of 512-byte data blocks per DOWNLOAD MICROCODE command for mode 03h unsigned short Max_blocks_per_CMD; // 236-254 Reserved unsigned short Reserved14[19]; // 255 Integrity word // 15:8 Checksum // 7:0 Checksum Validity Indicator unsigned short Integrity_word; } __attribute__((packed)); /** * @brief 初始化ATA磁盘驱动程序 * */ void ata_init();