/* * ide_ctrl_io.h * * LibChip library IDE controller header file - IO operations defined for * IDE controllers. * * Copyright (C) 2002 OKTET Ltd., St.-Petersburg, Russia * Author: Eugeny S. Mints * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. * * $Id$ */ #ifndef __IDE_CTRL_IO_H__ #define __IDE_CTRL_IO_H__ #ifdef __cplusplus extern "C" { #endif #include /* Command Block Registers */ #define IDE_REGISTER_DATA 0 #define IDE_REGISTER_ERROR 1 #define IDE_REGISTER_FEATURES IDE_REGISTER_ERROR #define IDE_REGISTER_SECTOR_COUNT 2 #define IDE_REGISTER_SECTOR_NUMBER 3 #define IDE_REGISTER_LBA0 IDE_REGISTER_SECTOR_NUMBER #define IDE_REGISTER_CYLINDER_LOW 4 #define IDE_REGISTER_LBA1 IDE_REGISTER_CYLINDER_LOW #define IDE_REGISTER_CYLINDER_HIGH 5 #define IDE_REGISTER_LBA2 IDE_REGISTER_CYLINDER_HIGH #define IDE_REGISTER_DEVICE_HEAD 6 #define IDE_REGISTER_LBA3 IDE_REGISTER_DEVICE_HEAD #define IDE_REGISTER_STATUS 7 #define IDE_REGISTER_COMMAND IDE_REGISTER_STATUS /* Control Block Registers */ #define IDE_REGISTER_ALTERNATE_STATUS 6 #define IDE_REGISTER_DEVICE_CONTROL IDE_REGISTER_ALTERNATE_STATUS /* offsets used to access registers */ #define IDE_REGISTER_DEVICE_CONTROL_OFFSET 8 #define IDE_REGISTER_ALTERNATE_STATUS_OFFSET IDE_REGISTER_DEVICE_CONTROL_OFFSET #define IDE_REGISTER_DATA_BYTE 9 #define IDE_REGISTER_DATA_WORD 10 /* * Registers bits */ #define IDE_REGISTER_STATUS_BSY 0x80 /* Busy bit */ #define IDE_REGISTER_STATUS_DRDY 0x40 /* Device ready */ #define IDE_REGISTER_STATUS_DF 0x20 /* Device fault */ #define IDE_REGISTER_STATUS_DSC 0x10 /* Device seek complete-- */ /* obsolete */ #define IDE_REGISTER_STATUS_DRQ 0x08 /* Data request */ #define IDE_REGISTER_STATUS_CORR 0x04 /* Corrected data-- */ /* vendor specific--obsolete */ #define IDE_REGISTER_STATUS_IDX 0x02 /* Index-- */ /* vendor specific--obsolete */ #define IDE_REGISTER_STATUS_ERR 0x01 /* Error */ #define IDE_REGISTER_DEVICE_CONTROL_SRST 0x04 /* Host software reset bit */ #define IDE_REGISTER_DEVICE_CONTROL_nIEN 0x02 /* Negated interrupt enable */ #define IDE_REGISTER_DEVICE_HEAD_L 0x40 /* LBA mode bit */ #define IDE_REGISTER_DEVICE_HEAD_DEV 0x10 /* Device0/Device1 bit */ #define IDE_REGISTER_DEVICE_HEAD_DEV_POS 4 /* Dev0/Dev1 bit position */ #define IDE_REGISTER_DEVICE_HEAD_HS 0x0f /* Head/LBA24_27 bits */ #define IDE_REGISTER_LBA3_L 0x40 #define IDE_REGISTER_LBA3_DEV 0x10 #define IDE_REGISTER_LBA3_LBA 0x0f #define IDE_REGISTER_ERROR_ICRC 0x80 /* Interface CRC error on */ /* UDMA data transfer */ #define IDE_REGISTER_ERROR_UNC 0x40 /* Uncorrectable data error */ #define IDE_REGISTER_ERROR_WP 0x40 /* Write protect */ #define IDE_REGISTER_ERROR_MC 0x20 /* Media changed */ #define IDE_REGISTER_ERROR_IDNF 0x10 /* Sector ID not found */ #define IDE_REGISTER_ERROR_MCR 0x08 /* Media change requested */ #define IDE_REGISTER_ERROR_ABRT 0x04 /* Aborted command */ #define IDE_REGISTER_ERROR_NM 0x02 /* No media */ #define IDE_REGISTER_ERROR_AMNF 0x01 /* Address mark not found */ /* --obsolette in ATA-4 */ #define IDE_REGISTER_ERROR_MED 0x01 /* Media error is detected */ /* * ide_controller_read_data_block -- * Read data block via controller's data register * * PARAMETERS: * minor - minor number of controller * block_size - number of bytes to read * bufs - set of buffers to store data * cbuf - number of current buffer from the set * pos - position inside current buffer 'cbuf' * * RETURNS: * NONE */ void ide_controller_read_data_block(rtems_device_minor_number minor, uint16_t block_size, rtems_blkdev_sg_buffer *bufs, uint32_t *cbuf, uint32_t *pos); /* * ide_controller_write_data_block -- * Write data block via controller's data register * * PARAMETERS: * minor - minor number of controller * block_size - number of bytes to write * bufs - set of buffers which store data * cbuf - number of current buffer from the set * pos - position inside current buffer 'cbuf' * * RETURNS: * NONE */ void ide_controller_write_data_block(rtems_device_minor_number minor, uint16_t block_size, rtems_blkdev_sg_buffer *bufs, uint32_t *cbuf, uint32_t *pos); /* * ide_controller_read_register -- * Read controller's register * * PARAMETERS: * minor - minor number of controller * reg - register to read * value - placeholder for result * * RETURNS * NONE */ void ide_controller_read_register(rtems_device_minor_number minor, int reg, uint16_t *value); /* * ide_controller_write_register -- * Write controller's register * * PARAMETERS: * minor - minor number of controller * reg - register to write * value - value to write * * RETURNS: * NONE */ void ide_controller_write_register(rtems_device_minor_number minor, int reg, uint16_t value); /* * ide_controller_config_io_speed -- * Set controller's speed of IO operations * * PARAMETERS: * minor - minor number of controller * modes_available - speeds available * * RETURNS: * RTEMS_SUCCESSFUL on success, or error code if * error occured */ rtems_status_code ide_controller_config_io_speed(int minor, uint16_t modes_available); #ifdef __cplusplus } #endif #endif /* __IDE_CTRL_IO_H__ */