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
66static void ata_wait_ready () {
77 while (port_byte_in (ATA_REG_STATUS ) & ATA_SR_BSY );
@@ -16,13 +16,13 @@ static void ata_cache_flush() {
1616void 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
4040void 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
7272void 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() {
8282int 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
8989void 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
9696u32 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
106106void 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+ // неэффективные методы: запись происходит поверх буфера без учета длины
111111void 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