Skip to content

Commit 0cfc64b

Browse files
committed
update docs and codestyle
1 parent 5e4b575 commit 0cfc64b

File tree

6 files changed

+66
-56
lines changed

6 files changed

+66
-56
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 5e4b57522d6fb5611eb7e14bc59f27858b4ec4a3
2+
Author: Alexeev Bronislav <[email protected]>
3+
Date: Sat Aug 30 04:21:42 2025 +0700
4+
5+
feat: fully realize ATA PIO driver, add disk img creation in makefile
6+
17
commit 3a74eb131a365ecca0b4c54689f545a459e6fa39
28
Author: Alexeev Bronislav <[email protected]>
39
Date: Fri Aug 29 22:02:52 2025 +0700

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
- VGA-экран с поддержкой цветного текста
4848
- Клавиатура (PS/2)
4949
- Таймер
50+
- ATA PIO
5051
- **Система прерываний** (IDT, ISR, IRQ)
5152
- **Командная оболочка** "Keramika Shell" с поддержкой команд:
5253
- `help` - список команд
@@ -70,7 +71,6 @@
7071
- Библиотека стандартных методов (stdlib.h)
7172

7273
### В разработке
73-
- [ ] ATA PIO DRIVER
7474
- [ ] Файловая система
7575
- [ ] Многозадачность (под вопросом)
7676
- [ ] Пользовательский режим
@@ -82,6 +82,7 @@
8282
- [x] Виртуальная память (Paging)
8383
- [x] Аллокаторы памяти
8484
- [x] Чувствительность к регистру
85+
- [x] ATA PIO DRIVER
8586

8687
## Требования
8788

src/kernel/drivers/ata_pio.c

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,17 @@
66
* ---------------------------------------------------------------------------*/
77

88
#include "ata_pio.h"
9-
#include "lowlevel_io.h"
9+
1010
#include "../kklibc/kklibc.h"
11+
#include "lowlevel_io.h"
1112
#include "screen.h"
1213

1314
// внутреннее API ядра
1415
static void ata_pio_select_drive(u8 drive);
1516
static void ata_pio_set_lba(u32 lba, u8 drive);
1617

1718
// глобал переменные для хранения информации о дисках
18-
ata_disk_info_t ata_disks[2]; // 0 - master, 1 - slave
19+
ata_disk_info_t ata_disks[2]; // 0 - master, 1 - slave
1920

2021
// внешнее api ядра
2122

@@ -37,8 +38,7 @@ void ata_pio_init() {
3738
int result = ata_pio_identify(drive, &ata_disks[i]);
3839

3940
if (result == 0) {
40-
printf("Drive %d: %s %d MB\n", i, ata_disks[i].model,
41-
(ata_disks[i].size * 512) / (1024 * 1024));
41+
printf("Drive %d: %s %d MB\n", i, ata_disks[i].model, (ata_disks[i].size * 512) / (1024 * 1024));
4242
} else {
4343
printf("Drive %d: identification failed (error %d)\n", i, result);
4444
}
@@ -47,9 +47,11 @@ void ata_pio_init() {
4747

4848
static void ata_pio_select_drive(u8 drive) {
4949
// выюор диска (master/slave) и режима LBA
50-
port_byte_out(ATA_PRIMARY_DRIVE_SEL, drive | 0x40); // LBA mode
50+
port_byte_out(ATA_PRIMARY_DRIVE_SEL, drive | 0x40); // LBA mode
5151
// задержка для стабильности
52-
for (int i = 0; i < 4; i++) port_byte_in(ATA_PRIMARY_STATUS);
52+
for (int i = 0; i < 4; i++) {
53+
port_byte_in(ATA_PRIMARY_STATUS);
54+
}
5355
}
5456

5557
static void ata_pio_set_lba(u32 lba, u8 drive) {
@@ -62,7 +64,7 @@ static void ata_pio_set_lba(u32 lba, u8 drive) {
6264

6365
int ata_pio_wait() {
6466
// ожидаем снятия флага BSY и установки флага DRDY
65-
int timeout = 100000; // таймаут для предотвращения зависания
67+
int timeout = 100000; // таймаут для предотвращения зависания
6668

6769
while (timeout-- > 0) {
6870
u8 status = port_byte_in(ATA_PRIMARY_STATUS);
@@ -78,7 +80,7 @@ int ata_pio_wait() {
7880
}
7981
}
8082

81-
return -2; // таймаут
83+
return -2; // таймаут
8284
}
8385

8486
int ata_pio_identify(u8 drive, ata_disk_info_t* info) {
@@ -141,7 +143,9 @@ int ata_pio_identify(u8 drive, ata_disk_info_t* info) {
141143
}
142144

143145
int ata_pio_read_sectors(u8 drive, u32 lba, u8 num, u16* buffer) {
144-
if (num == 0) return 0;
146+
if (num == 0) {
147+
return 0;
148+
}
145149

146150
// выбор диск
147151
ata_pio_select_drive(drive);
@@ -168,14 +172,18 @@ int ata_pio_read_sectors(u8 drive, u32 lba, u8 num, u16* buffer) {
168172
}
169173

170174
// ждем между секторами
171-
for (int i = 0; i < 4; i++) port_byte_in(ATA_PRIMARY_STATUS);
175+
for (int i = 0; i < 4; i++) {
176+
port_byte_in(ATA_PRIMARY_STATUS);
177+
}
172178
}
173179

174180
return 0;
175181
}
176182

177183
int ata_pio_write_sectors(u8 drive, u32 lba, u8 num, u16* buffer) {
178-
if (num == 0) return 0;
184+
if (num == 0) {
185+
return 0;
186+
}
179187

180188
// диск
181189
ata_pio_select_drive(drive);
@@ -207,7 +215,7 @@ int ata_pio_write_sectors(u8 drive, u32 lba, u8 num, u16* buffer) {
207215
}
208216

209217
port_byte_out(ATA_PRIMARY_CMD, ATA_CMD_CACHE_FLUSH);
210-
ata_pio_wait(); //
218+
ata_pio_wait(); //
211219
}
212220

213221
return 0;

src/kernel/drivers/ata_pio.h

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,57 +11,57 @@
1111
#include "../kklibc/ctypes.h"
1212

1313
// Порт Primary ATA канала
14-
#define ATA_PRIMARY_DATA 0x1F0
15-
#define ATA_PRIMARY_ERROR 0x1F1
16-
#define ATA_PRIMARY_SECTOR_CNT 0x1F2
17-
#define ATA_PRIMARY_LBA_LOW 0x1F3
18-
#define ATA_PRIMARY_LBA_MID 0x1F4
19-
#define ATA_PRIMARY_LBA_HIGH 0x1F5
20-
#define ATA_PRIMARY_DRIVE_SEL 0x1F6
21-
#define ATA_PRIMARY_STATUS 0x1F7
22-
#define ATA_PRIMARY_CMD 0x1F7
14+
#define ATA_PRIMARY_DATA 0x1F0
15+
#define ATA_PRIMARY_ERROR 0x1F1
16+
#define ATA_PRIMARY_SECTOR_CNT 0x1F2
17+
#define ATA_PRIMARY_LBA_LOW 0x1F3
18+
#define ATA_PRIMARY_LBA_MID 0x1F4
19+
#define ATA_PRIMARY_LBA_HIGH 0x1F5
20+
#define ATA_PRIMARY_DRIVE_SEL 0x1F6
21+
#define ATA_PRIMARY_STATUS 0x1F7
22+
#define ATA_PRIMARY_CMD 0x1F7
2323

2424
// Статусные биты регистра STATUS
25-
#define ATA_SR_BSY 0x80 // Drive busy
26-
#define ATA_SR_DRDY 0x40 // Drive ready
27-
#define ATA_SR_DF 0x20 // Drive write fault
28-
#define ATA_SR_DSC 0x10 // Drive seek complete
29-
#define ATA_SR_DRQ 0x08 // Data request ready
30-
#define ATA_SR_CORR 0x04 // Corrected data
31-
#define ATA_SR_IDX 0x02 // Index
32-
#define ATA_SR_ERR 0x01 // Error
25+
#define ATA_SR_BSY 0x80 // Drive busy
26+
#define ATA_SR_DRDY 0x40 // Drive ready
27+
#define ATA_SR_DF 0x20 // Drive write fault
28+
#define ATA_SR_DSC 0x10 // Drive seek complete
29+
#define ATA_SR_DRQ 0x08 // Data request ready
30+
#define ATA_SR_CORR 0x04 // Corrected data
31+
#define ATA_SR_IDX 0x02 // Index
32+
#define ATA_SR_ERR 0x01 // Error
3333

3434
// Типы устройств
3535
#define ATA_MASTER 0xA0
36-
#define ATA_SLAVE 0xB0
36+
#define ATA_SLAVE 0xB0
3737

3838
// Команды
39-
#define ATA_CMD_READ_PIO 0x20
40-
#define ATA_CMD_READ_PIO_EXT 0x24
41-
#define ATA_CMD_READ_DMA 0xC8
42-
#define ATA_CMD_READ_DMA_EXT 0x25
43-
#define ATA_CMD_WRITE_PIO 0x30
44-
#define ATA_CMD_WRITE_PIO_EXT 0x34
45-
#define ATA_CMD_WRITE_DMA 0xCA
46-
#define ATA_CMD_WRITE_DMA_EXT 0x35
47-
#define ATA_CMD_CACHE_FLUSH 0xE7
39+
#define ATA_CMD_READ_PIO 0x20
40+
#define ATA_CMD_READ_PIO_EXT 0x24
41+
#define ATA_CMD_READ_DMA 0xC8
42+
#define ATA_CMD_READ_DMA_EXT 0x25
43+
#define ATA_CMD_WRITE_PIO 0x30
44+
#define ATA_CMD_WRITE_PIO_EXT 0x34
45+
#define ATA_CMD_WRITE_DMA 0xCA
46+
#define ATA_CMD_WRITE_DMA_EXT 0x35
47+
#define ATA_CMD_CACHE_FLUSH 0xE7
4848
#define ATA_CMD_CACHE_FLUSH_EXT 0xEA
49-
#define ATA_CMD_IDENTIFY 0xEC
49+
#define ATA_CMD_IDENTIFY 0xEC
5050

5151
// Типы дисков
52-
#define ATA_DISK_UNKNOWN 0
53-
#define ATA_DISK_PATA 1
54-
#define ATA_DISK_SATA 2
55-
#define ATA_DISK_PATAPI 3
56-
#define ATA_DISK_SATAPI 4
52+
#define ATA_DISK_UNKNOWN 0
53+
#define ATA_DISK_PATA 1
54+
#define ATA_DISK_SATA 2
55+
#define ATA_DISK_PATAPI 3
56+
#define ATA_DISK_SATAPI 4
5757

5858
// Структура для информации о диске
5959
typedef struct {
6060
u16 type;
6161
u16 signature;
6262
u16 capabilities;
6363
u32 command_sets;
64-
u32 size; // в секторах
64+
u32 size; // в секторах
6565
char model[41];
6666
} ata_disk_info_t;
6767

@@ -104,4 +104,4 @@ int ata_pio_write_sectors(u8 drive, u32 lba, u8 num, u16* buffer);
104104
*/
105105
int ata_pio_wait();
106106

107-
#endif // ATA_PIO_H
107+
#endif // ATA_PIO_H

src/kernel/drivers/lowlevel_io.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,9 @@ void port_word_out(u16 port, u16 data) {
9393
}
9494

9595
void insw(u16 port, void* buffer, u32 count) {
96-
__asm__ volatile("cld; rep insw"
97-
: "+D"(buffer), "+c"(count)
98-
: "d"(port)
99-
: "memory");
96+
__asm__ volatile("cld; rep insw" : "+D"(buffer), "+c"(count) : "d"(port) : "memory");
10097
}
10198

10299
void outsw(u16 port, void* buffer, u32 count) {
103-
__asm__ volatile("cld; rep outsw"
104-
: "+S"(buffer), "+c"(count)
105-
: "d"(port));
100+
__asm__ volatile("cld; rep outsw" : "+S"(buffer), "+c"(count) : "d"(port));
106101
}

src/kernel/kernel/kernel.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
#include "kernel.h"
99

1010
#include "../cpu/isr.h"
11-
#include "../drivers/screen.h"
1211
#include "../drivers/ata_pio.h"
12+
#include "../drivers/screen.h"
1313
#include "../kklibc/kklibc.h"
1414
#include "../kklibc/paging.h"
1515
#include "sysinfo.h"

0 commit comments

Comments
 (0)