pika_hal.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. #ifndef _PIKA_DEV_HAL_H
  2. #define _PIKA_DEV_HAL_H
  3. #include <stddef.h>
  4. #include <stdint.h>
  5. #include "PikaObj.h"
  6. /*
  7. * pika_hal is a C Device HAL lib for PikaScript modules.
  8. * the API of pika_hal is similar to the posix file API.
  9. */
  10. #define PIKA_HAL
  11. #ifndef PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  12. #define PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE 0
  13. #endif
  14. #define PIKA_HAL_OBJ2DEV(_self) obj_getPtr((_self), "pika_dev")
  15. typedef enum {
  16. #define PIKA_HAL_TABLE_DEV_TYPE
  17. #include "pika_hal_table.h"
  18. } PIKA_HAL_DEV_TYPE;
  19. typedef struct {
  20. PIKA_HAL_DEV_TYPE type;
  21. PIKA_BOOL is_enabled;
  22. void* ioctl_config;
  23. void* platform_data;
  24. } pika_dev;
  25. typedef enum {
  26. PIKA_HAL_IOCTL_CONFIG,
  27. PIKA_HAL_IOCTL_ENABLE,
  28. PIKA_HAL_IOCTL_DISABLE,
  29. PIKA_HAL_IOCTL_NET_GET_ACTIVE,
  30. PIKA_HAL_IOCTL_NET_GET_STATUS,
  31. PIKA_HAL_IOCTL_WIFI_SCAN,
  32. PIKA_HAL_IOCTL_WIFI_CONNECT,
  33. PIKA_HAL_IOCTL_WIFI_DISCONNECT,
  34. PIKA_HAL_IOCTL_NET_SET_IFCONFIG,
  35. PIKA_HAL_IOCTL_NET_GET_IFCONFIG,
  36. PIKA_HAL_IOCTL_CAM_CAPTURE,
  37. _ = 0xFFFFFFFF, // make sure it is 4 byte width
  38. } PIKA_HAL_IOCTL_CMD;
  39. #define PIKA_HAL_IOCTL_WIFI_GET_ACTIVE PIKA_HAL_IOCTL_NET_GET_ACTIVE
  40. #define PIKA_HAL_IOCTL_WIFI_GET_STATUS PIKA_HAL_IOCTL_NET_GET_STATUS
  41. #define PIKA_HAL_IOCTL_WIFI_SET_IFCONFIG PIKA_HAL_IOCTL_NET_SET_IFCONFIG
  42. #define PIKA_HAL_IOCTL_WIFI_GET_IFCONFIG PIKA_HAL_IOCTL_NET_GET_IFCONFIG
  43. #define PIKA_HAL_IOCTL_LAN_GET_ACTIVE PIKA_HAL_IOCTL_NET_GET_ACTIVE
  44. #define PIKA_HAL_IOCTL_LAN_GET_STATUS PIKA_HAL_IOCTL_NET_GET_STATUS
  45. #define PIKA_HAL_IOCTL_LAN_SET_IFCONFIG PIKA_HAL_IOCTL_NET_SET_IFCONFIG
  46. #define PIKA_HAL_IOCTL_LAN_GET_IFCONFIG PIKA_HAL_IOCTL_NET_GET_IFCONFIG
  47. /* posix file like API */
  48. pika_dev* pika_hal_open(PIKA_HAL_DEV_TYPE dev_type, char* name);
  49. int pika_hal_close(pika_dev* dev);
  50. int pika_hal_read(pika_dev* dev, void* buf, size_t len);
  51. int pika_hal_write(pika_dev* dev, void* buf, size_t len);
  52. int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...);
  53. typedef enum {
  54. _PIKA_HAL_GPIO_DIR_UNUSED = 0,
  55. PIKA_HAL_GPIO_DIR_IN,
  56. PIKA_HAL_GPIO_DIR_OUT,
  57. } PIKA_HAL_GPIO_DIR;
  58. typedef enum {
  59. _PIKA_HAL_GPIO_PULL_UNUSED = 0,
  60. PIKA_HAL_GPIO_PULL_NONE,
  61. PIKA_HAL_GPIO_PULL_UP,
  62. PIKA_HAL_GPIO_PULL_DOWN,
  63. } PIKA_HAL_GPIO_PULL;
  64. typedef enum {
  65. _PIKA_HAL_GPIO_SPEED_UNUSED = 0,
  66. PIKA_HAL_GPIO_SPEED_1M = 1000000,
  67. PIKA_HAL_GPIO_SPEED_2M = 2000000,
  68. PIKA_HAL_GPIO_SPEED_5M = 5000000,
  69. PIKA_HAL_GPIO_SPEED_10M = 10000000,
  70. PIKA_HAL_GPIO_SPEED_20M = 20000000,
  71. PIKA_HAL_GPIO_SPEED_50M = 50000000,
  72. PIKA_HAL_GPIO_SPEED_100M = 100000000,
  73. } PIKA_HAL_GPIO_SPEED;
  74. typedef enum {
  75. _PIKA_HAL_EVENT_CALLBACK_ENA_UNUSED = 0,
  76. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE,
  77. PIKA_HAL_EVENT_CALLBACK_ENA_DISABLE,
  78. } PIKA_HAL_EVENT_CALLBACK_ENA;
  79. typedef enum {
  80. _PIKA_HAL_GPIO_EVENT_SIGNAL_UNUSED = 0,
  81. PIKA_HAL_GPIO_EVENT_SIGNAL_RISING,
  82. PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING,
  83. PIKA_HAL_GPIO_EVENT_SIGNAL_ANY,
  84. } PIKA_HAL_GPIO_EVENT_SIGNAL;
  85. typedef struct {
  86. PIKA_HAL_GPIO_DIR dir;
  87. PIKA_HAL_GPIO_PULL pull;
  88. PIKA_HAL_GPIO_SPEED speed;
  89. void (*event_callback)(pika_dev* dev, PIKA_HAL_GPIO_EVENT_SIGNAL signal);
  90. PIKA_HAL_GPIO_EVENT_SIGNAL event_callback_filter;
  91. PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
  92. void* user_data;
  93. } pika_hal_GPIO_config;
  94. typedef enum {
  95. _PIKA_HAL_UART_BAUDRATE_UNUSED = 0,
  96. PIKA_HAL_UART_BAUDRATE_9600 = 9600,
  97. PIKA_HAL_UART_BAUDRATE_19200 = 19200,
  98. PIKA_HAL_UART_BAUDRATE_38400 = 38400,
  99. PIKA_HAL_UART_BAUDRATE_57600 = 57600,
  100. PIKA_HAL_UART_BAUDRATE_115200 = 115200,
  101. PIKA_HAL_UART_BAUDRATE_2000000 = 2000000,
  102. PIKA_HAL_UART_BAUDRATE_10000000 = 10000000,
  103. } PIKA_HAL_UART_BAUDRATE;
  104. typedef enum {
  105. _PIKA_HAL_UART_DATA_BITS_UNUSED = 0,
  106. PIKA_HAL_UART_DATA_BITS_5 = 5,
  107. PIKA_HAL_UART_DATA_BITS_6 = 6,
  108. PIKA_HAL_UART_DATA_BITS_7 = 7,
  109. PIKA_HAL_UART_DATA_BITS_8 = 8,
  110. } PIKA_HAL_UART_DATA_BITS;
  111. typedef enum {
  112. _PIKA_HAL_UART_STOP_BITS_UNUSED = 0,
  113. PIKA_HAL_UART_STOP_BITS_1 = 1,
  114. PIKA_HAL_UART_STOP_BITS_2 = 2,
  115. PIKA_HAL_UART_STOP_BITS_1_5 = 3,
  116. } PIKA_HAL_UART_STOP_BITS;
  117. typedef enum {
  118. _PIKA_HAL_UART_PARITY_UNUSED = 0,
  119. PIKA_HAL_UART_PARITY_NONE,
  120. PIKA_HAL_UART_PARITY_ODD,
  121. PIKA_HAL_UART_PARITY_EVEN,
  122. } PIKA_HAL_UART_PARITY;
  123. typedef enum {
  124. _PIKA_HAL_UART_EVENT_SIGNAL_UNUSED = 0,
  125. PIKA_HAL_UART_EVENT_SIGNAL_RX,
  126. PIKA_HAL_UART_EVENT_SIGNAL_TX,
  127. PIKA_HAL_UART_EVENT_SIGNAL_ANY,
  128. } PIKA_HAL_UART_EVENT_SIGNAL;
  129. typedef enum {
  130. _PIKA_HAL_UART_FLOW_CONTROL_UNUSED = 0,
  131. PIKA_HAL_UART_FLOW_CONTROL_NONE,
  132. PIKA_HAL_UART_FLOW_CONTROL_RTS,
  133. PIKA_HAL_UART_FLOW_CONTROL_CTS,
  134. PIKA_HAL_UART_FLOW_CONTROL_RTS_CTS,
  135. } PIKA_HAL_UART_FLOW_CONTROL;
  136. typedef struct {
  137. PIKA_HAL_UART_BAUDRATE baudrate;
  138. PIKA_HAL_UART_DATA_BITS data_bits;
  139. PIKA_HAL_UART_STOP_BITS stop_bits;
  140. PIKA_HAL_UART_PARITY parity;
  141. PIKA_HAL_UART_FLOW_CONTROL flow_control;
  142. void (*event_callback)(pika_dev* dev, PIKA_HAL_UART_EVENT_SIGNAL signal);
  143. PIKA_HAL_UART_EVENT_SIGNAL event_callback_filter;
  144. PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
  145. pika_dev* TX;
  146. pika_dev* RX;
  147. pika_dev* RTS;
  148. pika_dev* CTS;
  149. void* user_data;
  150. } pika_hal_UART_config;
  151. typedef uint32_t PIKA_HAL_IIC_SLAVE_ADDR;
  152. typedef uint32_t PIKA_HAL_IIC_MEM_ADDR;
  153. typedef enum PIKA_HAL_IIC_MEM_ADDR_SIZE {
  154. _PIKA_HAL_IIC_MEM_ADDR_SIZE_UNUSED = 0,
  155. PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT = 1,
  156. PIKA_HAL_IIC_MEM_ADDR_SIZE_16BIT = 2,
  157. PIKA_HAL_IIC_MEM_ADDR_SIZE_24BIT = 3,
  158. PIKA_HAL_IIC_MEM_ADDR_SIZE_32BIT = 4,
  159. } PIKA_HAL_IIC_MEM_ADDR_SIZE;
  160. typedef enum PIKA_HAL_IIC_MEM_ADDR_ENA {
  161. _PIKA_HAL_IIC_MEM_ADDR_ENA_UNUSED = 0,
  162. PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE,
  163. PIKA_HAL_IIC_MEM_ADDR_ENA_ENABLE,
  164. } PIKA_HAL_IIC_MEM_ADDR_ENA;
  165. typedef enum {
  166. _PIKA_HAL_IIC_SPEED_UNUSED = 0,
  167. PIKA_HAL_IIC_SPEED_100K = 100000,
  168. PIKA_HAL_IIC_SPEED_400K = 400000,
  169. PIKA_HAL_IIC_SPEED_1M = 1000000,
  170. } PIKA_HAL_IIC_SPEED;
  171. typedef enum PIKA_HAL_IIC_MASTER_OR_SLAVE {
  172. _PIKA_HAL_IIC_MASTER_OR_SLAVE_UNUSED = 0,
  173. PIKA_HAL_IIC_MASTER,
  174. PIKA_HAL_IIC_SLAVE,
  175. } PIKA_HAL_IIC_MASTER_OR_SLAVE;
  176. typedef enum PIKA_HAL_IIC_ADDRESS_WIDTH {
  177. _PIKA_HAL_IIC_ADDRESS_WIDTH_UNUSED = 0,
  178. PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT = 7,
  179. PIKA_HAL_IIC_ADDRESS_WIDTH_10BIT = 10,
  180. } PIKA_HAL_IIC_ADDRESS_WIDTH;
  181. typedef enum PIKA_HAL_IIC_TIMEOUT {
  182. _PIKA_HAL_IIC_TIMEOUT_UNUSED = 0,
  183. PIKA_HAL_IIC_TIMEOUT_1MS = 1,
  184. PIKA_HAL_IIC_TIMEOUT_2MS = 2,
  185. PIKA_HAL_IIC_TIMEOUT_5MS = 5,
  186. PIKA_HAL_IIC_TIMEOUT_10MS = 10,
  187. PIKA_HAL_IIC_TIMEOUT_20MS = 20,
  188. PIKA_HAL_IIC_TIMEOUT_50MS = 50,
  189. PIKA_HAL_IIC_TIMEOUT_100MS = 100,
  190. PIKA_HAL_IIC_TIMEOUT_200MS = 200,
  191. PIKA_HAL_IIC_TIMEOUT_500MS = 500,
  192. PIKA_HAL_IIC_TIMEOUT_1000MS = 1000,
  193. } PIKA_HAL_IIC_TIMEOUT;
  194. typedef struct {
  195. PIKA_HAL_IIC_ADDRESS_WIDTH address_width;
  196. PIKA_HAL_IIC_MASTER_OR_SLAVE master_or_slave;
  197. PIKA_HAL_IIC_SLAVE_ADDR slave_addr;
  198. PIKA_HAL_IIC_MEM_ADDR_ENA mem_addr_ena;
  199. PIKA_HAL_IIC_MEM_ADDR mem_addr;
  200. PIKA_HAL_IIC_MEM_ADDR_SIZE mem_addr_size;
  201. PIKA_HAL_IIC_SPEED speed;
  202. PIKA_HAL_IIC_TIMEOUT timeout;
  203. void* user_data;
  204. } pika_hal_IIC_config;
  205. typedef struct {
  206. PIKA_HAL_IIC_ADDRESS_WIDTH address_width;
  207. PIKA_HAL_IIC_MASTER_OR_SLAVE master_or_slave;
  208. PIKA_HAL_IIC_SLAVE_ADDR slave_addr;
  209. PIKA_HAL_IIC_MEM_ADDR_ENA mem_addr_ena;
  210. PIKA_HAL_IIC_MEM_ADDR mem_addr;
  211. PIKA_HAL_IIC_MEM_ADDR_SIZE mem_addr_size;
  212. PIKA_HAL_IIC_SPEED speed;
  213. PIKA_HAL_IIC_TIMEOUT timeout;
  214. void* user_data;
  215. // Uper must be the same with IIC_config;
  216. pika_dev* SDA;
  217. pika_dev* SCL;
  218. } pika_hal_SOFT_IIC_config;
  219. typedef enum PIKA_HAL_SPI_TIMEOUT {
  220. _PIKA_HAL_SPI_TIMEOUT_UNUSED = 0,
  221. PIKA_HAL_SPI_TIMEOUT_1MS = 1,
  222. PIKA_HAL_SPI_TIMEOUT_2MS = 2,
  223. PIKA_HAL_SPI_TIMEOUT_5MS = 5,
  224. PIKA_HAL_SPI_TIMEOUT_10MS = 10,
  225. PIKA_HAL_SPI_TIMEOUT_20MS = 20,
  226. PIKA_HAL_SPI_TIMEOUT_50MS = 50,
  227. PIKA_HAL_SPI_TIMEOUT_100MS = 100,
  228. PIKA_HAL_SPI_TIMEOUT_200MS = 200,
  229. PIKA_HAL_SPI_TIMEOUT_500MS = 500,
  230. PIKA_HAL_SPI_TIMEOUT_1000MS = 1000,
  231. } PIKA_HAL_SPI_TIMEOUT;
  232. typedef enum {
  233. _PIKA_HAL_SPI_LSB_OR_MSB_UNUSED = 0,
  234. PIKA_HAL_SPI_LSB,
  235. PIKA_HAL_SPI_MSB,
  236. } PIKA_HAL_SPI_LSB_OR_MSB;
  237. typedef enum {
  238. _PIKA_HAL_SPI_MASTER_OR_SLAVE_UNUSED = 0,
  239. PIKA_HAL_SPI_MASTER,
  240. PIKA_HAL_SPI_SLAVE,
  241. } PIKA_HAL_SPI_MASTER_OR_SLAVE;
  242. typedef enum {
  243. _PIKA_HAL_SPI_MODE_UNUSED = 0,
  244. PIKA_HAL_SPI_MODE_0,
  245. PIKA_HAL_SPI_MODE_1,
  246. PIKA_HAL_SPI_MODE_2,
  247. PIKA_HAL_SPI_MODE_3,
  248. } PIKA_HAL_SPI_MODE;
  249. typedef enum {
  250. _PIKA_HAL_SPI_DATA_UNUSED = 0,
  251. PIKA_HAL_SPI_DATA_WIDTH_8 = 8,
  252. PIKA_HAL_SPI_DATA_WIDTH_16 = 16,
  253. } PIKA_HAL_SPI_DATA_WIDTH;
  254. typedef enum {
  255. _PIKA_HAL_SPI_SPEED_UNUSED = 0,
  256. PIKA_HAL_SPI_SPEED_1M = 1000000,
  257. PIKA_HAL_SPI_SPEED_2M = 2000000,
  258. PIKA_HAL_SPI_SPEED_5M = 5000000,
  259. PIKA_HAL_SPI_SPEED_10M = 10000000,
  260. PIKA_HAL_SPI_SPEED_20M = 20000000,
  261. PIKA_HAL_SPI_SPEED_40M = 40000000,
  262. PIKA_HAL_SPI_SPEED_50M = 50000000,
  263. PIKA_HAL_SPI_SPEED_80M = 80000000,
  264. PIKA_HAL_SPI_SPEED_100M = 100000000,
  265. } PIKA_HAL_SPI_SPEED;
  266. #define PIKA_HAL_SPI_RX_BUFFER_SIZE 32
  267. typedef struct {
  268. PIKA_HAL_SPI_LSB_OR_MSB lsb_or_msb;
  269. PIKA_HAL_SPI_MASTER_OR_SLAVE master_or_slave;
  270. PIKA_HAL_SPI_MODE mode;
  271. PIKA_HAL_SPI_DATA_WIDTH data_width;
  272. PIKA_HAL_SPI_SPEED speed;
  273. PIKA_HAL_SPI_TIMEOUT timeout;
  274. pika_dev* CS; // Just for MCU with pin mux like ESP32
  275. pika_dev* SCK; // Just for MCU with pin mux like ESP32
  276. pika_dev* MOSI; // Just for MCU with pin mux like ESP32
  277. pika_dev* MISO; // Just for MCU with pin mux like ESP32
  278. uint8_t tranfer_rx_buffer[PIKA_HAL_SPI_RX_BUFFER_SIZE];
  279. void* user_data;
  280. } pika_hal_SPI_config;
  281. typedef struct {
  282. PIKA_HAL_SPI_LSB_OR_MSB lsb_or_msb;
  283. PIKA_HAL_SPI_MASTER_OR_SLAVE master_or_slave;
  284. PIKA_HAL_SPI_MODE mode;
  285. PIKA_HAL_SPI_DATA_WIDTH data_width;
  286. PIKA_HAL_SPI_SPEED speed;
  287. PIKA_HAL_SPI_TIMEOUT timeout;
  288. pika_dev* CS;
  289. pika_dev* SCK;
  290. pika_dev* MOSI;
  291. pika_dev* MISO;
  292. uint8_t tranfer_rx_buffer[PIKA_HAL_SPI_RX_BUFFER_SIZE];
  293. void* user_data;
  294. // Uper must be the same with SPI_config
  295. } pika_hal_SOFT_SPI_config;
  296. typedef enum {
  297. _PIKA_HAL_ADC_RESOLUTION_UNUSED = 0,
  298. PIKA_HAL_ADC_RESOLUTION_8 = 8,
  299. PIKA_HAL_ADC_RESOLUTION_10 = 10,
  300. PIKA_HAL_ADC_RESOLUTION_12 = 12,
  301. PIKA_HAL_ADC_RESOLUTION_14 = 14,
  302. PIKA_HAL_ADC_RESOLUTION_16 = 16,
  303. } PIKA_HAL_ADC_RESOLUTION;
  304. typedef enum PIKA_HAL_ADC_SAMPLING_FREQ {
  305. _PIKA_HAL_ADC_SAMPLING_FREQ_UNUSED = 0,
  306. PIKA_HAL_ADC_SAMPLING_FREQ_100 = 100,
  307. PIKA_HAL_ADC_SAMPLING_FREQ_1K = 1000,
  308. PIKA_HAL_ADC_SAMPLING_FREQ_10K = 10000,
  309. PIKA_HAL_ADC_SAMPLING_FREQ_100K = 100000,
  310. PIKA_HAL_ADC_SAMPLING_FREQ_1M = 1000000,
  311. PIKA_HAL_ADC_SAMPLING_FREQ_10M = 10000000,
  312. } PIKA_HAL_ADC_SAMPLING_FREQ;
  313. typedef enum PIKA_HAL_ADC_CONTINUOU_OR_SINGLE {
  314. _PIKA_HAL_ADC_CONTINUOU_OR_SINGLE_UNUSED = 0,
  315. PIKA_HAL_ADC_SINGLE,
  316. PIKA_HAL_ADC_CONTINUOU,
  317. } PIKA_HAL_ADC_CONTINUOU_OR_SINGLE;
  318. typedef pika_float PIKA_HAL_ADC_VREF;
  319. typedef uint32_t PIKA_HAL_ADC_MAX;
  320. typedef struct {
  321. PIKA_HAL_ADC_RESOLUTION sampling_resolution;
  322. PIKA_HAL_ADC_SAMPLING_FREQ sampling_freq;
  323. PIKA_HAL_ADC_CONTINUOU_OR_SINGLE continue_or_single;
  324. PIKA_HAL_ADC_MAX max;
  325. PIKA_HAL_ADC_VREF vref;
  326. void* user_data;
  327. } pika_hal_ADC_config;
  328. typedef enum {
  329. _PIKA_HAL_DAC_RESOLUTION_UNUSED = 0,
  330. PIKA_HAL_DAC_RESOLUTION_8 = 8,
  331. PIKA_HAL_DAC_RESOLUTION_10 = 10,
  332. PIKA_HAL_DAC_RESOLUTION_12 = 12,
  333. PIKA_HAL_DAC_RESOLUTION_14 = 14,
  334. PIKA_HAL_DAC_RESOLUTION_16 = 16,
  335. } PIKA_HAL_DAC_RESOLUTION;
  336. typedef enum PIKA_HAL_DAC_SPEED {
  337. _PIKA_HAL_DAC_SPEED_UNUSED = 0,
  338. PIKA_HAL_DAC_SPEED_100 = 100,
  339. PIKA_HAL_DAC_SPEED_1K = 1000,
  340. PIKA_HAL_DAC_SPEED_10K = 10000,
  341. PIKA_HAL_DAC_SPEED_100K = 100000,
  342. PIKA_HAL_DAC_SPEED_1M = 1000000,
  343. PIKA_HAL_DAC_SPEED_10M = 10000000,
  344. PIKA_HAL_DAC_SPEED_20M = 20000000,
  345. PIKA_HAL_DAC_SPEED_50M = 50000000,
  346. PIKA_HAL_DAC_SPEED_100M = 100000000,
  347. } PIKA_HAL_DAC_SPEED;
  348. typedef pika_float PIKA_HAL_DAC_VREF;
  349. typedef uint32_t PIKA_HAL_DAC_MAX;
  350. typedef struct pika_hal_DAC_config {
  351. PIKA_HAL_DAC_RESOLUTION sampling_resolution;
  352. PIKA_HAL_DAC_SPEED speed;
  353. PIKA_HAL_DAC_MAX max;
  354. PIKA_HAL_DAC_VREF vref;
  355. void* user_data;
  356. } pika_hal_DAC_config;
  357. typedef enum {
  358. _PIKA_HAL_DAC_UNUSED = 0,
  359. PIKA_HAL_PWM_CHANNEL_0,
  360. PIKA_HAL_PWM_CHANNEL_1,
  361. PIKA_HAL_PWM_CHANNEL_2,
  362. PIKA_HAL_PWM_CHANNEL_3,
  363. PIKA_HAL_PWM_CHANNEL_4,
  364. PIKA_HAL_PWM_CHANNEL_5,
  365. PIKA_HAL_PWM_CHANNEL_6,
  366. PIKA_HAL_PWM_CHANNEL_7,
  367. } PIKA_HAL_PWM_CHANNEL;
  368. typedef enum {
  369. PIKA_HAL_PWM_PERIOD_1NS = 1,
  370. PIKA_HAL_PWM_PERIOD_1US = 1000,
  371. PIKA_HAL_PWM_PERIOD_1MS = 1000000,
  372. PIKA_HAL_PWM_PERIOD_1S = 1000000000,
  373. } PIKA_HAL_PWM_PERIOD;
  374. typedef enum {
  375. PIKA_HAL_PWM_DUTY_1NS = 1,
  376. PIKA_HAL_PWM_DUTY_1US = 1000,
  377. PIKA_HAL_PWM_DUTY_1MS = 1000000,
  378. PIKA_HAL_PWM_DUTY_1S = 1000000000,
  379. } PIKA_HAL_PWM_DUTY;
  380. typedef struct {
  381. PIKA_HAL_PWM_PERIOD period;
  382. PIKA_HAL_PWM_DUTY duty;
  383. void* user_data;
  384. } pika_hal_PWM_config;
  385. typedef enum {
  386. _PIKA_HAL_WIFI_MODE_UNUSED = 0,
  387. PIKA_HAL_WIFI_MODE_STA,
  388. PIKA_HAL_WIFI_MODE_AP,
  389. } PIKA_HAL_WIFI_MODE;
  390. typedef enum {
  391. _PIKA_HAL_WIFI_STATUS_UNUSED = 0,
  392. PIKA_HAL_WIFI_STATUS_IDLE,
  393. PIKA_HAL_WIFI_STATUS_CONNECTING,
  394. PIKA_HAL_WIFI_STATUS_WRONG_PASSWORD,
  395. PIKA_HAL_WIFI_STATUS_NO_AP_FOUND,
  396. PIKA_HAL_WIFI_STATUS_CONNECT_FAIL,
  397. PIKA_HAL_WIFI_STATUS_GOT_IP,
  398. } PIKA_HAL_WIFI_STATUS;
  399. typedef enum {
  400. _PIKA_HAL_LAN_STATUS_UNUSED = 0,
  401. PIKA_HAL_LAN_STATUS_IDLE,
  402. PIKA_HAL_LAN_STATUS_CONNECTING,
  403. PIKA_HAL_LAN_STATUS_GOT_IP,
  404. } PIKA_HAL_LAN_STATUS;
  405. typedef enum {
  406. _PIKA_HAL_WIFI_CHANNEL_UNUSED = 0,
  407. PIKA_HAL_WIFI_CHANNEL_0,
  408. PIKA_HAL_WIFI_CHANNEL_1,
  409. PIKA_HAL_WIFI_CHANNEL_2,
  410. PIKA_HAL_WIFI_CHANNEL_3,
  411. PIKA_HAL_WIFI_CHANNEL_4,
  412. PIKA_HAL_WIFI_CHANNEL_5,
  413. PIKA_HAL_WIFI_CHANNEL_6,
  414. PIKA_HAL_WIFI_CHANNEL_7,
  415. PIKA_HAL_WIFI_CHANNEL_8,
  416. PIKA_HAL_WIFI_CHANNEL_9,
  417. PIKA_HAL_WIFI_CHANNEL_10,
  418. PIKA_HAL_WIFI_CHANNEL_11,
  419. } PIKA_HAL_WIFI_CHANNEL;
  420. typedef enum {
  421. _PIKA_HAL_WIFI_MAX_CONNECTION = 0,
  422. PIKA_HAL_WIFI_MAX_CONNECTION_1,
  423. PIKA_HAL_WIFI_MAX_CONNECTION_2,
  424. PIKA_HAL_WIFI_MAX_CONNECTION_3,
  425. PIKA_HAL_WIFI_MAX_CONNECTION_4,
  426. PIKA_HAL_WIFI_MAX_CONNECTION_5,
  427. PIKA_HAL_WIFI_MAX_CONNECTION_6,
  428. PIKA_HAL_WIFI_MAX_CONNECTION_7,
  429. PIKA_HAL_WIFI_MAX_CONNECTION_8,
  430. PIKA_HAL_WIFI_MAX_CONNECTION_9,
  431. PIKA_HAL_WIFI_MAX_CONNECTION_10
  432. } PIKA_HAL_WIFI_MAX_CONNECTION;
  433. #define PIKA_HAL_WIFI_PARAM_MAX_LEN 32
  434. typedef struct pika_hal_WIFI_config {
  435. PIKA_HAL_WIFI_MODE mode;
  436. PIKA_HAL_WIFI_CHANNEL channel;
  437. PIKA_HAL_WIFI_MAX_CONNECTION max_connection;
  438. char ap_ssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  439. char ap_bssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  440. char ap_password[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  441. void* user_data;
  442. } pika_hal_WIFI_config;
  443. typedef struct pika_hal_WIFI_connect_config {
  444. char ssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  445. char bssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  446. char password[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  447. } pika_hal_WIFI_connect_config;
  448. typedef struct pika_hal_NET_ifconfig {
  449. char ip[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  450. char netmask[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  451. char gateway[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  452. char dns[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  453. } pika_hal_NET_ifconfig;
  454. #define pika_hal_WIFI_ifconfig pika_hal_NET_ifconfig
  455. #define pika_hal_LAN_ifconfig pika_hal_NET_ifconfig
  456. typedef struct pika_hal_WIFI_record {
  457. char ssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  458. uint8_t bssid[PIKA_HAL_WIFI_PARAM_MAX_LEN];
  459. size_t bssid_len;
  460. int channel;
  461. int rssi;
  462. int authmode;
  463. } pika_hal_WIFI_record;
  464. typedef struct pika_hal_WIFI_scan_result {
  465. int count;
  466. pika_hal_WIFI_record records[];
  467. } pika_hal_WIFI_scan_result;
  468. typedef struct pika_hal_LAN_config {
  469. void* user_data;
  470. } pika_hal_LAN_config;
  471. typedef enum {
  472. _PIKA_HAL_PWM_PERIOD_UNUSED = 0,
  473. PIKA_HAL_TIM_PERIOD_1NS = 1,
  474. PIKA_HAL_TIM_PERIOD_1US = 1000,
  475. PIKA_HAL_TIM_PERIOD_1MS = 1000000,
  476. PIKA_HAL_TIM_PERIOD_1S = 1000000000,
  477. } PIKA_HAL_TIM_PERIOD;
  478. typedef enum {
  479. _PIKA_HAL_TIM_MODE_UNUSED = 0,
  480. PIKA_HAL_TIM_MODE_ONESHOT,
  481. PIKA_HAL_TIM_MODE_CONTINUOUS,
  482. } PIKA_HAL_TIM_MODE;
  483. typedef enum {
  484. _PIKA_HAL_TIM_EVENT_SIGNAL_UNUSED = 0,
  485. PIKA_HAL_TIM_EVENT_SIGNAL_TIMEOUT,
  486. PIKA_HAL_TIM_EVENT_SIGNAL_ANY,
  487. } PIKA_HAL_TIM_EVENT_SIGNAL;
  488. typedef struct pika_hal_TIM_config {
  489. PIKA_HAL_TIM_PERIOD period;
  490. PIKA_HAL_TIM_MODE mode;
  491. PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
  492. PIKA_HAL_TIM_EVENT_SIGNAL event_callback_filter;
  493. void (*event_callback)(pika_dev* dev, PIKA_HAL_TIM_EVENT_SIGNAL signal);
  494. } pika_hal_TIM_config;
  495. typedef struct pika_hal_SOFT_TIM_config {
  496. PIKA_HAL_TIM_PERIOD period;
  497. PIKA_HAL_TIM_MODE mode;
  498. PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
  499. PIKA_HAL_TIM_EVENT_SIGNAL event_callback_filter;
  500. void (*event_callback)(pika_dev* dev, PIKA_HAL_TIM_EVENT_SIGNAL signal);
  501. // Uper must be the same with TIM_config
  502. } pika_hal_SOFT_TIM_config;
  503. typedef enum {
  504. _PIKA_HAL_CAM_PIXFORMAT_UNUSED = 0,
  505. PIKA_HAL_CAM_PIXFORMAT_RGB565,
  506. PIKA_HAL_CAM_PIXFORMAT_YUV422,
  507. PIKA_HAL_CAM_PIXFORMAT_YUV420,
  508. PIKA_HAL_CAM_PIXFORMAT_GRAYSCALE,
  509. PIKA_HAL_CAM_PIXFORMAT_JPEG,
  510. PIKA_HAL_CAM_PIXFORMAT_RGB888,
  511. PIKA_HAL_CAM_PIXFORMAT_RAW,
  512. PIKA_HAL_CAM_PIXFORMAT_RGB444,
  513. PIKA_HAL_CAM_PIXFORMAT_RGB555,
  514. } PIKA_HAL_CAM_PIXFORMAT;
  515. typedef enum {
  516. _PIKA_HAL_CAM_FRAMESIZE_UNUSED = 0,
  517. PIKA_HAL_CAM_FRAMESIZE_96X96, // 96x96
  518. PIKA_HAL_CAM_FRAMESIZE_QQVGA, // 160x120
  519. PIKA_HAL_CAM_FRAMESIZE_QCIF, // 176x144
  520. PIKA_HAL_CAM_FRAMESIZE_HQVGA, // 240x176
  521. PIKA_HAL_CAM_FRAMESIZE_240X240, // 240x240
  522. PIKA_HAL_CAM_FRAMESIZE_QVGA, // 320x240
  523. PIKA_HAL_CAM_FRAMESIZE_CIF, // 400x296
  524. PIKA_HAL_CAM_FRAMESIZE_HVGA, // 480x320
  525. PIKA_HAL_CAM_FRAMESIZE_VGA, // 640x480
  526. PIKA_HAL_CAM_FRAMESIZE_SVGA, // 800x600
  527. PIKA_HAL_CAM_FRAMESIZE_XGA, // 1024x768
  528. PIKA_HAL_CAM_FRAMESIZE_HD, // 1280x720
  529. PIKA_HAL_CAM_FRAMESIZE_SXGA, // 1280x1024
  530. PIKA_HAL_CAM_FRAMESIZE_UXGA, // 1600x1200
  531. PIKA_HAL_CAM_FRAMESIZE_FHD, // 1920x1080
  532. PIKA_HAL_CAM_FRAMESIZE_P_HD, // 720x1280
  533. PIKA_HAL_CAM_FRAMESIZE_P_3MP, // 864x1536
  534. PIKA_HAL_CAM_FRAMESIZE_QXGA, // 2048x1536
  535. PIKA_HAL_CAM_FRAMESIZE_QHD, // 2560x1440
  536. PIKA_HAL_CAM_FRAMESIZE_WQXGA, // 2560x1600
  537. PIKA_HAL_CAM_FRAMESIZE_P_FHD, // 1080x1920
  538. PIKA_HAL_CAM_FRAMESIZE_QSXGA, // 2560x1920
  539. } PIKA_HAL_CAM_FRAMESIZE;
  540. typedef struct pika_hal_CAM_config {
  541. PIKA_HAL_CAM_PIXFORMAT format;
  542. PIKA_HAL_CAM_FRAMESIZE framesize;
  543. int buff_len;
  544. } pika_hal_CAM_config;
  545. /* Signal Generator */
  546. typedef enum {
  547. _PIKA_HAL_SG_WAVEFORM_UNUSED = 0,
  548. PIKA_HAL_SG_WAVEFORM_SINE,
  549. PIKA_HAL_SG_WAVEFORM_SQUARE,
  550. PIKA_HAL_SG_WAVEFORM_TRIANGLE,
  551. } PIKA_HAL_SG_WAVEFORM;
  552. typedef enum {
  553. _PIKA_HAL_SG_EVENT_SIGNAL_UNUSED = 0,
  554. PIKA_HAL_SG_EVENT_SIGNAL_READY_FOR_OUTPUT,
  555. PIKA_HAL_SG_EVENT_SIGNAL_ANY,
  556. } PIKA_HAL_SG_EVENT_SIGNAL;
  557. typedef enum {
  558. _PIKA_HAL_SG_NONBLOCKING_UNUSED = 0,
  559. PIKA_HAL_SG_NONBLOCKING_ENABLE,
  560. PIKA_HAL_SG_NONBLOCKING_DISABLE,
  561. } PIKA_HAL_SG_NONBLOCKING;
  562. typedef struct {
  563. PIKA_HAL_SG_WAVEFORM waveform;
  564. pika_float frequency; // Frequency in Hz
  565. pika_float amplitude; // Amplitude in Volts
  566. pika_float offset; // Offset in Volts
  567. pika_float seconds; // Seconds to output
  568. PIKA_HAL_SG_NONBLOCKING nonblocking;
  569. void (*event_callback)(pika_dev* dev, PIKA_HAL_SG_EVENT_SIGNAL signal);
  570. PIKA_HAL_SG_EVENT_SIGNAL event_callback_filter;
  571. PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
  572. void* user_data;
  573. } pika_hal_SG_config;
  574. typedef struct {
  575. /* parent start */
  576. PIKA_HAL_GPIO_DIR dir;
  577. PIKA_HAL_GPIO_PULL pull;
  578. PIKA_HAL_GPIO_SPEED speed;
  579. void (*event_callback)(pika_dev* dev, PIKA_HAL_GPIO_EVENT_SIGNAL signal);
  580. PIKA_HAL_GPIO_EVENT_SIGNAL event_callback_filter;
  581. PIKA_HAL_EVENT_CALLBACK_ENA event_callback_ena;
  582. void* user_data;
  583. /* parent end */
  584. pika_dev* iic_port;
  585. uint32_t slave_addr;
  586. } pika_hal_GPIO_PCA9555_config;
  587. /* impl typedef */
  588. typedef struct pika_dev_impl {
  589. int (*open)(pika_dev* dev, char* name);
  590. int (*close)(pika_dev* dev);
  591. int (*read)(pika_dev* dev, void* buf, size_t count);
  592. int (*write)(pika_dev* dev, void* buf, size_t count);
  593. int (*ioctl)(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, void* cfg);
  594. } pika_dev_impl;
  595. /* platform API */
  596. #define PIKA_HAL_TABLE_PLATFORM_API
  597. #include "pika_hal_table.h"
  598. /* config merge headers */
  599. #define PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG_HEADER
  600. #include "pika_hal_table.h"
  601. typedef struct {
  602. uint8_t* buffer;
  603. size_t capacity;
  604. size_t head;
  605. size_t tail;
  606. size_t count;
  607. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  608. pika_platform_thread_mutex_t mutex;
  609. #endif
  610. } pika_hal_CircularQueue;
  611. pika_hal_CircularQueue* pika_hal_circularQueue_create(size_t capacity);
  612. int pika_hal_circularQueue_enqueue(pika_hal_CircularQueue* cb, uint8_t ch);
  613. int pika_hal_circularQueue_dequeue(pika_hal_CircularQueue* cb, uint8_t* value);
  614. int pika_hal_circularQueue_deinit(pika_hal_CircularQueue* cb);
  615. size_t pika_hal_circularQueue_getCount(pika_hal_CircularQueue* cb);
  616. int pika_hal_circularQueue_isEmpty(pika_hal_CircularQueue* cb);
  617. int pika_hal_circularQueue_isFull(pika_hal_CircularQueue* cb);
  618. int pika_hal_circularQueue_peek(pika_hal_CircularQueue* cb, uint8_t* value);
  619. #endif