5 #include "drv/disk/ata.h"
6 #include "drv/disk/ata_pio.h"
11 uint8_t ata_pio_read_sector(uint8_t drive, uint8_t *buf, uint32_t lba) {
13 qemu_log(
"Buffer is nullptr!");
22 if(!drives[drive].online) {
23 qemu_log(
"Attempted read from drive that does not exist.");
27 ata_set_params(drive, &io, &drive);
29 uint8_t cmd = (drive==ATA_MASTER?0xE0:0xF0);
30 uint8_t slavebit = (drive == ATA_MASTER?0x00:0x01);
32 outb(io + ATA_REG_HDDEVSEL, (cmd | (slavebit << 4) | (uint8_t)(lba >> 24 & 0x0F)));
34 outb(io + ATA_REG_SECCOUNT0, 1);
35 outb(io + ATA_REG_LBA0, (uint8_t)((lba)));
36 outb(io + ATA_REG_LBA1, (uint8_t)((lba) >> 8));
37 outb(io + ATA_REG_LBA2, (uint8_t)((lba) >> 16));
38 outb(io + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
42 uint16_t ata_data_reg = io + ATA_REG_DATA;
44 uint16_t* buf16 = (uint16_t*)buf;
46 for(
int i = 0; i < 256; i++) {
47 uint16_t data = inw(ata_data_reg);
56 uint8_t ata_pio_read_sectors_pre(uint8_t drive, uint8_t *buf, uint32_t lba, uint8_t sector_count) {
58 qemu_log(
"Buffer is nullptr!");
67 if(!drives[drive].online) {
68 qemu_log(
"Attempted read from drive that does not exist.");
72 ata_set_params(drive, &io, &drive);
74 uint8_t cmd = (drive==ATA_MASTER?0xE0:0xF0);
75 uint8_t slavebit = (drive == ATA_MASTER?0x00:0x01);
77 outb(io + ATA_REG_HDDEVSEL, (cmd | (slavebit << 4) | (uint8_t)(lba >> 24 & 0x0F)));
79 outb(io + ATA_REG_SECCOUNT0, sector_count);
80 outb(io + ATA_REG_LBA0, (uint8_t)((lba)));
81 outb(io + ATA_REG_LBA1, (uint8_t)((lba) >> 8));
82 outb(io + ATA_REG_LBA2, (uint8_t)((lba) >> 16));
83 outb(io + ATA_REG_COMMAND, ATA_CMD_READ_PIO);
87 uint16_t ata_data_reg = io + ATA_REG_DATA;
89 uint16_t* buf16 = (uint16_t*)buf;
91 for(
int i = 0; i < 256 * sector_count; i++) {
92 uint16_t data = inw(ata_data_reg);
108 uint8_t ata_pio_write_raw_sector(uint8_t drive,
const uint8_t *buf, uint32_t lba) {
110 qemu_log(
"Buffer is nullptr!");
119 if(!drives[drive].online) {
120 qemu_log(
"Attempted read from drive that does not exist.");
124 ata_set_params(drive, &io, &drive);
126 uint8_t cmd = (drive==ATA_MASTER?0xE0:0xF0);
127 uint8_t slavebit = (drive == ATA_MASTER?0x00:0x01);
129 outb(io + ATA_REG_HDDEVSEL, (cmd | (slavebit << 4) | (uint8_t)((lba >> 24 & 0x0F))));
131 outb(io + ATA_REG_SECCOUNT0, 1);
132 outb(io + ATA_REG_LBA0, (uint8_t)((lba)));
133 outb(io + ATA_REG_LBA1, (uint8_t)((lba) >> 8));
134 outb(io + ATA_REG_LBA2, (uint8_t)((lba) >> 16));
135 outb(io + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO);
139 for(
int i = 0; i < 256; i++) {
140 outw(io + ATA_REG_DATA, *(uint16_t*)(buf + i * 2));
145 outb(io + ATA_REG_COMMAND, ATA_CMD_CACHE_FLUSH);
153 void ata_pio_write_sectors(uint8_t drive, uint8_t *buf, uint32_t lba,
size_t sectors) {
155 qemu_log(
"Buffer is nullptr!");
159 for(
size_t i = 0; i < sectors; i++) {
160 ata_pio_write_raw_sector(drive, buf + (i * drives[drive].block_size), lba + i);
166 void ata_pio_read_sectors(uint8_t drive, uint8_t *buf, uint32_t lba, uint32_t numsects) {
168 qemu_log(
"Buffer is nullptr!");
174 for(
size_t i = 0; i < numsects; i++) {
175 ata_pio_read_sector(drive, rbuf, lba + i);
Эта структура определяет каждый ATA диск в системе
uint16_t block_size
Адресация по CHS?