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