fix reset handling
[gnuk/neug.git] / src / sys.h
1 #define BOARD_ID_CQ_STARM          0xc5480875
2 #define BOARD_ID_FST_01_00         0x613870a9
3 #define BOARD_ID_FST_01            0x696886af
4 #define BOARD_ID_MAPLE_MINI        0x7a445272
5 #define BOARD_ID_OLIMEX_STM32_H103 0xf92bb594
6 #define BOARD_ID_STBEE_MINI        0x1f341961
7 #define BOARD_ID_STBEE             0x945c37e8
8 #define BOARD_ID_STM32_PRIMER2     0x21e5798d
9 #define BOARD_ID_STM8S_DISCOVERY   0x2f0976bb
10 #define BOARD_ID_ST_DONGLE         0x2cd4e471
11 #define BOARD_ID_ST_NUCLEO_F103    0x9b87c16d
12
13 extern const uint8_t sys_version[8];
14 extern const uint32_t sys_board_id;
15 extern const uint8_t sys_board_name[];
16
17 typedef void (*handler)(void);
18 extern handler vector[16];
19
20 static inline const uint8_t *
21 unique_device_id (void)
22 {
23   /* STM32F103 has 96-bit unique device identifier */
24   const uint8_t *addr = (const uint8_t *)0x1ffff7e8;
25
26   return addr;
27 }
28
29 static inline void
30 set_led (int on)
31 {
32   void (*func) (int) = (void (*)(int))vector[2];
33
34   return (*func) (on);
35 }
36
37 static inline void
38 flash_unlock (void)
39 {
40   (*vector[3]) ();
41 }
42
43 static inline int
44 flash_program_halfword (uint32_t addr, uint16_t data)
45 {
46   int (*func) (uint32_t, uint16_t) = (int (*)(uint32_t, uint16_t))vector[4];
47
48   return (*func) (addr, data);
49 }
50
51 static inline int
52 flash_erase_page (uint32_t addr)
53 {
54   int (*func) (uint32_t) = (int (*)(uint32_t))vector[5];
55
56   return (*func) (addr);
57 }
58
59 static inline int
60 flash_check_blank (const uint8_t *p_start, size_t size)
61 {
62   int (*func) (const uint8_t *, int) = (int (*)(const uint8_t *, int))vector[6];
63
64   return (*func) (p_start, size);
65 }
66
67 static inline int
68 flash_write (uint32_t dst_addr, const uint8_t *src, size_t len)
69 {
70   int (*func) (uint32_t, const uint8_t *, size_t)
71     = (int (*)(uint32_t, const uint8_t *, size_t))vector[7];
72
73   return (*func) (dst_addr, src, len);
74 }
75
76 static inline int
77 flash_protect (void)
78 {
79   int (*func) (void) = (int (*)(void))vector[8];
80
81   return (*func) ();
82 }
83
84 static inline void __attribute__((noreturn))
85 flash_erase_all_and_exec (void (*entry)(void))
86 {
87   void (*func) (void (*)(void)) = (void (*)(void (*)(void)))vector[9];
88
89   (*func) (entry);
90   for (;;);
91 }
92
93 static inline void
94 usb_lld_sys_init (void)
95 {
96   (*vector[10]) ();
97 }
98
99 static inline void
100 usb_lld_sys_shutdown (void)
101 {
102   (*vector[11]) ();
103 }
104
105 static inline void
106 nvic_system_reset (void)
107 {
108   (*vector[12]) ();
109 }
110
111 /*
112  * Users can override INLINE by 'attribute((used))' to have an
113  * implementation defined.
114  */
115 #if !defined(INLINE)
116 #define INLINE __inline__
117 #endif
118
119 static INLINE void
120 clock_init (void)
121 {
122   (*vector[13]) ();
123 }
124
125 static INLINE void
126 gpio_init (void)
127 {
128   (*vector[14]) ();
129 }