1 | /////////////////////////////////////////////////////////////////////////////////// |
---|
2 | // File : boot_bdv_driver.h |
---|
3 | // Date : 01/11/2013 |
---|
4 | // Authors : Alain Greiner / Vu Son |
---|
5 | // Copyright (c) UPMC-LIP6 |
---|
6 | /////////////////////////////////////////////////////////////////////////////////// |
---|
7 | // This file defines a simplified driver for the SocLib vci_block_device, |
---|
8 | // a single channel, block-oriented, external mass storage peripheral. |
---|
9 | // The driver is used by the ALMOS-MKH boot-loader when the USE_IOC_BDV flag |
---|
10 | // is set in the hard_config.h file. |
---|
11 | // All accesses to the device registers are performed via 2 low-level |
---|
12 | // functions boot_bdv_get_register() and boot_bdv_set_register(). |
---|
13 | // Since the driver is used by the boot-loader, it implements synchronous |
---|
14 | // accesses to block device by polling the BDV_STATUS register to detect |
---|
15 | // transfer completion, as interrupts are not activated. |
---|
16 | /////////////////////////////////////////////////////////////////////////////////// |
---|
17 | |
---|
18 | #ifndef BOOT_BDV_DRIVER_H |
---|
19 | #define BOOT_BDV_DRIVER_H |
---|
20 | |
---|
21 | #include <hal_kernel_types.h> |
---|
22 | |
---|
23 | /**************************************************************************** |
---|
24 | * Driver register map. * |
---|
25 | ****************************************************************************/ |
---|
26 | |
---|
27 | enum BDV_registers |
---|
28 | { |
---|
29 | BDV_BUFFER = 0, /* 32 LSB of the source or destination buffer */ |
---|
30 | BDV_LBA = 1, /* LBA of the first block to be transfered. */ |
---|
31 | BDV_COUNT = 2, /* Number of blocks to be transfered. */ |
---|
32 | BDV_OPERATION = 3, /* Operation to perform. */ |
---|
33 | BDV_STATUS = 4, /* Transfer status. */ |
---|
34 | BDV_IRQ_ENABLE = 5, /* Boolean enabling the IRQ line. */ |
---|
35 | BDV_SIZE = 6, /* Count of addessable blocks in the device. */ |
---|
36 | BDV_BLOCK_SIZE = 7, /* Block size (in bytes). */ |
---|
37 | BDV_BUFFER_EXT = 8, /* 32 MSB of the source or destination buffer */ |
---|
38 | |
---|
39 | BDV_SPAN = 9, /* BDV segment size (32 bits words) */ |
---|
40 | }; |
---|
41 | |
---|
42 | /**************************************************************************** |
---|
43 | * Driver operations. * |
---|
44 | ****************************************************************************/ |
---|
45 | |
---|
46 | enum BDV_operations |
---|
47 | { |
---|
48 | BDV_NOOP = 0, |
---|
49 | BDV_READ = 1, |
---|
50 | BDV_WRITE = 2, |
---|
51 | }; |
---|
52 | |
---|
53 | /**************************************************************************** |
---|
54 | * Driver status values. * |
---|
55 | ****************************************************************************/ |
---|
56 | |
---|
57 | enum BDV_status |
---|
58 | { |
---|
59 | BDV_IDLE = 0, |
---|
60 | BDV_BUSY = 1, |
---|
61 | BDV_READ_SUCC = 2, |
---|
62 | BDV_WRITE_SUCC = 3, |
---|
63 | BDV_READ_ERR = 4, |
---|
64 | BDV_WRITE_ERR = 5, |
---|
65 | }; |
---|
66 | |
---|
67 | /**************************************************************************** |
---|
68 | * Driver API functions. * |
---|
69 | ****************************************************************************/ |
---|
70 | |
---|
71 | /**************************************************************************** |
---|
72 | * This function checks if a block size is indeed 512 bytes, and * |
---|
73 | * desactivates the interrupts. * |
---|
74 | * @ returns 0 on success, -1 on error. * |
---|
75 | ****************************************************************************/ |
---|
76 | int boot_bdv_init(); |
---|
77 | |
---|
78 | /**************************************************************************** |
---|
79 | * This function transfers 'count' blocks from the block device to memory. |
---|
80 | * @ lba : LBA of the first block on the block device. * |
---|
81 | * @ buf_paddr : memory buffer physical address. * |
---|
82 | * @ count : number of blocks to be transfered. * |
---|
83 | * @ returns 0 on success, -1 on error. * |
---|
84 | ****************************************************************************/ |
---|
85 | int boot_bdv_access( uint32_t lba, |
---|
86 | xptr_t buf_paddr, |
---|
87 | uint32_t count ); |
---|
88 | |
---|
89 | #endif // BOOT_BDV_DRIVER_H |
---|