Skip to content

Commit 82a6898

Browse files
A Ata disk driver has been added for OpenKernel.
1 parent fd41b4c commit 82a6898

2 files changed

Lines changed: 84 additions & 0 deletions

File tree

Drivers/Ata/ata.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
#include "ata.h"
2+
#include "../../SystemLib/SystemIO/io.h"
3+
4+
static void ata_wait_busy() {
5+
while (inb(ATA_STATUS) & ATA_STATUS_BSY);
6+
}
7+
8+
static void ata_wait_drq() {
9+
while(!(inb(ATA_STATUS) & ATA_STATUS_DRQ));
10+
}
11+
12+
void ata_sys_disk_init() {
13+
14+
}
15+
16+
void ata_sys_disk_read(uint32_t lba, uint8_t* buffer) {
17+
ata_wait_busy();
18+
19+
outb(ATA_DRIVE_SELECT, 0x0E | ((lba >> 24) & 0x0F)); // Select drive and set LBA bits 24-27
20+
outb(ATA_SECTOR_COUNT, 1); // Read one sector
21+
22+
outb(ATA_LBA_LOW, (uint8_t)(lba));
23+
outb(ATA_LBA_MID, (uint8_t)(lba >> 8));
24+
outb(ATA_LBA_HIGH, (uint8_t)(lba >> 16));
25+
26+
outb(ATA_COMMAND, ATA_READ);
27+
28+
ata_wait_busy();
29+
ata_wait_drq();
30+
31+
for (int i = 0; i < 256; i++) {
32+
((uint16_t*)buffer)[i] = inw(ATA_DATA);
33+
}
34+
}
35+
36+
void ata_sys_disk_write(uint32_t lba, const uint8_t* buffer) {
37+
ata_wait_busy();
38+
39+
outb(ATA_DRIVE_SELECT, 0x0E | ((lba >> 24) & 0x0F)); // Select drive and set LBA bits 24-27
40+
outb(ATA_SECTOR_COUNT, 1); // Write one sector
41+
42+
outb(ATA_LBA_LOW, (uint8_t)(lba));
43+
outb(ATA_LBA_MID, (uint8_t)(lba >> 8));
44+
outb(ATA_LBA_HIGH, (uint8_t)(lba >> 16));
45+
46+
outb(ATA_COMMAND, ATA_WRITE);
47+
48+
ata_wait_busy();
49+
ata_wait_drq();
50+
51+
for (int i = 0; i < 256; i++) {
52+
outw(ATA_DATA, ((uint16_t*)buffer)[i]);
53+
}
54+
}

Drivers/Ata/ata.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#ifndef ATA_H
2+
#define ATA_H
3+
4+
/*
5+
* ATA Driver for OpenKernel
6+
*/
7+
8+
#include "../../SystemLib/Std/types.h"
9+
10+
#define ATA_DATA 0x1F0
11+
#define ATA_ERROR 0x1F1
12+
#define ATA_SECTOR_COUNT 0x1F2
13+
#define ATA_LBA_LOW 0x1F3
14+
#define ATA_LBA_MID 0x1F4
15+
#define ATA_LBA_HIGH 0x1F5
16+
#define ATA_DRIVE_SELECT 0x1F6
17+
#define ATA_COMMAND 0x1F7
18+
#define ATA_STATUS 0x1F7
19+
20+
#define ATA_READ 0x20
21+
#define ATA_WRITE 0x30
22+
23+
#define ATA_STATUS_BSY 0x80
24+
#define ATA_STATUS_DRQ 0x08
25+
26+
void ata_sys_disk_init();
27+
void ata_sys_disk_read(uint32_t lba, uint8_t* buffer);
28+
void ata_sys_disk_write(uint32_t lba, const uint8_t* buffer);
29+
30+
#endif

0 commit comments

Comments
 (0)