[11bbeb9] | 1 | /* |
---|
| 2 | * ide_ctrl_io.h |
---|
| 3 | * |
---|
[a3d3d9a] | 4 | * LibChip library IDE controller header file - IO operations defined for |
---|
| 5 | * IDE controllers. |
---|
[11bbeb9] | 6 | * |
---|
| 7 | * Copyright (C) 2002 OKTET Ltd., St.-Petersburg, Russia |
---|
| 8 | * Author: Eugeny S. Mints <Eugeny.Mints@oktet.ru> |
---|
| 9 | * |
---|
| 10 | * The license and distribution terms for this file may be |
---|
| 11 | * found in the file LICENSE in this distribution or at |
---|
[c499856] | 12 | * http://www.rtems.org/license/LICENSE. |
---|
[11bbeb9] | 13 | */ |
---|
| 14 | #ifndef __IDE_CTRL_IO_H__ |
---|
| 15 | #define __IDE_CTRL_IO_H__ |
---|
| 16 | |
---|
| 17 | #ifdef __cplusplus |
---|
| 18 | extern "C" { |
---|
| 19 | #endif |
---|
| 20 | |
---|
| 21 | #include <rtems/blkdev.h> |
---|
| 22 | |
---|
| 23 | /* Command Block Registers */ |
---|
| 24 | #define IDE_REGISTER_DATA 0 |
---|
| 25 | #define IDE_REGISTER_ERROR 1 |
---|
| 26 | #define IDE_REGISTER_FEATURES IDE_REGISTER_ERROR |
---|
| 27 | #define IDE_REGISTER_SECTOR_COUNT 2 |
---|
| 28 | #define IDE_REGISTER_SECTOR_NUMBER 3 |
---|
[a3d3d9a] | 29 | #define IDE_REGISTER_LBA0 IDE_REGISTER_SECTOR_NUMBER |
---|
[11bbeb9] | 30 | #define IDE_REGISTER_CYLINDER_LOW 4 |
---|
| 31 | #define IDE_REGISTER_LBA1 IDE_REGISTER_CYLINDER_LOW |
---|
| 32 | #define IDE_REGISTER_CYLINDER_HIGH 5 |
---|
| 33 | #define IDE_REGISTER_LBA2 IDE_REGISTER_CYLINDER_HIGH |
---|
| 34 | #define IDE_REGISTER_DEVICE_HEAD 6 |
---|
| 35 | #define IDE_REGISTER_LBA3 IDE_REGISTER_DEVICE_HEAD |
---|
| 36 | #define IDE_REGISTER_STATUS 7 |
---|
| 37 | #define IDE_REGISTER_COMMAND IDE_REGISTER_STATUS |
---|
| 38 | |
---|
| 39 | /* Control Block Registers */ |
---|
| 40 | #define IDE_REGISTER_ALTERNATE_STATUS 6 |
---|
| 41 | #define IDE_REGISTER_DEVICE_CONTROL IDE_REGISTER_ALTERNATE_STATUS |
---|
| 42 | |
---|
[a3d3d9a] | 43 | /* offsets used to access registers */ |
---|
[11bbeb9] | 44 | #define IDE_REGISTER_DEVICE_CONTROL_OFFSET 8 |
---|
| 45 | #define IDE_REGISTER_ALTERNATE_STATUS_OFFSET IDE_REGISTER_DEVICE_CONTROL_OFFSET |
---|
| 46 | #define IDE_REGISTER_DATA_BYTE 9 |
---|
| 47 | #define IDE_REGISTER_DATA_WORD 10 |
---|
| 48 | |
---|
| 49 | /* |
---|
| 50 | * Registers bits |
---|
| 51 | */ |
---|
| 52 | #define IDE_REGISTER_STATUS_BSY 0x80 /* Busy bit */ |
---|
| 53 | #define IDE_REGISTER_STATUS_DRDY 0x40 /* Device ready */ |
---|
| 54 | #define IDE_REGISTER_STATUS_DF 0x20 /* Device fault */ |
---|
| 55 | #define IDE_REGISTER_STATUS_DSC 0x10 /* Device seek complete-- */ |
---|
| 56 | /* obsolete */ |
---|
| 57 | #define IDE_REGISTER_STATUS_DRQ 0x08 /* Data request */ |
---|
| 58 | #define IDE_REGISTER_STATUS_CORR 0x04 /* Corrected data-- */ |
---|
| 59 | /* vendor specific--obsolete */ |
---|
| 60 | #define IDE_REGISTER_STATUS_IDX 0x02 /* Index-- */ |
---|
| 61 | /* vendor specific--obsolete */ |
---|
| 62 | #define IDE_REGISTER_STATUS_ERR 0x01 /* Error */ |
---|
| 63 | |
---|
| 64 | #define IDE_REGISTER_DEVICE_CONTROL_SRST 0x04 /* Host software reset bit */ |
---|
| 65 | #define IDE_REGISTER_DEVICE_CONTROL_nIEN 0x02 /* Negated interrupt enable */ |
---|
| 66 | |
---|
| 67 | #define IDE_REGISTER_DEVICE_HEAD_L 0x40 /* LBA mode bit */ |
---|
| 68 | #define IDE_REGISTER_DEVICE_HEAD_DEV 0x10 /* Device0/Device1 bit */ |
---|
| 69 | #define IDE_REGISTER_DEVICE_HEAD_DEV_POS 4 /* Dev0/Dev1 bit position */ |
---|
| 70 | #define IDE_REGISTER_DEVICE_HEAD_HS 0x0f /* Head/LBA24_27 bits */ |
---|
| 71 | #define IDE_REGISTER_LBA3_L 0x40 |
---|
| 72 | #define IDE_REGISTER_LBA3_DEV 0x10 |
---|
| 73 | #define IDE_REGISTER_LBA3_LBA 0x0f |
---|
| 74 | |
---|
[7357f566] | 75 | #define IDE_REGISTER_ERROR_ICRC (1 << 7) /* Interface CRC error on */ |
---|
| 76 | /* UDMA data transfer */ |
---|
| 77 | #define IDE_REGISTER_ERROR_UNC (1 << 6) /* Uncorrectable data error */ |
---|
| 78 | #if CCJ_COULD_NOT_FIND_THIS_ERROR |
---|
| 79 | #define IDE_REGISTER_ERROR_WP (1 << 6) /* Write protect */ |
---|
| 80 | #endif |
---|
| 81 | #define IDE_REGISTER_ERROR_MC (1 << 5) /* Media changed */ |
---|
| 82 | #define IDE_REGISTER_ERROR_IDNF (1 << 4) /* Sector ID not found */ |
---|
| 83 | #define IDE_REGISTER_ERROR_MCR (1 << 3) /* Media change requested */ |
---|
| 84 | /* obsolette */ |
---|
| 85 | #define IDE_REGISTER_ERROR_ABRT (1 << 2) /* Aborted command */ |
---|
| 86 | #define IDE_REGISTER_ERROR_NM (1 << 1) /* No media, End of Media. */ |
---|
| 87 | #define IDE_REGISTER_ERROR_AMNF (1 << 0) /* Address mark not found */ |
---|
| 88 | /* --obsolette in ATA-4 */ |
---|
| 89 | #define IDE_REGISTER_ERROR_MED (1 << 0) /* Media error is detected */ |
---|
[11bbeb9] | 90 | |
---|
| 91 | /* |
---|
| 92 | * ide_controller_read_data_block -- |
---|
| 93 | * Read data block via controller's data register |
---|
| 94 | * |
---|
| 95 | * PARAMETERS: |
---|
| 96 | * minor - minor number of controller |
---|
| 97 | * block_size - number of bytes to read |
---|
| 98 | * bufs - set of buffers to store data |
---|
| 99 | * cbuf - number of current buffer from the set |
---|
| 100 | * pos - position inside current buffer 'cbuf' |
---|
| 101 | * |
---|
| 102 | * RETURNS: |
---|
| 103 | * NONE |
---|
| 104 | */ |
---|
| 105 | void |
---|
| 106 | ide_controller_read_data_block(rtems_device_minor_number minor, |
---|
[7357f566] | 107 | uint32_t block_size, |
---|
[3735f08] | 108 | rtems_blkdev_sg_buffer *bufs, |
---|
| 109 | uint32_t *cbuf, |
---|
| 110 | uint32_t *pos); |
---|
[11bbeb9] | 111 | |
---|
| 112 | /* |
---|
| 113 | * ide_controller_write_data_block -- |
---|
| 114 | * Write data block via controller's data register |
---|
| 115 | * |
---|
| 116 | * PARAMETERS: |
---|
| 117 | * minor - minor number of controller |
---|
| 118 | * block_size - number of bytes to write |
---|
| 119 | * bufs - set of buffers which store data |
---|
| 120 | * cbuf - number of current buffer from the set |
---|
| 121 | * pos - position inside current buffer 'cbuf' |
---|
| 122 | * |
---|
| 123 | * RETURNS: |
---|
| 124 | * NONE |
---|
| 125 | */ |
---|
| 126 | void |
---|
| 127 | ide_controller_write_data_block(rtems_device_minor_number minor, |
---|
[7357f566] | 128 | uint32_t block_size, |
---|
[3735f08] | 129 | rtems_blkdev_sg_buffer *bufs, |
---|
| 130 | uint32_t *cbuf, |
---|
| 131 | uint32_t *pos); |
---|
[11bbeb9] | 132 | |
---|
| 133 | /* |
---|
| 134 | * ide_controller_read_register -- |
---|
| 135 | * Read controller's register |
---|
| 136 | * |
---|
| 137 | * PARAMETERS: |
---|
| 138 | * minor - minor number of controller |
---|
| 139 | * reg - register to read |
---|
| 140 | * value - placeholder for result |
---|
| 141 | * |
---|
| 142 | * RETURNS |
---|
| 143 | * NONE |
---|
| 144 | */ |
---|
| 145 | void |
---|
| 146 | ide_controller_read_register(rtems_device_minor_number minor, |
---|
[a3d3d9a] | 147 | int reg, |
---|
[ee4f57d] | 148 | uint16_t *value); |
---|
[11bbeb9] | 149 | |
---|
| 150 | /* |
---|
| 151 | * ide_controller_write_register -- |
---|
| 152 | * Write controller's register |
---|
| 153 | * |
---|
| 154 | * PARAMETERS: |
---|
| 155 | * minor - minor number of controller |
---|
| 156 | * reg - register to write |
---|
| 157 | * value - value to write |
---|
| 158 | * |
---|
| 159 | * RETURNS: |
---|
| 160 | * NONE |
---|
| 161 | */ |
---|
| 162 | void |
---|
| 163 | ide_controller_write_register(rtems_device_minor_number minor, |
---|
[ee4f57d] | 164 | int reg, uint16_t value); |
---|
[11bbeb9] | 165 | |
---|
| 166 | /* |
---|
| 167 | * ide_controller_config_io_speed -- |
---|
| 168 | * Set controller's speed of IO operations |
---|
| 169 | * |
---|
| 170 | * PARAMETERS: |
---|
[bf474880] | 171 | * minor - minor number of controller |
---|
| 172 | * modes_available - speeds available |
---|
[11bbeb9] | 173 | * |
---|
| 174 | * RETURNS: |
---|
| 175 | * RTEMS_SUCCESSFUL on success, or error code if |
---|
| 176 | * error occured |
---|
| 177 | */ |
---|
[a3d3d9a] | 178 | rtems_status_code |
---|
[bf474880] | 179 | ide_controller_config_io_speed(int minor, uint16_t modes_available); |
---|
[11bbeb9] | 180 | |
---|
| 181 | #ifdef __cplusplus |
---|
| 182 | } |
---|
| 183 | #endif |
---|
| 184 | |
---|
| 185 | |
---|
| 186 | #endif /* __IDE_CTRL_IO_H__ */ |
---|