[276] | 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 | */ |
---|