11#include "ata_pio.h"
2+
23#include "lowlevel_io.h"
34#include "screen.h"
45
56// Источник: https://wiki.osdev.org/ATA_PIO_Mode
67
78static void ata_wait_ready () {
8- while (port_byte_in (ATA_REG_STATUS ) & ATA_SR_BSY );
9+ while (port_byte_in (ATA_REG_STATUS ) & ATA_SR_BSY )
10+ ;
911}
1012
1113static void ata_cache_flush () {
@@ -23,7 +25,7 @@ void ata_read_sectors(u32 lba, u32 sector_count, const u8* buffer) {
2325 // Задержка для стабилизации контроллера
2426 port_byte_out (ATA_REG_ERROR , 0x00 );
2527
26- port_byte_out (ATA_REG_SECCOUNT , sector_count ); // Количество секторов для чтения
28+ port_byte_out (ATA_REG_SECCOUNT , sector_count ); // Количество секторов для чтения
2729 port_byte_out (ATA_REG_LBA0 , (u8 )(lba & 0xFF ));
2830 port_byte_out (ATA_REG_LBA1 , (u8 )((lba >> 8 ) & 0xFF ));
2931 port_byte_out (ATA_REG_LBA2 , (u8 )((lba >> 16 ) & 0xFF ));
@@ -32,14 +34,15 @@ void ata_read_sectors(u32 lba, u32 sector_count, const u8* buffer) {
3234 ata_wait_ready ();
3335
3436 for (u8 sector = 0 ; sector < sector_count ; sector ++ ) {
35- while (!(port_byte_in (ATA_REG_STATUS ) & ATA_SR_DRQ ));
37+ while (!(port_byte_in (ATA_REG_STATUS ) & ATA_SR_DRQ ))
38+ ;
3639 // ПРИМЕЧАНИЕ: При чтении слов в little-endian порядок байт сохраняется корректно
37- rep_insw (ATA_REG_DATA , (void * )(& buffer [sector * SECTOR_BYTES ]), SECTOR_WORDS ); // 256 слов (512 байт)
40+ rep_insw (
41+ ATA_REG_DATA , (void * )(& buffer [sector * SECTOR_BYTES ]), SECTOR_WORDS ); // 256 слов (512 байт)
3842 }
3943}
4044
4145void ata_write_sectors (u32 lba , u32 sector_count , const u8 * buffer ) {
42-
4346 ata_wait_ready ();
4447
4548 // Выбор диска (Master)
@@ -48,18 +51,20 @@ void ata_write_sectors(u32 lba, u32 sector_count, const u8* buffer) {
4851 // Задержка для стабилизации контроллера
4952 port_byte_out (ATA_REG_ERROR , 0x00 );
5053
51- port_byte_out (ATA_REG_SECCOUNT , (u8 )sector_count ); // Количество секторов для записи
54+ port_byte_out (ATA_REG_SECCOUNT , (u8 )sector_count ); // Количество секторов для записи
5255 port_byte_out (ATA_REG_LBA0 , (u8 )(lba & 0xFF ));
5356 port_byte_out (ATA_REG_LBA1 , (u8 )((lba >> 8 ) & 0xFF ));
5457 port_byte_out (ATA_REG_LBA2 , (u8 )((lba >> 16 ) & 0xFF ));
5558 port_byte_out (ATA_REG_COMMAND , ATA_CMD_WRITE_SECTORS );
5659
5760 for (u8 sector = 0 ; sector < sector_count ; sector ++ ) {
58- while (!(port_byte_in (ATA_REG_STATUS ) & ATA_SR_DRQ ));
61+ while (!(port_byte_in (ATA_REG_STATUS ) & ATA_SR_DRQ ))
62+ ;
5963 for (u32 sw = 0 ; sw < SECTOR_WORDS ; sw ++ ) {
6064 // Преобразование в big-endian для контроллера
61- outsw (ATA_REG_DATA , ((u16 )buffer [sector * SECTOR_BYTES + sw * 2 + 1 ]) << 8
62- | (u16 )(buffer [sector * SECTOR_BYTES + sw * 2 ]));
65+ outsw (ATA_REG_DATA ,
66+ ((u16 )buffer [sector * SECTOR_BYTES + sw * 2 + 1 ]) << 8
67+ | (u16 )(buffer [sector * SECTOR_BYTES + sw * 2 ]));
6368 }
6469 }
6570
@@ -71,7 +76,7 @@ void ata_select_drive(int is_master) {
7176}
7277
7378void ata_identify () {
74- ata_select_drive (1 ); // Выбор master-диска
79+ ata_select_drive (1 ); // Выбор master-диска
7580
7681 port_byte_out (ATA_REG_SECCOUNT , 0 );
7782 port_byte_out (ATA_REG_LBA0 , 0 );
@@ -83,7 +88,9 @@ void ata_identify() {
8388int ata_wait () {
8489 while (1 ) {
8590 u8 status = port_byte_in (ATA_REG_STATUS );
86- if (!(status & 0x80 )) return 1 ; // Проверка бита BSY (занято)
91+ if (!(status & 0x80 )) {
92+ return 1 ; // Проверка бита BSY (занято)
93+ }
8794 }
8895}
8996
@@ -101,7 +108,7 @@ u32 ata_get_disk_size() {
101108 ata_wait ();
102109 ata_read_buffer (ata_buffer );
103110 u32 total_sectors = ((u32 )ata_buffer [61 ] << 16 ) | ata_buffer [60 ];
104- return (u32 )total_sectors * 512 ; // Конвертация в байты
111+ return (u32 )total_sectors * 512 ; // Конвертация в байты
105112}
106113
107114void ata_read_blocks (u32 block_num , const u8 * buffer , u32 count ) {
0 commit comments