diff options
Diffstat (limited to 'src/kernel/include/dev/pciide.h')
-rw-r--r-- | src/kernel/include/dev/pciide.h | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/src/kernel/include/dev/pciide.h b/src/kernel/include/dev/pciide.h new file mode 100644 index 0000000..ca65ca8 --- /dev/null +++ b/src/kernel/include/dev/pciide.h @@ -0,0 +1,114 @@ +#pragma once + +#include <vfs.h> + +#define ATA_SR_BSY 0x80 +#define ATA_SR_DRDY 0x40 +#define ATA_SR_DF 0x20 +#define ATA_SR_DSC 0x10 +#define ATA_SR_DRQ 0x08 +#define ATA_SR_CORR 0x04 +#define ATA_SR_IDX 0x02 +#define ATA_SR_ERR 0x01 + +#define ATA_ER_BBK 0x80 +#define ATA_ER_UNC 0x40 +#define ATA_ER_MC 0x20 +#define ATA_ER_IDNF 0x10 +#define ATA_ER_MCR 0x08 +#define ATA_ER_ABRT 0x04 +#define ATA_ER_TK0NF 0x02 +#define ATA_ER_AMNF 0x01 + +#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 ATAPI_CMD_READ 0xA8 +#define ATAPI_CMD_EJECT 0x1B + +#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 + +#define IDE_ATA 0x00 +#define IDE_ATAPI 0x01 + +#define ATA_MASTER 0x00 +#define ATA_SLAVE 0x01 + +#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 + +// Channels: +#define ATA_PRIMARY 0x00 +#define ATA_SECONDARY 0x01 + +// Directions: +#define ATA_READ 0x00 +#define ATA_WRITE 0x01 + +typedef struct { + uint16_t base; // IO base + uint16_t ctrl; // Control base + uint16_t bmide; // Bus Master IDE + uint8_t nIEN; // do not use interrupt + uint8_t irq; // which irq to wait for +} ide_channels_regs_t; + +typedef struct { + uint8_t present; // 0 : empty, 1 : present + uint8_t channel; // 0 : primary, 1 : secondary + uint8_t drive; // 0 : master, 1 : slave + uint16_t type; // 0 : ATA, 1 : ATAPI + uint16_t sig; // drive signature + uint16_t cap; // features (capabilities) + uint32_t cmdset; // supported command set + uint32_t size; // size in sectors + char model[41]; // model string +} ide_device_t; + +typedef struct { + ide_channels_regs_t channels[2]; + ide_device_t devices[4]; + bool irq_invoked; + char atapi_packet[12]; + int pci_id; +} ide_controller_t; + +void pciide_detect(fs_t *iofs); // iofs = where to add ATA drives + +/* vim: set ts=4 sw=4 tw=0 noet :*/ |