71 lines
1.5 KiB
C
71 lines
1.5 KiB
C
#pragma once
|
|
#include "stdarg.h"
|
|
|
|
#define ATA_PIO_DATA 0
|
|
#define ATA_PIO_ERR 1
|
|
#define ATA_PIO_FEAT 1
|
|
#define ATA_PIO_SEC_COUNT 2
|
|
#define ATA_PIO_LBALO 3
|
|
#define ATA_PIO_LBAMID 4
|
|
#define ATA_PIO_CYL_LOW 4
|
|
#define ATA_PIO_LBAHI 5
|
|
#define ATA_PIO_CYL_HI 5
|
|
#define ATA_PIO_DRIVE 6
|
|
#define ATA_PIO_STATUS 7
|
|
#define ATA_PIO_CMD 7
|
|
|
|
// cmd details
|
|
// https://people.freebsd.org/~imp/asiabsdcon2015/works/d2161r5-ATAATAPI_Command_Set_-_3.pdf
|
|
#define ATA_PIO_CMD_IDENTIFY 0xEC
|
|
|
|
#define ATA_PIO_ERROR_ADDR_MARK_NOT_FOUND 0
|
|
#define ATA_PIO_ERROR_TRACK_ZERO_NOT_FOUND 1
|
|
#define ATA_PIO_ERROR_ABORTED 2
|
|
#define ATA_PIO_ERROR_MEDIA_CHANGE_REQUEST 3
|
|
#define ATA_PIO_ERROR_ID_NOT_FOUND 4
|
|
#define ATA_PIO_ERROR_MEDIA_CHANGED 5
|
|
#define ATA_PIO_ERROR_UNCORRECTABLE_DATA 6
|
|
#define ATA_PIO_ERROR_BAD_BLOCK 7
|
|
|
|
#define ATA_PIO_STATUS_REG_ERR (1 << 0)
|
|
#define ATA_PIO_STATUS_IDX (1 << 1)
|
|
#define ATA_PIO_STATUS_CORP (1 << 2)
|
|
#define ATA_PIO_STATUS_DRQ (1 << 3)
|
|
#define ATA_PIO_STATUS_SRV (1 << 4)
|
|
#define ATA_PIO_STATUS_DRIVE_FAULT (1 << 5)
|
|
#define ATA_PIO_STATUS_DRIVE_RDY (1 << 6)
|
|
#define ATA_PIO_STATUS_DRIVE_BUSY (1 << 7)
|
|
|
|
#define MAX_ATA_CONTROLLER 2
|
|
#define MAX_ATA_DEVICES 2
|
|
|
|
#define DISK_SECTOR_SIZE 512
|
|
|
|
typedef enum {
|
|
ATA_DEV_UNKNOWN,
|
|
ATA_DEV_PATA,
|
|
ATA_DEV_SATA,
|
|
ATA_DEV_PATAPI,
|
|
ATA_DEV_SATAPI
|
|
} ata_type;
|
|
|
|
struct ata_device {
|
|
int id;
|
|
ata_type type;
|
|
int isSlave;
|
|
struct ata_controller *ctl;
|
|
int heads;
|
|
int cyls;
|
|
int sectors;
|
|
};
|
|
|
|
struct ata_controller {
|
|
int id;
|
|
int16_t base;
|
|
int16_t dev_ctl;
|
|
int present;
|
|
struct ata_device devices[MAX_ATA_DEVICES];
|
|
};
|
|
|
|
int ATAInit();
|