Print IDE identify information
This commit is contained in:
parent
25ff76e4d7
commit
1acd37a644
@ -1,6 +1,7 @@
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <kassert.h>
|
||||
#include <sga.h>
|
||||
@ -30,7 +31,9 @@ typedef struct ATAIdentifyDevice
|
||||
uint16_t udmaMode; // 88 - Ultra DMA Mode
|
||||
uint16_t _rsvd5[11]; // 89-99
|
||||
uint64_t lbaSectors; // 100-103 - User Addressable Logical Sectors
|
||||
uint16_t _rsvd6[151]; // 104-254
|
||||
uint16_t _rsvd6[2]; // 104-105
|
||||
uint16_t sectorSize; // 106 - Physical Sector Size
|
||||
uint16_t _rsvd7[148]; // 107-254
|
||||
uint16_t chksum; // 255 - Checksum
|
||||
} ATAIdentifyDevice;
|
||||
|
||||
@ -138,6 +141,28 @@ IDE_Reset(IDE *ide)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IDE_SwapAndTruncateString(char *str, int len)
|
||||
{
|
||||
int i;
|
||||
|
||||
ASSERT(len % 2 == 0);
|
||||
|
||||
for (i = 0; i < len/2; i++)
|
||||
{
|
||||
char tmp = str[2*i];
|
||||
str[2*i] = str[2*i+1];
|
||||
str[2*i+1] = tmp;
|
||||
}
|
||||
|
||||
for (i = len - 1; i > 0; i--) {
|
||||
if (str[i] == ' ' || str[i] == '\0')
|
||||
str[i] = '\0';
|
||||
else
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
IDE_Identify(IDE *ide, int drive)
|
||||
{
|
||||
@ -165,8 +190,6 @@ IDE_Identify(IDE *ide, int drive)
|
||||
return;
|
||||
}
|
||||
|
||||
kprintf("IDE: Waiting for ready! %08x\n", status);
|
||||
|
||||
// XXX: Need timeout
|
||||
while (1) {
|
||||
if ((status & IDE_STATUS_BSY) == 0)
|
||||
@ -179,12 +202,22 @@ IDE_Identify(IDE *ide, int drive)
|
||||
return;
|
||||
}
|
||||
|
||||
kprintf("IDE: Ready!\n");
|
||||
|
||||
insw(ide->base, (void *)&ident, 256);
|
||||
|
||||
kprintf("IDE: Ready!\n");
|
||||
// Cleanup model and serial for printing
|
||||
char model[41];
|
||||
char serial[21];
|
||||
|
||||
Debug_PrintHex((const char *)&ident, 512, 0, 512);
|
||||
memcpy(&model[0], &ident.model[0], 40);
|
||||
model[40] = '\0';
|
||||
IDE_SwapAndTruncateString(&model[0], 40);
|
||||
|
||||
memcpy(&serial[0], &ident.serial[0], 20);
|
||||
serial[20] = '\0';
|
||||
IDE_SwapAndTruncateString(&serial[0], 20);
|
||||
|
||||
kprintf("IDE: Drive %d Model: %s Serial: %s\n", drive, model, serial);
|
||||
kprintf("IDE: Drive %d %llu Sectors (%llu MBs)\n",
|
||||
drive, ident.lbaSectors, ident.lbaSectors / 2048ULL);
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,7 @@
|
||||
NO_RETURN void Panic(const char *str);
|
||||
|
||||
int kprintf(const char *fmt, ...);
|
||||
void Debug_PrintHex(const char *data, size_t length, off_t off, size_t limit);
|
||||
|
||||
#endif /* __KASSERT_H__ */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user