|
@@ -0,0 +1,345 @@
|
|
|
+#pragma once
|
|
|
+
|
|
|
+#include "../../common/glib.h"
|
|
|
+
|
|
|
+// ======== 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_LBA_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中
|
|
|
+ */
|
|
|
+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();
|