blob: 46068e46e3109575285450d0eccf2a1d276fe136 (
plain) (
tree)
|
|
/*
* 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 <Eugeny.Mints@oktet.ru>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#ifndef __IDE_CTRL_IO_H__
#define __IDE_CTRL_IO_H__
#ifdef __cplusplus
extern "C" {
#endif
#include <rtems/blkdev.h>
/* 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,
unsigned16 block_size,
blkdev_sg_buffer *bufs,
rtems_unsigned32 *cbuf,
rtems_unsigned32 *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,
unsigned16 block_size,
blkdev_sg_buffer *bufs,
rtems_unsigned32 *cbuf,
rtems_unsigned32 *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,
unsigned16 *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, unsigned16 value);
/*
* ide_controller_config_io_speed --
* Set controller's speed of IO operations
*
* PARAMETERS:
* minor - minor number of controller
* modes_avaible - speeds available
*
* RETURNS:
* RTEMS_SUCCESSFUL on success, or error code if
* error occured
*/
rtems_status_code
ide_controller_config_io_speed(int minor, unsigned8 modes_avaible);
#ifdef __cplusplus
}
#endif
#endif /* __IDE_CTRL_IO_H__ */
|