ata.h 11 KB

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