| 1 | #ifndef IOC_H |
|---|
| 2 | #define IOC_H |
|---|
| 3 | |
|---|
| 4 | #include <io.h> |
|---|
| 5 | #include <sdcard.h> |
|---|
| 6 | #include <spi.h> |
|---|
| 7 | #include <block_device.h> |
|---|
| 8 | #include <boot_tty.h> |
|---|
| 9 | |
|---|
| 10 | ////////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 11 | // I/O BLOCK_DEVICE |
|---|
| 12 | // The three functions below use the three variables _ioc_lock _ioc_done, |
|---|
| 13 | // and _ioc_status for synchronsation. |
|---|
| 14 | // - As the IOC component can be used by several programs running in parallel, |
|---|
| 15 | // the _ioc_lock variable guaranties exclusive access to the device. |
|---|
| 16 | // The _ioc_read() and _ioc_write() functions use atomic LL/SC to get the lock. |
|---|
| 17 | // and set _ioc_lock to a non zero value. |
|---|
| 18 | // The _ioc_write() and _ioc_read() functions are blocking, polling the _ioc_lock |
|---|
| 19 | // variable until the device is available. |
|---|
| 20 | // - When the tranfer is completed, the ISR routine activated by the IOC IRQ |
|---|
| 21 | // set the _ioc_done variable to a non-zero value. Possible address errors detected |
|---|
| 22 | // by the IOC peripheral are reported by the ISR in the _ioc_status variable. |
|---|
| 23 | // The _ioc_completed() function is polling the _ioc_done variable, waiting for |
|---|
| 24 | // tranfer conpletion. When the completion is signaled, the _ioc_completed() function |
|---|
| 25 | // reset the _ioc_done variable to zero, and releases the _ioc_lock variable. |
|---|
| 26 | // |
|---|
| 27 | // In a multi-tasks environment, this polling policy must be replaced by a |
|---|
| 28 | // descheduling policy for the requesting process. |
|---|
| 29 | /////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 30 | // _ioc_get_lock() |
|---|
| 31 | // This blocking function is used by the _ioc_read() and _ioc_write() functions |
|---|
| 32 | // to get _ioc_lock using LL/SC. |
|---|
| 33 | /////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 34 | void _ioc_get_lock(); |
|---|
| 35 | |
|---|
| 36 | int _ioc_init(); |
|---|
| 37 | |
|---|
| 38 | /////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 39 | // _ioc_completed() |
|---|
| 40 | // This blocking function cheks completion of an I/O transfer and reports errors. |
|---|
| 41 | // It returns 0 if the transfer is successfully completed. |
|---|
| 42 | // It returns -1 if an error has been reported. |
|---|
| 43 | /////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 44 | int _ioc_completed(); |
|---|
| 45 | |
|---|
| 46 | ////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 47 | // _ioc_write() |
|---|
| 48 | // Transfer data from a memory buffer to a file on the block_device. |
|---|
| 49 | // - lba : first block index on the disk |
|---|
| 50 | // - buffer : base address of the memory buffer |
|---|
| 51 | // - count : number of blocks to be transfered |
|---|
| 52 | // The source buffer must be in user address space. |
|---|
| 53 | /////////////////////////////////////////////////////////////////////////////////////// |
|---|
| 54 | int _ioc_write(size_t lba, void* buffer, size_t count); |
|---|
| 55 | |
|---|
| 56 | /** |
|---|
| 57 | * _ioc_read() |
|---|
| 58 | * |
|---|
| 59 | * Transfer data from a file on the block device to a memory buffer. |
|---|
| 60 | * |
|---|
| 61 | * \param lba : first block index on the disk |
|---|
| 62 | * \param buffer : base address of the memory buffer |
|---|
| 63 | * \param count : number of blocks to be transfered |
|---|
| 64 | * |
|---|
| 65 | * \note This is a blocking function. The function returns once the transfer |
|---|
| 66 | * has finished |
|---|
| 67 | */ |
|---|
| 68 | int _ioc_read(size_t lba, void* buffer, size_t count); |
|---|
| 69 | |
|---|
| 70 | #endif |
|---|
| 71 | |
|---|
| 72 | /* |
|---|
| 73 | * vim: tabstop=4 : shiftwidth=4 : expandtab |
|---|
| 74 | */ |
|---|