3 #include "../../common.h"
5 #define ATA_SR_BSY 0x80
6 #define ATA_SR_DRDY 0x40
8 #define ATA_SR_DSC 0x10
9 #define ATA_SR_DRQ 0x08
10 #define ATA_SR_CORR 0x04
11 #define ATA_SR_IDX 0x02
12 #define ATA_SR_ERR 0x01
14 #define ATA_ER_BBK 0x80
15 #define ATA_ER_UNC 0x40
16 #define ATA_ER_MC 0x20
17 #define ATA_ER_IDNF 0x10
18 #define ATA_ER_MCR 0x08
19 #define ATA_ER_ABRT 0x04
20 #define ATA_ER_TK0NF 0x02
21 #define ATA_ER_AMNF 0x01
23 #define ATA_CMD_READ_PIO 0x20
24 #define ATA_CMD_READ_PIO_EXT 0x24
25 #define ATA_CMD_READ_DMA 0xC8
26 #define ATA_CMD_READ_DMA_EXT 0x25
27 #define ATA_CMD_WRITE_PIO 0x30
28 #define ATA_CMD_WRITE_PIO_EXT 0x34
29 #define ATA_CMD_WRITE_DMA 0xCA
30 #define ATA_CMD_WRITE_DMA_EXT 0x35
31 #define ATA_CMD_CACHE_FLUSH 0xE7
32 #define ATA_CMD_CACHE_FLUSH_EXT 0xEA
33 #define ATA_CMD_PACKET 0xA0
34 #define ATA_CMD_IDENTIFY_PACKET 0xA1
35 #define ATA_CMD_IDENTIFY 0xEC
37 #define ATA_IDENT_DEVICETYPE 0
38 #define ATA_IDENT_CYLINDERS 1
39 #define ATA_IDENT_HEADS 3
40 #define ATA_IDENT_SECTORS 6
41 #define ATA_IDENT_SERIAL 10
42 #define ATA_IDENT_MODEL 27
43 #define ATA_IDENT_CAPABILITIES 49
44 #define ATA_IDENT_FIELDVALID 53
45 #define ATA_IDENT_MAX_LBA 60
46 #define ATA_IDENT_COMMANDSETS 82
47 #define ATA_IDENT_MAX_LBA_EXT 100
49 #define ATA_MASTER 0x00
50 #define ATA_SLAVE 0x01
52 #define ATA_DMA_PRIMARY_CMD 0x00
53 #define ATA_DMA_PRIMARY_STATUS 0x02
54 #define ATA_DMA_PRIMARY_PRDT 0x04
56 #define ATA_DMA_SECONDARY_CMD 0x08
57 #define ATA_DMA_SECONDARY_STATUS 0x0A
58 #define ATA_DMA_SECONDARY_PRDT 0x0C
60 #define ATA_REG_DATA 0x00
61 #define ATA_REG_ERROR 0x01
62 #define ATA_REG_FEATURES 0x01
63 #define ATA_REG_SECCOUNT0 0x02
64 #define ATA_REG_LBA0 0x03
65 #define ATA_REG_LBA1 0x04
66 #define ATA_REG_LBA2 0x05
67 #define ATA_REG_HDDEVSEL 0x06
68 #define ATA_REG_COMMAND 0x07
69 #define ATA_REG_STATUS 0x07
70 #define ATA_REG_SECCOUNT1 0x08
71 #define ATA_REG_LBA3 0x09
72 #define ATA_REG_LBA4 0x0A
73 #define ATA_REG_LBA5 0x0B
74 #define ATA_REG_CONTROL 0x0C
75 #define ATA_REG_ALTSTATUS 0x0C
76 #define ATA_REG_DEVADDRESS 0x0D
79 #define ATA_PRIMARY 0x00
80 #define ATA_SECONDARY 0x01
84 #define ATA_WRITE 0x013
87 #define ATA_PRIMARY_IO 0x1F0
88 #define ATA_SECONDARY_IO 0x170
90 #define ATA_PRIMARY_DCR_AS 0x3F6
91 #define ATA_SECONDARY_DCR_AS 0x376
93 #define ATA_PRIMARY_IRQ 14
94 #define ATA_SECONDARY_IRQ 15
96 #define PRIM_SEC(bus) ((bus) == ATA_PRIMARY?"Primary ":"Secondary")
97 #define MAST_SLV(drive) ((drive) == ATA_MASTER?"master":"slave ")
98 #define DRIVE(bus, drive) ((bus) << 1 | (drive))
99 #define ATA_PORT(bus) ((bus) == ATA_PRIMARY ? ATA_PRIMARY_IO : ATA_SECONDARY_IO)
109 bool is_chs_addressing;
126 void ide_select_drive(uint8_t bus,
bool slave);
127 void ide_400ns_delay(uint16_t io);
128 void ide_poll(uint16_t io);
129 bool ide_poll_drq(uint16_t io);
130 bool ide_poll_bsy(uint16_t io);
132 void ata_read(uint8_t drive, uint8_t* buf, uint32_t location, uint32_t length) ;
133 void ata_write(uint8_t drive,
const uint8_t* buf,
size_t location,
size_t length);
139 void ata_check_all();
141 uint8_t ide_identify(uint8_t bus, uint8_t drive);
143 static inline void ata_set_params(uint8_t drive, uint16_t* io, uint8_t* real_drive) {
144 uint8_t _io = drive >> 1;
145 uint8_t _drv = drive & 1;
147 if(_io == ATA_PRIMARY)
148 *io = ATA_PRIMARY_IO;
149 else if(_io == ATA_SECONDARY)
150 *io = ATA_SECONDARY_IO;
Эта структура определяет каждый ATA диск в системе
bool is_dma
Является ли этот диск SATA устройством?
bool is_medium_inserted
Является ли пакетным устройством?
char * model_name
Поддерживает ли этот диск DMA?
uint16_t cylinders
Размер сектора
uint16_t block_size
Адресация по CHS?
size_t capacity
Устройство доступно?
bool is_packet
Ёмкость диска в секторах