MCPcopy Create free account
hub / github.com/LemonOSProject/LemonOS / DetectDrive

Function DetectDrive

Kernel/src/storage/ata.cpp:52–92  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

50
51
52 int DetectDrive(int port, int drive){
53 WriteRegister(port, ATA_REGISTER_DRIVE_HEAD, 0xa0 | (drive << 4)); // Drive
54
55 for(int i = 0; i < 4; i++) inportb(controlPort0);
56
57 WriteRegister(port, ATA_REGISTER_SECTOR_COUNT, 0);
58 WriteRegister(port, ATA_REGISTER_LBA_LOW, 0);
59 WriteRegister(port, ATA_REGISTER_LBA_MID, 0);
60 WriteRegister(port, ATA_REGISTER_LBA_HIGH, 0);
61
62 WriteRegister(port, ATA_REGISTER_COMMAND, ATA_CMD_IDENTIFY); // Identify
63
64 Timer::Wait(1);
65
66 if(!ReadRegister(port, ATA_REGISTER_STATUS)){
67 return 0;
68 }
69
70 {
71 int timer = 0xFFFFFF;
72 while(timer--){
73 uint8_t status = ReadRegister(port, ATA_REGISTER_STATUS);
74 if(status & ATA_DEV_ERR) {
75 return 0;
76 }
77 if(!(status & ATA_DEV_BUSY) && status & ATA_DEV_DRQ) goto c1;
78 }
79 return 0;
80 }
81
82 c1:
83 if(ReadRegister(port, ATA_REGISTER_LBA_MID) || ReadRegister(port, ATA_REGISTER_LBA_HIGH)) return 0;
84
85 int timer2 = 0xFFFFFF;
86 while(timer2--){
87 uint8_t status = ReadRegister(port, ATA_REGISTER_STATUS);
88 if((status & ATA_DEV_ERR)) return 0;
89 if((status & ATA_DEV_DRQ)) return 1;
90 }
91 return 0;
92 }
93
94 void IRQHandler(regs64_t* r){
95 Log::Info("Disk IRQ");

Callers 1

InitFunction · 0.85

Calls 4

WriteRegisterFunction · 0.85
inportbFunction · 0.85
ReadRegisterFunction · 0.85
WaitFunction · 0.50

Tested by

no test coverage detected