1 #ifndef SUNXI_HAL_SPINOR_H
2 #define SUNXI_HAL_SPINOR_H
3 
4 #include <stdint.h>
5 #include <sunxi_hal_common.h>
6 #include <sunxi_hal_spi.h>
7 #include <hal_sem.h>
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 #define SUNXI_HAL_SPINOR_API_VERSION 1
14 #define SUNXI_HAL_SPINOR_DRV_VERSION 0
15 
16 typedef enum sunxi_hal_spinor_signal_event
17 {
18     ARM_FLASH_EVENT_READY = (1UL << 0),
19     ARM_FLASH_EVENT_ERROR = (1UL << 1),
20 } sunxi_hal_spinor_signal_event_t;
21 
22 typedef struct sunxi_hal_spinor_status
23 {
24     uint32_t busy:  1;
25     uint32_t error: 1;
26     uint32_t reserved: 30;
27 } sunxi_hal_spinor_status_t;
28 
29 typedef struct _sunxi_hal_spinor_sector_info
30 {
31     uint32_t start;
32     uint32_t end;
33 } sunxi_hal_spinor_sector_info;
34 
35 typedef struct _sunxi_hal_spinor_info
36 {
37     sunxi_hal_spinor_sector_info *sector_info;
38     uint32_t sector_count;
39     uint32_t sector_size;
40     uint32_t page_size;
41     uint32_t program_unit;
42     uint8_t  erased_value;
43     uint8_t  reserved[3];
44 } sunxi_hal_spinor_info;
45 
46 typedef struct sunxi_hal_spinor_capabilities
47 {
48     uint32_t event_ready: 1;
49     uint32_t data_width: 2;
50     uint32_t erase_chip: 1;
51     uint32_t reserved: 28;
52 } sunxi_hal_spinor_capabilities_t;
53 
54 int32_t hal_spinor_init(sunxi_hal_spinor_signal_event_t cb_event);
55 int32_t hal_spinor_deinit(void);
56 sunxi_hal_version_t hal_spinor_get_version(int32_t dev);
57 sunxi_hal_spinor_capabilities_t hal_spinor_get_capabilities(void);
58 sunxi_hal_spinor_status_t hal_spinor_get_status(void);
59 int32_t hal_spinor_power_control(sunxi_hal_power_state_e state);
60 int32_t hal_spinor_read_data(uint32_t addr, void *buf, uint32_t cnt);
61 int32_t hal_spinor_program_data(uint32_t addr, const void *buf, uint32_t cnt);
62 int32_t hal_spinor_erase_sector(uint32_t addr, uint32_t size);
63 int32_t hal_spinor_erase_chip(void);
64 int32_t hal_spinor_sync(void);
65 sunxi_hal_spinor_info *hal_spinor_get_info(void);
66 void hal_spinor_signal_event(uint32_t event);
67 int32_t hal_spinor_control(int32_t dev, uint32_t command, uint32_t arg);
68 
69 #ifdef __cplusplus
70 }
71 #endif
72 
73 #endif  /*SUNXI_HAL_SPINOR_H*/
74