Skip to content

Commit 02a5fe4

Browse files
committed
update ata pio driver
1 parent a434b28 commit 02a5fe4

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit a434b2841dc660887729e91eb9e92fb7e82e498e
2+
Author: Alexeev Bronislav <[email protected]>
3+
Date: Thu Aug 28 22:15:29 2025 +0700
4+
5+
add ata-pio driver and improve lowlevel io driver
6+
17
commit 528cc20f905bd6803deb9861b83412baad1ed38a
28
Author: Alexeev Bronislav <[email protected]>
39
Date: Thu Aug 28 22:00:25 2025 +0700

src/kernel/drivers/ata_pio.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "ata_pio.h"
22
#include "lowlevel_io.h"
33

4-
// https://wiki.osdev.org/ATA_PIO_Mode
4+
// Источник: https://wiki.osdev.org/ATA_PIO_Mode
55

66
static void ata_wait_ready() {
77
while (port_byte_in(ATA_REG_STATUS) & ATA_SR_BSY);
@@ -16,13 +16,13 @@ static void ata_cache_flush() {
1616
void ata_read_sectors(u32 lba, u32 sector_count, const u8* buffer) {
1717
ata_wait_ready();
1818

19-
// Select drive (Master)
19+
// Выбор диска (Master)
2020
port_byte_out(ATA_REG_DRIVE_SELECT, 0xE0 | ((lba >> 24) & 0x0F));
2121

22-
// Waste time
22+
// Задержка для стабилизации контроллера
2323
port_byte_out(ATA_REG_ERROR, 0x00);
2424

25-
port_byte_out(ATA_REG_SECCOUNT, sector_count); // Read one sector
25+
port_byte_out(ATA_REG_SECCOUNT, sector_count); // Количество секторов для чтения
2626
port_byte_out(ATA_REG_LBA0, (u8)(lba & 0xFF));
2727
port_byte_out(ATA_REG_LBA1, (u8)((lba >> 8) & 0xFF));
2828
port_byte_out(ATA_REG_LBA2, (u8)((lba >> 16) & 0xFF));
@@ -32,22 +32,22 @@ void ata_read_sectors(u32 lba, u32 sector_count, const u8* buffer) {
3232

3333
for (u8 sector = 0; sector < sector_count; sector++) {
3434
while (!(port_byte_in(ATA_REG_STATUS) & ATA_SR_DRQ));
35-
// NOTE: If bytes are entered in small endian, does it call it back the right way
36-
rep_insw(ATA_REG_DATA, (void*)(&buffer[sector * SECTOR_BYTES]), SECTOR_WORDS); // 256 words (512 bytes)
35+
// ПРИМЕЧАНИЕ: При чтении слов в little-endian порядок байт сохраняется корректно
36+
rep_insw(ATA_REG_DATA, (void*)(&buffer[sector * SECTOR_BYTES]), SECTOR_WORDS); // 256 слов (512 байт)
3737
}
3838
}
3939

4040
void ata_write_sectors(u32 lba, u32 sector_count, const u8* buffer) {
4141

4242
ata_wait_ready();
4343

44-
// Select drive (Master)
44+
// Выбор диска (Master)
4545
port_byte_out(ATA_REG_DRIVE_SELECT, 0xE0 | ((lba >> 24) & 0x0F));
4646

47-
// Waste time
47+
// Задержка для стабилизации контроллера
4848
port_byte_out(ATA_REG_ERROR, 0x00);
4949

50-
port_byte_out(ATA_REG_SECCOUNT, (u8)sector_count); // Read one sector
50+
port_byte_out(ATA_REG_SECCOUNT, (u8)sector_count); // Количество секторов для записи
5151
port_byte_out(ATA_REG_LBA0, (u8)(lba & 0xFF));
5252
port_byte_out(ATA_REG_LBA1, (u8)((lba >> 8) & 0xFF));
5353
port_byte_out(ATA_REG_LBA2, (u8)((lba >> 16) & 0xFF));
@@ -56,7 +56,7 @@ void ata_write_sectors(u32 lba, u32 sector_count, const u8* buffer) {
5656
for (u8 sector = 0; sector < sector_count; sector++) {
5757
while (!(port_byte_in(ATA_REG_STATUS) & ATA_SR_DRQ));
5858
for (u32 sw = 0; sw < SECTOR_WORDS; sw++) {
59-
// looks like big endian
59+
// Преобразование в big-endian для контроллера
6060
outsw(ATA_REG_DATA, ((u16)buffer[sector * SECTOR_BYTES + sw * 2 + 1]) << 8
6161
| (u16)(buffer[sector * SECTOR_BYTES + sw * 2]));
6262
}
@@ -70,7 +70,7 @@ void ata_select_drive(int is_master) {
7070
}
7171

7272
void ata_identify() {
73-
ata_select_drive(1); // Select master drive
73+
ata_select_drive(1); // Выбор master-диска
7474

7575
port_byte_out(ATA_REG_SECCOUNT, 0);
7676
port_byte_out(ATA_REG_LBA0, 0);
@@ -82,32 +82,32 @@ void ata_identify() {
8282
int ata_wait() {
8383
while (1) {
8484
u8 status = port_byte_in(ATA_REG_STATUS);
85-
if (!(status & 0x80)) return 1; // Check BSY (Busy) bit
85+
if (!(status & 0x80)) return 1; // Проверка бита BSY (занято)
8686
}
8787
}
8888

8989
void ata_read_buffer(u16* buffer) {
90-
// reads an entire sector, 256 words, 512 bytes
90+
// Чтение всего сектора: 256 слов, 512 байт
9191
for (int i = 0; i < 256; i++) {
9292
buffer[i] = port_word_in(ATA_REG_DATA);
9393
}
9494
}
9595

9696
u32 ata_get_disk_size() {
97-
// 1024^2 = 1048576 (1 MiB)
97+
// 1024^2 = 1048576 (1 МиБ)
9898
u16 ata_buffer[256];
9999
ata_identify();
100100
ata_wait();
101101
ata_read_buffer(ata_buffer);
102102
u32 total_sectors = ((u32)ata_buffer[61] << 16) | ata_buffer[60];
103-
return (u32)total_sectors * 512; // Convert to bytes
103+
return (u32)total_sectors * 512; // Конвертация в байты
104104
}
105105

106106
void ata_read_blocks(u32 block_num, const u8* buffer, u32 count) {
107107
ata_read_sectors(block_num * SECTORS_PER_BLOCK, SECTORS_PER_BLOCK * count, buffer);
108108
}
109109

110-
// these are wasteful, just writes past buffer, regardless of length
110+
// неэффективные методы: запись происходит поверх буфера без учета длины
111111
void ata_write_blocks(u32 block_num, const u8* buffer, u32 count) {
112112
ata_write_sectors(block_num * SECTORS_PER_BLOCK, SECTORS_PER_BLOCK * count, buffer);
113113
}

0 commit comments

Comments
 (0)