2024-05-22 12:25:52 -04:00
|
|
|
#ifndef RK_IDE_H_
|
|
|
|
#define RK_IDE_H_
|
2024-05-21 22:07:04 -04:00
|
|
|
|
2024-05-23 01:31:32 -04:00
|
|
|
#include <stdint.h>
|
|
|
|
|
2024-05-21 22:07:04 -04:00
|
|
|
enum IDE_MODE {
|
|
|
|
ISA_ONLY = 0x00,
|
|
|
|
PCI_ONLY = 0x05,
|
|
|
|
ISA_CAN_SWITCH = 0x0a,
|
|
|
|
PCI_CAN_SWITCH = 0x0f,
|
|
|
|
ISA_ONLY_BUS_MASTERING = 0x80,
|
|
|
|
PCI_ONLY_BUS_MASTERING = 0x85,
|
|
|
|
ISA_CAN_SWITCH_BUS_MASTERING = 0x8a,
|
|
|
|
PCI_CAN_SWITCH_BUS_MASTERING = 0x8f,
|
|
|
|
};
|
|
|
|
|
2024-05-23 01:31:32 -04:00
|
|
|
#define ATA_PRIMARY 0
|
|
|
|
#define ATA_SECONDARY 1
|
|
|
|
#define ATA_MASTER 0
|
|
|
|
#define ATA_SLAVE 1
|
|
|
|
|
|
|
|
#define ATA_PRIMARY_IO 0x1F0
|
|
|
|
#define ATA_SECONDARY_IO 0x170
|
|
|
|
|
|
|
|
#define ATA_PRIMARY_DCR_AS 0x3F6
|
|
|
|
#define ATA_SECONDARY_DCR_AS 0x376
|
|
|
|
|
|
|
|
#define ATA_PRIMARY_IRQ 14
|
|
|
|
#define ATA_SECONDARY_IRQ 15
|
|
|
|
|
|
|
|
#define ATA_REG_DATA 0x00
|
|
|
|
#define ATA_REG_ERROR 0x01
|
|
|
|
#define ATA_REG_FEATURES 0x01
|
|
|
|
#define ATA_REG_SECCOUNT0 0x02
|
|
|
|
#define ATA_REG_LBA0 0x03
|
|
|
|
#define ATA_REG_LBA1 0x04
|
|
|
|
#define ATA_REG_LBA2 0x05
|
|
|
|
#define ATA_REG_HDDEVSEL 0x06
|
|
|
|
#define ATA_REG_COMMAND 0x07
|
|
|
|
#define ATA_REG_STATUS 0x07
|
|
|
|
#define ATA_REG_SECCOUNT1 0x08
|
|
|
|
#define ATA_REG_LBA3 0x09
|
|
|
|
#define ATA_REG_LBA4 0x0A
|
|
|
|
#define ATA_REG_LBA5 0x0B
|
|
|
|
#define ATA_REG_CONTROL 0x0C
|
|
|
|
#define ATA_REG_ALTSTATUS 0x0C
|
|
|
|
#define ATA_REG_DEVADDRESS 0x0D
|
|
|
|
|
|
|
|
#define ATA_CMD_READ_PIO 0x20
|
|
|
|
#define ATA_CMD_READ_PIO_EXT 0x24
|
|
|
|
#define ATA_CMD_READ_DMA 0xC8
|
|
|
|
#define ATA_CMD_READ_DMA_EXT 0x25
|
|
|
|
#define ATA_CMD_WRITE_PIO 0x30
|
|
|
|
#define ATA_CMD_WRITE_PIO_EXT 0x34
|
|
|
|
#define ATA_CMD_WRITE_DMA 0xCA
|
|
|
|
#define ATA_CMD_WRITE_DMA_EXT 0x35
|
|
|
|
#define ATA_CMD_CACHE_FLUSH 0xE7
|
|
|
|
#define ATA_CMD_CACHE_FLUSH_EXT 0xEA
|
|
|
|
#define ATA_CMD_PACKET 0xA0
|
|
|
|
#define ATA_CMD_IDENTIFY_PACKET 0xA1
|
|
|
|
#define ATA_CMD_IDENTIFY 0xEC
|
|
|
|
|
|
|
|
#define ATA_SR_BSY 0x80 // Busy
|
|
|
|
#define ATA_SR_DRDY 0x40 // Drive ready
|
|
|
|
#define ATA_SR_DF 0x20 // Drive write fault
|
|
|
|
#define ATA_SR_DSC 0x10 // Drive seek complete
|
|
|
|
#define ATA_SR_DRQ 0x08 // Data request ready
|
|
|
|
#define ATA_SR_CORR 0x04 // Corrected data
|
|
|
|
#define ATA_SR_IDX 0x02 // Index
|
|
|
|
#define ATA_SR_ERR 0x01 // Error
|
|
|
|
|
|
|
|
#define ATA_IDENT_DEVICETYPE 0
|
|
|
|
#define ATA_IDENT_CYLINDERS 2
|
|
|
|
#define ATA_IDENT_HEADS 6
|
|
|
|
#define ATA_IDENT_SECTORS 12
|
|
|
|
#define ATA_IDENT_SERIAL 20
|
|
|
|
#define ATA_IDENT_MODEL 54
|
|
|
|
#define ATA_IDENT_CAPABILITIES 98
|
|
|
|
#define ATA_IDENT_FIELDVALID 106
|
|
|
|
#define ATA_IDENT_MAX_LBA 120
|
|
|
|
#define ATA_IDENT_COMMANDSETS 164
|
|
|
|
#define ATA_IDENT_MAX_LBA_EXT 200
|
2024-05-22 00:32:44 -04:00
|
|
|
|
2024-05-23 01:31:32 -04:00
|
|
|
uint16_t ide_select_drive(uint8_t bus, uint8_t drive);
|
|
|
|
uint8_t ide_identify(uint8_t bus, uint8_t drive, uint16_t *ide_buf);
|
|
|
|
uint8_t ata_read_sector(uint8_t bus, uint8_t drive, uint32_t lba, uint8_t *buf);
|
2024-05-22 00:32:44 -04:00
|
|
|
|
2024-05-21 22:07:04 -04:00
|
|
|
#endif
|