145 lines
4.3 KiB
C
145 lines
4.3 KiB
C
/*
|
|
* See file CREDITS for list of people who contributed to this
|
|
* project.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef ATA_DISK_H
|
|
# define ATA_DISK
|
|
|
|
#include <block.h>
|
|
|
|
/* IDE register file */
|
|
#define IDE_REG_DATA 0x00
|
|
#define IDE_REG_ERR 0x01
|
|
#define IDE_REG_NSECT 0x02
|
|
#define IDE_REG_LBAL 0x03
|
|
#define IDE_REG_LBAM 0x04
|
|
#define IDE_REG_LBAH 0x05
|
|
#define IDE_REG_DEVICE 0x06
|
|
#define IDE_REG_STATUS 0x07
|
|
|
|
#define IDE_REG_FEATURE IDE_REG_ERR /* and their aliases */
|
|
#define IDE_REG_CMD IDE_REG_STATUS
|
|
|
|
#define IDE_REG_ALT_STATUS 0x00
|
|
#define IDE_REG_DEV_CTL 0x00
|
|
#define IDE_REG_DRV_ADDR 0x01
|
|
|
|
#define ATA_CMD_ID_ATA 0xEC
|
|
#define ATA_CMD_READ 0x20
|
|
#define ATA_CMD_READ_EXT 0x25
|
|
#define ATA_CMD_WRITE 0x30
|
|
#define ATA_CMD_WRITE_EXT 0x35
|
|
|
|
/* drive's status flags */
|
|
#define ATA_STATUS_BUSY (1 << 7)
|
|
#define ATA_STATUS_READY (1 << 6)
|
|
#define ATA_STATUS_WR_FLT (1 << 5)
|
|
#define ATA_STATUS_DSC (1 << 4)
|
|
#define ATA_STATUS_DRQ (1 << 3)
|
|
#define ATA_STATUS_CORR (1 << 2)
|
|
#define ATA_STATUS_IDX (1 << 1)
|
|
#define ATA_STATUS_ERROR (1 << 0)
|
|
/* command flags */
|
|
#define LBA_FLAG (1 << 6)
|
|
#define ATA_DEVCTL_SOFT_RESET (1 << 2)
|
|
#define ATA_DEVCTL_INTR_DISABLE (1 << 1)
|
|
|
|
/** addresses of each individual IDE drive register */
|
|
struct ata_ioports {
|
|
void __iomem *cmd_addr;
|
|
void __iomem *data_addr;
|
|
void __iomem *error_addr;
|
|
void __iomem *feature_addr;
|
|
void __iomem *nsect_addr;
|
|
void __iomem *lbal_addr;
|
|
void __iomem *lbam_addr;
|
|
void __iomem *lbah_addr;
|
|
void __iomem *device_addr;
|
|
void __iomem *status_addr;
|
|
void __iomem *command_addr;
|
|
void __iomem *altstatus_addr;
|
|
void __iomem *ctl_addr;
|
|
void __iomem *alt_dev_addr;
|
|
|
|
/* hard reset line handling */
|
|
void (*reset)(int); /* true: assert reset, false: de-assert reset */
|
|
int dataif_be; /* true if 16 bit data register is big endian */
|
|
};
|
|
|
|
struct ata_port;
|
|
|
|
struct ata_port_operations {
|
|
int (*init)(struct ata_port *port);
|
|
int (*read)(struct ata_port *port, void *buf, unsigned int block, int num_blocks);
|
|
int (*write)(struct ata_port *port, const void *buf, unsigned int block, int num_blocks);
|
|
int (*read_id)(struct ata_port *port, void *buf);
|
|
int (*reset)(struct ata_port *port);
|
|
};
|
|
|
|
struct ata_port {
|
|
struct ata_port_operations *ops;
|
|
struct device_d *dev;
|
|
struct device_d class_dev;
|
|
void *drvdata;
|
|
struct block_device blk;
|
|
uint16_t *id;
|
|
int initialized;
|
|
};
|
|
|
|
int ide_port_register(struct device_d *, struct ata_ioports *);
|
|
int ata_port_register(struct ata_port *port);
|
|
|
|
struct device_d;
|
|
|
|
/**
|
|
* @file
|
|
* @brief Register file examples of generic types of ATA devices
|
|
*
|
|
* PC IDE:
|
|
*
|
|
* Offset Read Write Note
|
|
*-----------------------------------------------------------
|
|
* 0x1f0 data data 16 bit register
|
|
* 0x1f1 error feature
|
|
* 0x1f2 sec cnt set cnt
|
|
* 0x1f3 sec no sec no
|
|
* 0x1f4 cyl low cyl low
|
|
* 0x1f5 cyl high cyl high
|
|
* 0x1f6 head head
|
|
* 0x1f7 status command
|
|
* 0x3f6 alt status dev cntrl
|
|
* 0x3f7 drv addr
|
|
*
|
|
* PCMCIA memory mapped:
|
|
*
|
|
* Offset Read Write Note
|
|
*-----------------------------------------------------------
|
|
* 0x0 data data 16 bit register
|
|
* 0x1 error feature
|
|
* 0x2 sec cnt set cnt
|
|
* 0x3 sec no sec no
|
|
* 0x4 cyl low cyl low
|
|
* 0x5 cyl high cyl high
|
|
* 0x6 head head
|
|
* 0x7 status command
|
|
* 0x8 data data 16 bit or 8 bit register (even byte)
|
|
* 0x9 data data 8 bit register (odd byte)
|
|
* 0xd error feature dup of offset 1
|
|
* 0xe alt status dev cntrl
|
|
* 0xf drv addr
|
|
* 0x400 data data 16 bit area with 1 kiB in size
|
|
*/
|
|
|
|
#endif /* ATA_DISK */
|