Mercurial > ecos
comparison packages/io/disk/current/include/diskio.h @ 2300:654c837cc618
* include/disk.h (DISK_CHANNEL): No need for extra _part_dev
slot intended for entire disk's own devtab.
* src/disk.c (disk_lookup): Just access pdevs_dev directly
with no adjusted offset.
(disk_init): No longer set entry 0 from device devtab.
It's unnecessary.
* include/disk.h: Merge eCosCentric CVS with public eCos CVS.
This merges (and therefore changes) the API. ChangeLog
entries have been incorporated in the correct places below.
* include/diskio.h: Also merged.
* cdl/io_disk.cdl: Also merged.
* src/disk.c: Also merged.
* src/disk.c (read_partition): Switched to favour LBA partition
information in partition tables. This also means we don't now rely
on the driver reporting a correct CHS size for the disk.
(disk_bread, disk_bwrite): API changed to take length in sectors
rather than bytes. Also call hardware driver to transfer in
(up to) max_transfer sized chunks, rather than a sector at a
time. Call in to driver now made with DSR lock claimed, to avoid a
race condition between the DSR and the calling thread.
(disk_get_config): Added phys_block_size to channel info.
* include/diskio.h (struct cyg_disk_identify_t): Added
phys_block_size and max_transfer fields. These must be filled in
by the driver.
* include/disk.h (DISK_CHANNEL_INIT): New macro. Allows a
DISK_CHANNEL to be defined dynamically.
* src/disk.c (disk_bread, disk_bwrite): Made calls to
cyg_thread_yield() dependent on presence ok kernel.
* src/disk.c (disk_bwrite): Uncomment the cyg_thread_yield() at
the end to prevent thread starvation between threads at the same
priority.
(disk_bread): Ditto.
* src/disk.c (read_partition): Changed to account for very large
disks which report bogus CHS geometry. We can only use the LBA
partition parameters in such disks.
(disk_set_config): Added some extra debug output.
* src/disk.c:
Various changes to support disconnect/reconnect of changeable
media.
* include/diskio.h: Added mount counter to disk_info structure.
* include/disk.h: Changed disk_disconnected() function to take a
pointer to a struct disk_channel rather than a struct
cyg_devtab_entry. Added mount count to disk_channel structure.
Moved include of diskio.h to end to fix declaration problems.
* src/disk.c: Fixed bug in write routine where controller result
field was not being initialized. Added signals on controller queue
condition variable after setting controller busy flag to false.
* include/disk.h: Made controller result and busy fields
volatile. Just in case.
* include/disk.h:
* src/disk.c:
Many changes. Added additional disk_controller data structure to
better reflect hardware structure. Added support for serialization
of multithreaded accesses to a single controller. Added support
for asynchronous, interrupt driven, IO operations. Various
tidies.
| author | jlarmour |
|---|---|
| date | Thu, 21 Sep 2006 16:38:38 +0000 |
| parents | b1d2762b2eec |
| children | 21a641579915 |
comparison
equal
deleted
inserted
replaced
| 2299:04006a2b020d | 2300:654c837cc618 |
|---|---|
| 8 // | 8 // |
| 9 // ==================================================================== | 9 // ==================================================================== |
| 10 //####ECOSGPLCOPYRIGHTBEGIN#### | 10 //####ECOSGPLCOPYRIGHTBEGIN#### |
| 11 // ------------------------------------------- | 11 // ------------------------------------------- |
| 12 // This file is part of eCos, the Embedded Configurable Operating System. | 12 // This file is part of eCos, the Embedded Configurable Operating System. |
| 13 // Copyright (C) 2003 Savin Zlobec | 13 // Copyright (C) 2003 Savin Zlobec |
| 14 // Copyright (C) 2004, 2006 eCosCentric Limited | |
| 14 // | 15 // |
| 15 // eCos is free software; you can redistribute it and/or modify it under | 16 // eCos is free software; you can redistribute it and/or modify it under |
| 16 // the terms of the GNU General Public License as published by the Free | 17 // the terms of the GNU General Public License as published by the Free |
| 17 // Software Foundation; either version 2 or (at your option) any later version. | 18 // Software Foundation; either version 2 or (at your option) any later version. |
| 18 // | 19 // |
| 53 | 54 |
| 54 #include <pkgconf/hal.h> | 55 #include <pkgconf/hal.h> |
| 55 #include <cyg/infra/cyg_type.h> | 56 #include <cyg/infra/cyg_type.h> |
| 56 #include <cyg/io/config_keys.h> | 57 #include <cyg/io/config_keys.h> |
| 57 | 58 |
| 59 #include <cyg/io/devtab.h> | |
| 60 | |
| 58 #ifdef __cplusplus | 61 #ifdef __cplusplus |
| 59 extern "C" { | 62 extern "C" { |
| 60 #endif | 63 #endif |
| 61 | 64 |
| 62 typedef struct { | 65 struct cyg_disk_identify_t |
| 66 { | |
| 63 char serial[20+1]; // serial number | 67 char serial[20+1]; // serial number |
| 64 char firmware_rev[8+1]; // firmware revision | 68 char firmware_rev[8+1]; // firmware revision |
| 65 char model_num[40+1]; // model number | 69 char model_num[40+1]; // model number |
| 66 cyg_uint32 cylinders_num; // number of cylinders (CHS) | 70 cyg_uint32 cylinders_num; // number of cylinders (CHS) |
| 67 cyg_uint32 heads_num; // number of heads (CHS) | 71 cyg_uint32 heads_num; // number of heads (CHS) |
| 68 cyg_uint32 sectors_num; // number of sectors per track (CHS) | 72 cyg_uint32 sectors_num; // number of sectors per track (CHS) |
| 69 cyg_uint32 lba_sectors_num; // total number of sectors in LBA mode | 73 cyg_uint32 lba_sectors_num; // total number of sectors in LBA mode |
| 70 } cyg_disk_identify_t; | 74 cyg_uint32 phys_block_size; // physical block size in sectors |
| 75 cyg_uint32 max_transfer; // Maximum transfer size in bytes | |
| 76 }; | |
| 71 | 77 |
| 72 typedef struct { | 78 struct cyg_disk_partition_t |
| 79 { | |
| 73 cyg_uint8 type; // partition type | 80 cyg_uint8 type; // partition type |
| 74 cyg_uint8 state; // state 0x00 - inactive, 0x80 - active | 81 cyg_uint8 state; // state 0x00 - inactive, 0x80 - active |
| 75 cyg_uint32 start; // first sector number | 82 cyg_uint32 start; // first sector number |
| 76 cyg_uint32 end; // last sector number | 83 cyg_uint32 end; // last sector number |
| 77 cyg_uint32 size; // size in sectors | 84 cyg_uint32 size; // size in sectors |
| 78 } cyg_disk_partition_t; | 85 }; |
| 79 | 86 |
| 80 typedef struct { | 87 struct cyg_disk_info_t |
| 81 cyg_disk_partition_t *partitions; // partition table | 88 { |
| 82 int partitions_num;// partition table size | 89 cyg_disk_partition_t *partitions; // partition table |
| 83 cyg_disk_identify_t ident; // identify data | 90 int partitions_num;// partition table size |
| 84 cyg_uint32 block_size; // block size | 91 cyg_disk_identify_t ident; // identify data |
| 85 cyg_uint32 blocks_num; // number of blocks on disk | 92 cyg_uint32 block_size; // logical block size |
| 86 cyg_bool connected; // true if device connected | 93 cyg_uint32 blocks_num; // number of blocks on disk |
| 87 } cyg_disk_info_t; | 94 cyg_uint32 phys_block_size; // physical block size |
| 95 cyg_bool connected; // true if device connected | |
| 96 cyg_ucount16 mounts; // total number of mounts for all partitions | |
| 97 }; | |
| 88 | 98 |
| 89 #ifdef __cplusplus | 99 #ifdef __cplusplus |
| 90 } | 100 } |
| 91 #endif | 101 #endif |
| 92 | 102 |
