Changeset 0e6dce8 in mainline for uspace/srv/bd/ata_bd/ata_bd.c


Ignore:
Timestamp:
2009-08-22T13:58:10Z (15 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
b94334f
Parents:
a71c158
Message:

Display device model name upon initialization.

File:
1 edited

Legend:

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

    ra71c158 r0e6dce8  
    5050#include <as.h>
    5151#include <fibril_sync.h>
     52#include <string.h>
    5253#include <devmap.h>
    5354#include <sys/types.h>
     
    8586static int ata_bd_write_block(int disk_id, uint64_t blk_idx, size_t blk_cnt,
    8687    const void *buf);
    87 static int drive_identify(int drive_id, disk_t *d);
     88static int disk_init(disk_t *d, int disk_id);
     89static int drive_identify(int drive_id, void *buf);
    8890static int wait_status(unsigned set, unsigned n_reset, uint8_t *pstatus,
    8991    unsigned timeout);
     
    106108                fflush(stdout);
    107109
    108                 rc = drive_identify(i, &disk[i]);
     110                rc = disk_init(&disk[i], i);
    109111
    110112                if (rc == EOK) {
    111                         printf("%u cylinders, %u heads, %u sectors\n",
    112                             disk[i].cylinders, disk[i].heads, disk[i].sectors);
     113                        printf("%s: %u cylinders, %u heads, %u sectors.\n",
     114                            disk[i].model, disk[i].cylinders, disk[i].heads,
     115                            disk[i].sectors);
    113116                } else {
    114117                        printf("Not found.\n");
     
    251254}
    252255
     256/** Initialize a disk.
     257 *
     258 * Probes for a disk, determines its parameters and initializes
     259 * the disk structure.
     260 */
     261static int disk_init(disk_t *d, int disk_id)
     262{
     263        uint16_t buf[256];
     264        uint8_t model[40];
     265        uint16_t w;
     266        uint8_t c;
     267        size_t pos, len;
     268        int rc;
     269        int i;
     270
     271        rc = drive_identify(disk_id, buf);
     272        if (rc != EOK) {
     273                d->present = false;
     274                return rc;
     275        }
     276
     277        d->cylinders = buf[1];
     278        d->heads = buf[3];
     279        d->sectors = buf[6];
     280
     281        d->blocks = d->cylinders * d->heads * d->sectors;
     282
     283        /*
     284         * Convert model name to string representation.
     285         */
     286        for (i = 0; i < 20; i++) {
     287                w = buf[27 + i];
     288                model[2 * i] = w >> 8;
     289                model[2 * i + 1] = w & 0x00ff;
     290        }
     291
     292        len = 40;
     293        while (len > 0 && model[len - 1] == 0x20)
     294                --len;
     295
     296        pos = 0;
     297        for (i = 0; i < len; ++i) {
     298                c = model[i];
     299                if (c >= 0x80) c = '?';
     300
     301                chr_encode(c, d->model, &pos, 40);
     302        }
     303        d->model[pos] = '\0';
     304
     305        d->present = true;
     306        fibril_mutex_initialize(&d->lock);
     307
     308        return EOK;
     309}
     310
    253311/** Transfer a logical block from/to the device.
    254312 *
     
    294352/** Issue IDENTIFY command.
    295353 *
    296  * This is used to detect whether an ATA device is present and if so,
    297  * to determine its parameters. The parameters are written to @a d.
     354 * Reads @c identify data into the provided buffer. This is used to detect
     355 * whether an ATA device is present and if so, to determine its parameters.
    298356 *
    299357 * @param disk_id       Device ID, 0 or 1.
    300  * @param d             Device structure to store parameters in.
    301  */
    302 static int drive_identify(int disk_id, disk_t *d)
     358 * @param buf           Pointer to a 512-byte buffer.
     359 */
     360static int drive_identify(int disk_id, void *buf)
    303361{
    304362        uint16_t data;
     
    308366
    309367        drv_head = ((disk_id != 0) ? DHR_DRV : 0);
    310         d->present = false;
    311368
    312369        if (wait_status(0, ~SR_BSY, NULL, TIMEOUT_PROBE) != EOK)
     
    330387
    331388        if ((status & SR_DRQ) != 0) {
    332 //              for (i = 0; i < block_size / 2; i++) {
    333 //                      data = pio_read_16(&cmd->data_port);
    334 //                      ((uint16_t *) buf)[i] = data;
    335 //              }
    336 
    337389                for (i = 0; i < block_size / 2; i++) {
    338390                        data = pio_read_16(&cmd->data_port);
    339 
    340                         switch (i) {
    341                         case 1: d->cylinders = data; break;
    342                         case 3: d->heads = data; break;
    343                         case 6: d->sectors = data; break;
    344                         }
     391                        ((uint16_t *) buf)[i] = data;
    345392                }
    346393        }
     
    348395        if ((status & SR_ERR) != 0)
    349396                return EIO;
    350 
    351         d->blocks = d->cylinders * d->heads * d->sectors;
    352 
    353         d->present = true;
    354         fibril_mutex_initialize(&d->lock);
    355397
    356398        return EOK;
Note: See TracChangeset for help on using the changeset viewer.