📄 hal4ata.lst
字号:
221 1 if(Hal4ATA_SelDevice())
222 1 {
223 2 // Send IDE IDENTIFY command.
224 2 // IDE_COMMAND_IDENTIFY=0xEC ;
225 2 Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, IDE_COMMAND_IDENTIFY);
226 2
227 2 if(Hal4ATA_WaitOnBusyNDrq())
228 2 {
229 3 /*
230 3 // Suck out 256 words. After waiting for one model that asserts busy
231 3 // after receiving the Packet Identify command.
232 3 */
233 3 if(Hal4ATA_InitDevExt())
234 3 retStatus = TRUE;
235 3 }
236 2
237 2 /*
238 2 // Work around for some IDE and one model Atapi that will present more than
239 2 // 256 words for the Identify data.
240 2 */
241 2 for (i=10000; i != 0; i--)
C51 COMPILER V7.06 HAL4ATA 02/17/2004 14:42:23 PAGE 5
242 2 {
243 3 Hal4ATA_GetStatus();
244 3 if (Hal4ATA_StatusByte_DRQ)
245 3 {
246 4 /*
247 4 // Suck out any remaining bytes and throw away.
248 4 */
249 4 Hal4Sys_ATADataPortInW();
250 4 }
251 3 else
252 3 break;
253 3 }
254 2 }
255 1 return retStatus;
256 1 } /* end IssueIdentify()*/
257
258
259 BOOLEAN
260 Hal4ATA_InitDevExt(void)
261 {
262 1 INT8 c;
263 1 if(Hal4ATA_WaitOnBusyNDrq())
264 1 {
265 2 ATADevExt_IDData.GeneralConfiguration = Hal4Sys_ATADataPortInW();//INT16 00
266 2 ATADevExt_IDData.NumberOfCylinders = Hal4Sys_ATADataPortInW();//INT16 01
267 2 Hal4Sys_ATADataPortInW();
268 2 ATADevExt_IDData.NumberOfHeads = Hal4Sys_ATADataPortInW();//INT16 03
269 2
270 2 for(c = 2 ; c != 0; c--)
271 2 Hal4Sys_ATADataPortInW();
272 2 ATADevExt_IDData.SectorsPerTrack = Hal4Sys_ATADataPortInW();//INT16 06
273 2
274 2 for(c = 40 ; c != 0; c--) // 7 -47
275 2 Hal4Sys_ATADataPortInW();
276 2 ATADevExt_IDData.MaximumBlockTransfer = Hal4Sys_ATADataPortInW();//INT8 47
277 2
278 2 Hal4Sys_ATADataPortInW(); // 48
279 2 ATADevExt_IDData.Capabilities = Hal4Sys_ATADataPortInW();//INT16 49
280 2
281 2 for(c = 4; c != 0; c--)
282 2 Hal4Sys_ATADataPortInW();
283 2 ATADevExt_IDData.NumberOfCurrentCylinders = Hal4Sys_ATADataPortInW();//INT16 54
284 2 ATADevExt_IDData.NumberOfCurrentHeads = Hal4Sys_ATADataPortInW();//INT16 55
285 2 ATADevExt_IDData.CurrentSectorsPerTrack = Hal4Sys_ATADataPortInW();//INT16 56
286 2 ATADevExt_IDData.CurrentSectorCapacity.ints.i0 = Hal4Sys_ATADataPortInW();//INT32 57
287 2 ATADevExt_IDData.CurrentSectorCapacity.ints.i1 = Hal4Sys_ATADataPortInW();//
288 2
289 2 if(ATADevExt_IDData.CurrentSectorCapacity.u0 == 0)
290 2 {
291 3 ATADevExt_IDData.NumberOfCurrentCylinders = ATADevExt_IDData.NumberOfCylinders;
292 3 ATADevExt_IDData.NumberOfCurrentHeads = ATADevExt_IDData.NumberOfHeads ;//INT16 55
293 3 ATADevExt_IDData.CurrentSectorsPerTrack = ATADevExt_IDData.SectorsPerTrack;//INT16 56
294 3 ATADevExt_IDData.CurrentSectorCapacity.u0 = (INT32)ATADevExt_IDData.NumberOfCurrentCylinders *
- ATADevExt_IDData.NumberOfCurrentHeads * ATADevExt_IDData.CurrentSectorsPerTrack;
295 3 }
296 2 return(TRUE);
297 2 }
298 1 else
299 1 return(FALSE);
300 1 }
301
302
C51 COMPILER V7.06 HAL4ATA 02/17/2004 14:42:23 PAGE 6
303 BOOLEAN
304 Hal4ATA_IsLBAmode(void)
305 { Hal4ATA_DevReg_LBA = 1;
306 1 return(Hal4ATA_DevReg_LBA);
307 1 }
308
309
310 BOOLEAN
311 Hal4ATA_SetFeature(void)
312 { /* BOOLEAN retStatus = FALSE;
313 1 Hal4Sys_ATAPortOutB(ATAREG4OUT_FEATURE,0x03);
314 1 Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_COUNT, 0x08);
315 1
316 1 Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,0);
317 1 Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,0);
318 1 Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,0);
319 1
320 1 Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, 0xEF);
321 1 while(TRUE)
322 1 {
323 1 if(Hal4ATA_WaitOnBusyNDrdy())
324 1 {
325 1 retStatus = TRUE;
326 1 break;
327 1 }
328 1 }
329 1 return retStatus;*/
330 1 return TRUE;
331 1 }
332
333
334 /*
335 //*************************************************************************
336 // Subroutines -- level 5 ATA transaction
337 //*************************************************************************
338 */
339 BOOLEAN
340 Hal4ATA_IdeHardReset(void)
341 {
342 1 //INT8 c;
343 1 BOOLEAN retStatus = FALSE;
344 1
345 1 ATA_RST_N = 0;
346 1 Hal4Sys_WaitInUS(320); // >25 US
347 1 ATA_RST_N = 1;
348 1
349 1 // for(c = 10; c != 0; c--)
350 1 Hal4Sys_WaitInUS(50000); // 50MS
351 1
352 1 if(Hal4ATA_SelDevice())
353 1 {
354 2 // Hal4ATA_DevReg_DEV = FALSE;
355 2 // Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD,Hal4ATA_DevReg);
356 2 // }
357 2
358 2 while(TRUE)
359 2 {
360 3 if(Hal4ATA_WaitOnBusyNDrdy())
361 3 {
362 4 retStatus = TRUE;
363 4 break;
364 4 }
C51 COMPILER V7.06 HAL4ATA 02/17/2004 14:42:23 PAGE 7
365 3 }
366 2 }
367 1 return retStatus;
368 1 }
369
370
371 BOOLEAN
372 Hal4ATA_FindIDEDevice(void)
373 {
374 1 INT8 c;
375 1 ATABF_IsAttached = FALSE;
376 1 Hal4ATA_DevReg_DEV = FALSE;
377 1 if(Hal4ATA_IdeHardReset())
378 1 { Hal4ATA_SetFeature();
379 2 for ( c = 2; c != 0; c--, Hal4ATA_DevReg_DEV^=1 )
380 2 { if(Hal4ATA_SelDevice())
381 3 {
382 4 if ( Hal4ATA_IssueIDEIdentify() )
383 4 { ATABF_IsAttached = TRUE;
384 5 break;
385 5 }
386 4 }
387 3 }
388 2
389 2 if(ATABF_IsAttached)
390 2 { Hal4ATA_IsLBAmode();// 设为LAB模式
391 3 } // IDE HD is found
392 2 } // IDE Reset OK
393 1 return ATABF_IsAttached;
394 1 } /*end Hal4ATA_FindIDEDevice()*/
395
396
397 BOOLEAN
398 Hal4ATA_ReadWriteSetting(void)
399 {
400 1 BOOLEAN retStatus = FALSE;
401 1 /*
402 1 // Select device .
403 1 */
404 1 if(Hal4ATA_SelDevice())
405 1 { //Assume Sector Counter <256
406 2 Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_COUNT, RBC_CDB.RbcCdb_Read.XferLength_0);
407 2 /* IN LBA mode */
408 2 if( ATABF_IDEXfer_dir ) // ATABF_Xfer_dir==1 Read(from Dev to Host)
409 2 {
410 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_0);
411 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_1);
412 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_2);
413 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD, (RBC_CDB.RbcCdb_Read.LBA.LBA_W8.LBA_3&0x0f) | Hal4AT
-A_DevReg );
414 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND, IDE_COMMAND_READ);
415 3 }
416 2 else
417 2 { // write command.
418 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_SECTOR_NUMBER,RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_0);
419 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_LOW,RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_1);
420 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_CYLINDER_HIGH,RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_2);
421 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_DEVICE_HEAD, (RBC_CDB.RbcCdb_Write.LBA.LBA_W8.LBA_3&0x0f) | Hal
-4ATA_DevReg );
422 3 Hal4Sys_ATAPortOutB(ATAREG4OUT_COMMAND,IDE_COMMAND_WRITE);
423 3 }
424 2 }
C51 COMPILER V7.06 HAL4ATA 02/17/2004 14:42:23 PAGE 8
425 1 retStatus = Hal4ATA_WaitOnBusyNDrq();
426 1 return retStatus;
427 1 } /* end Hal4ATA_ReadWriteSetting()*/
428
429
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 584 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 4
IDATA SIZE = ---- ----
BIT SIZE = ---- 7
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -