Changeset 1787e527 in mainline for uspace/srv/bd/ata_bd/ata_bd.h


Ignore:
Timestamp:
2009-11-16T21:22:54Z (14 years ago)
Author:
Lenka Trochtova <trochtova.lenka@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5ebdf94
Parents:
fcbd1be (diff), 9c70ed6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merged with head (unstable)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/bd/ata_bd/ata_bd.h

    rfcbd1be r1787e527  
    3838#include <sys/types.h>
    3939#include <fibril_sync.h>
     40#include <string.h>
    4041
    4142enum {
     
    115116
    116117enum drive_head_bits {
    117         DHR_DRV         = 0x10
     118        DHR_LBA         = 0x40, /**< Use LBA addressing mode */
     119        DHR_DRV         = 0x10  /**< Select device 1 */
    118120};
    119121
     
    130132
    131133enum ata_command {
    132         CMD_IDENTIFY_DRIVE      = 0xEC,
    133134        CMD_READ_SECTORS        = 0x20,
    134         CMD_WRITE_SECTORS       = 0x30
     135        CMD_READ_SECTORS_EXT    = 0x24,
     136        CMD_WRITE_SECTORS       = 0x30,
     137        CMD_WRITE_SECTORS_EXT   = 0x34,
     138        CMD_IDENTIFY_DRIVE      = 0xEC
    135139};
    136140
     
    142146};
    143147
     148/** Data returned from @c identify command. */
     149typedef struct {
     150        uint16_t gen_conf;
     151        uint16_t cylinders;
     152        uint16_t _res2;
     153        uint16_t heads;
     154        uint16_t _vs4;
     155        uint16_t _vs5;
     156        uint16_t sectors;
     157        uint16_t _vs7;
     158        uint16_t _vs8;
     159        uint16_t _vs9;
     160
     161        uint16_t serial_number[10];
     162        uint16_t _vs20;
     163        uint16_t _vs21;
     164        uint16_t vs_bytes;
     165        uint16_t firmware_rev[4];
     166        uint16_t model_name[20];
     167
     168        uint16_t max_rw_multiple;
     169        uint16_t _res48;
     170        uint16_t caps;
     171        uint16_t _res50;
     172        uint16_t pio_timing;
     173        uint16_t dma_timing;
     174
     175        uint16_t validity;
     176        uint16_t cur_cyl;
     177        uint16_t cur_heads;
     178        uint16_t cur_sectors;
     179        uint16_t cur_capacity0;
     180        uint16_t cur_capacity1;
     181        uint16_t mss;
     182        uint16_t total_lba28_0;
     183        uint16_t total_lba28_1;
     184        uint16_t sw_dma;
     185        uint16_t mw_dma;
     186        uint16_t pio_modes;
     187        uint16_t min_mw_dma_cycle;
     188        uint16_t rec_mw_dma_cycle;
     189        uint16_t min_raw_pio_cycle;
     190        uint16_t min_iordy_pio_cycle;
     191
     192        uint16_t _res69;
     193        uint16_t _res70;
     194        uint16_t _res71;
     195        uint16_t _res72;
     196        uint16_t _res73;
     197        uint16_t _res74;
     198
     199        uint16_t queue_depth;
     200        uint16_t _res76[1 + 79 - 76];
     201        uint16_t version_maj;
     202        uint16_t version_min;
     203        uint16_t cmd_set0;
     204        uint16_t cmd_set1;
     205        uint16_t csf_sup_ext;
     206        uint16_t csf_enabled0;
     207        uint16_t csf_enabled1;
     208        uint16_t csf_default;
     209        uint16_t udma;
     210
     211        uint16_t _res89[1 + 99 - 89];
     212
     213        /* Total number of blocks in LBA-48 addressing */
     214        uint16_t total_lba48_0;
     215        uint16_t total_lba48_1;
     216        uint16_t total_lba48_2;
     217        uint16_t total_lba48_3;
     218
     219        /* Note: more fields are defined in ATA/ATAPI-7 */
     220        uint16_t _res104[1 + 127 - 104];
     221        uint16_t _vs128[1 + 159 - 128];
     222        uint16_t _res160[1 + 255 - 160];
     223} identify_data_t;
     224
     225enum ata_caps {
     226        cap_iordy       = 0x0800,
     227        cap_iordy_cbd   = 0x0400,
     228        cap_lba         = 0x0200,
     229        cap_dma         = 0x0100
     230};
     231
     232/** Bits of @c identify_data_t.cmd_set1 */
     233enum ata_cs1 {
     234        cs1_addr48      = 0x0400        /**< 48-bit address feature set */
     235};
     236
     237/** Block addressing mode. */
     238enum addr_mode {
     239        am_chs,         /**< CHS block addressing */
     240        am_lba28,       /**< LBA-28 block addressing */
     241        am_lba48        /**< LBA-48 block addressing */
     242};
     243
     244/** Block coordinates */
     245typedef struct {
     246        /** Addressing mode used */
     247        enum addr_mode amode;
     248
     249        union {
     250                /** CHS coordinates */
     251                struct {
     252                        uint8_t sector;
     253                        uint8_t cyl_lo;
     254                        uint8_t cyl_hi;
     255                };
     256                /** LBA coordinates */
     257                struct {
     258                        uint8_t c0;
     259                        uint8_t c1;
     260                        uint8_t c2;
     261                        uint8_t c3;
     262                        uint8_t c4;
     263                        uint8_t c5;
     264                };
     265        };
     266
     267        /** Lower 4 bits for device/head register */
     268        uint8_t h;
     269} block_coord_t;
     270
    144271typedef struct {
    145272        bool present;
    146         unsigned heads;
    147         unsigned cylinders;
    148         unsigned sectors;
     273        enum addr_mode amode;
     274
     275        /*
     276         * Geometry. Only valid if operating in CHS mode.
     277         */
     278        struct {
     279                unsigned heads;
     280                unsigned cylinders;
     281                unsigned sectors;
     282        } geom;
     283
    149284        uint64_t blocks;
     285
     286        char model[STR_BOUNDS(40) + 1];
    150287
    151288        fibril_mutex_t lock;
Note: See TracChangeset for help on using the changeset viewer.