pika_hal.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. #include "pika_hal.h"
  2. #include "PikaObj.h"
  3. #define PIKA_HAL_TABLE_FILE_API
  4. #include "pika_hal_table.h"
  5. static const pika_dev_impl pika_dev_impl_list[] = {
  6. #define PIKA_HAL_TABLE_IMPL
  7. #include "pika_hal_table.h"
  8. };
  9. #define _PIKA_DEV_TYPE_MAX \
  10. (sizeof pika_dev_impl_list / sizeof pika_dev_impl_list[0])
  11. static pika_dev_impl* _pika_dev_get_impl(PIKA_HAL_DEV_TYPE type) {
  12. if (type >= _PIKA_DEV_TYPE_MAX) {
  13. return NULL;
  14. }
  15. return (pika_dev_impl*)&pika_dev_impl_list[type];
  16. }
  17. static size_t _pika_hal_dev_config_size(PIKA_HAL_DEV_TYPE dev_type) {
  18. #define PIKA_HAL_TABLE_DEV_CONFIG_SIZE
  19. #include "pika_hal_table.h"
  20. return 0;
  21. }
  22. pika_dev* pika_hal_open(PIKA_HAL_DEV_TYPE dev_type, char* name) {
  23. pika_dev_impl* impl = NULL;
  24. if (NULL == name) {
  25. __platform_printf("Error: dev_open name is NULL.\r\n");
  26. return NULL;
  27. }
  28. int ret = -1;
  29. pika_dev* dev = NULL;
  30. if (dev_type >= _PIKA_DEV_TYPE_MAX) {
  31. __platform_printf("Error: dev_type invalied.\r\n");
  32. goto __exit;
  33. }
  34. impl = _pika_dev_get_impl(dev_type);
  35. dev = (pika_dev*)pikaMalloc(sizeof(pika_dev));
  36. if (dev == NULL) {
  37. goto __exit;
  38. }
  39. pika_debug("pika_hal_open, dev[0x%p], type[%d], name[%s]", dev, dev_type,
  40. name);
  41. memset(dev, 0, sizeof(pika_dev));
  42. dev->type = dev_type;
  43. dev->ioctl_config = pikaMalloc(_pika_hal_dev_config_size(dev_type));
  44. if (dev->ioctl_config == NULL) {
  45. goto __exit;
  46. }
  47. memset(dev->ioctl_config, 0, _pika_hal_dev_config_size(dev_type));
  48. ret = impl->open(dev, name);
  49. __exit:
  50. if (0 == ret) {
  51. return dev;
  52. }
  53. /* error */
  54. __platform_printf("Error: dev_open failed.\r\n");
  55. if (dev && dev->ioctl_config) {
  56. pikaFree(dev->ioctl_config, _pika_hal_dev_config_size(dev_type));
  57. dev->ioctl_config = NULL;
  58. }
  59. if (dev) {
  60. pikaFree(dev, sizeof(pika_dev));
  61. }
  62. return NULL;
  63. }
  64. int pika_hal_close(pika_dev* dev) {
  65. int ret = -1;
  66. pika_dev_impl* impl = NULL;
  67. if (dev == NULL) {
  68. goto __exit;
  69. }
  70. impl = _pika_dev_get_impl(dev->type);
  71. if (impl->close == NULL) {
  72. goto __exit;
  73. }
  74. ret = impl->close(dev);
  75. __exit:
  76. if (NULL != dev && NULL != dev->ioctl_config) {
  77. pikaFree(dev->ioctl_config, _pika_hal_dev_config_size(dev->type));
  78. dev->ioctl_config = NULL;
  79. }
  80. if (NULL != dev) {
  81. pikaFree(dev, sizeof(pika_dev));
  82. }
  83. return ret;
  84. }
  85. int pika_hal_read(pika_dev* dev, void* buf, size_t len) {
  86. if (dev == NULL) {
  87. pika_platform_printf("Error: dev is NULL.\r\n");
  88. return -1;
  89. }
  90. if (!dev->is_enabled) {
  91. pika_platform_printf("Error: dev is not enabled.\r\n");
  92. return -1;
  93. }
  94. pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
  95. if (impl->read == NULL) {
  96. pika_platform_printf("Error: read not support.\r\n");
  97. return -1;
  98. }
  99. return impl->read(dev, buf, len);
  100. }
  101. int pika_hal_write(pika_dev* dev, void* buf, size_t len) {
  102. if (dev == NULL) {
  103. pika_platform_printf("Error: dev is NULL.\r\n");
  104. return -1;
  105. }
  106. if (!dev->is_enabled) {
  107. pika_platform_printf("Error: dev is not enabled.\r\n");
  108. return -1;
  109. }
  110. pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
  111. if (impl->write == NULL) {
  112. pika_platform_printf("Error: write not support.\r\n");
  113. return -1;
  114. }
  115. return impl->write(dev, buf, len);
  116. }
  117. static const int _pika_hal_cmd_arg_cnt[] = {
  118. [PIKA_HAL_IOCTL_CONFIG] = 1,
  119. [PIKA_HAL_IOCTL_ENABLE] = 0,
  120. [PIKA_HAL_IOCTL_DISABLE] = 0,
  121. };
  122. #define _PIKA_HAL_CMD_ARG_CNT_MAX \
  123. (sizeof _pika_hal_cmd_arg_cnt / sizeof _pika_hal_cmd_arg_cnt[0])
  124. static int _pika_hal_get_arg_cnt(PIKA_HAL_IOCTL_CMD cmd) {
  125. return _pika_hal_cmd_arg_cnt[PIKA_HAL_IOCTL_CONFIG];
  126. }
  127. int _pika_hal_ioctl_merge_config(pika_dev* dev, void* config_in) {
  128. #define PIKA_HAL_TABLE_IOCTL_MERGE_CONFIG
  129. #include "pika_hal_table.h"
  130. return -1;
  131. }
  132. int pika_hal_ioctl(pika_dev* dev, PIKA_HAL_IOCTL_CMD cmd, ...) {
  133. int ret = -1;
  134. PIKA_HAL_IOCTL_CMD cmd_origin = cmd;
  135. if (dev == NULL) {
  136. pika_platform_printf("Error: dev is NULL.\r\n");
  137. return -1;
  138. }
  139. pika_debug("pika_hal_ioctl, dev[0x%p], type[%d], cmd[%d]", dev, dev->type,
  140. cmd);
  141. cmd = _pika_hal_get_arg_cnt(cmd_origin);
  142. pika_dev_impl* impl = _pika_dev_get_impl(dev->type);
  143. if (impl->ioctl == NULL) {
  144. pika_platform_printf("Error: ioctl not support.\r\n");
  145. return -1;
  146. }
  147. void* arg_in = NULL;
  148. if (cmd != 0) {
  149. va_list args;
  150. va_start(args, cmd);
  151. arg_in = va_arg(args, void*);
  152. if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
  153. ret = _pika_hal_ioctl_merge_config(dev, arg_in);
  154. } else {
  155. ret = 0;
  156. }
  157. va_end(args);
  158. if (0 != ret) {
  159. pika_platform_printf("Error: ioctl merge config failed.\r\n");
  160. return ret;
  161. }
  162. }
  163. if (cmd_origin == PIKA_HAL_IOCTL_CONFIG) {
  164. ret = impl->ioctl(dev, cmd_origin, dev->ioctl_config);
  165. } else {
  166. ret = impl->ioctl(dev, cmd_origin, arg_in);
  167. }
  168. if (ret == 0) {
  169. if (cmd_origin == PIKA_HAL_IOCTL_ENABLE) {
  170. dev->is_enabled = 1;
  171. }
  172. if (cmd_origin == PIKA_HAL_IOCTL_DISABLE) {
  173. dev->is_enabled = 0;
  174. }
  175. }
  176. return ret;
  177. }
  178. #define _IOCTL_CONFIG_USE_DEFAULT(item, default) \
  179. if (src->item == 0) { \
  180. if (dst->item == 0) { \
  181. /* use default value */ \
  182. dst->item = default; \
  183. } else { \
  184. /* keep exist value */ \
  185. } \
  186. } else { \
  187. /* use input value */ \
  188. dst->item = src->item; \
  189. }
  190. #define _IOCTL_CONFIG_USE_DEFAULT_STR(item, default) \
  191. if (src->item[0] == '\0') { \
  192. if (dst->item[0] == '\0') { \
  193. /* use default value */ \
  194. strcpy(dst->item, default); \
  195. } else { \
  196. /* keep exist value */ \
  197. } \
  198. } else { \
  199. /* use input value */ \
  200. strcpy(dst->item, src->item); \
  201. }
  202. int pika_hal_GPIO_ioctl_merge_config(pika_hal_GPIO_config* dst,
  203. pika_hal_GPIO_config* src) {
  204. // printf("before merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
  205. _IOCTL_CONFIG_USE_DEFAULT(dir, PIKA_HAL_GPIO_DIR_IN);
  206. // printf("after merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
  207. _IOCTL_CONFIG_USE_DEFAULT(pull, PIKA_HAL_GPIO_PULL_NONE);
  208. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_GPIO_SPEED_10M);
  209. _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
  210. _IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
  211. PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
  212. _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
  213. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
  214. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  215. return 0;
  216. }
  217. int pika_hal_GPIO_PCA9555_ioctl_merge_config(
  218. pika_hal_GPIO_PCA9555_config* dst,
  219. pika_hal_GPIO_PCA9555_config* src) {
  220. // printf("before merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
  221. _IOCTL_CONFIG_USE_DEFAULT(dir, PIKA_HAL_GPIO_DIR_IN);
  222. // printf("after merge: dst->dir=%d, src->dir=%d\r\n", dst->dir, src->dir);
  223. _IOCTL_CONFIG_USE_DEFAULT(pull, PIKA_HAL_GPIO_PULL_NONE);
  224. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_GPIO_SPEED_10M);
  225. _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
  226. _IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
  227. PIKA_HAL_GPIO_EVENT_SIGNAL_RISING);
  228. _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
  229. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
  230. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  231. _IOCTL_CONFIG_USE_DEFAULT(iic_port, NULL);
  232. _IOCTL_CONFIG_USE_DEFAULT(slave_addr, 0);
  233. return 0;
  234. }
  235. int pika_hal_UART_ioctl_merge_config(pika_hal_UART_config* dst,
  236. pika_hal_UART_config* src) {
  237. _IOCTL_CONFIG_USE_DEFAULT(baudrate, PIKA_HAL_UART_BAUDRATE_115200);
  238. _IOCTL_CONFIG_USE_DEFAULT(data_bits, PIKA_HAL_UART_DATA_BITS_8);
  239. _IOCTL_CONFIG_USE_DEFAULT(stop_bits, PIKA_HAL_UART_STOP_BITS_1);
  240. _IOCTL_CONFIG_USE_DEFAULT(parity, PIKA_HAL_UART_PARITY_NONE);
  241. _IOCTL_CONFIG_USE_DEFAULT(flow_control, PIKA_HAL_UART_FLOW_CONTROL_NONE);
  242. _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
  243. _IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
  244. PIKA_HAL_UART_EVENT_SIGNAL_RX);
  245. _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
  246. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
  247. _IOCTL_CONFIG_USE_DEFAULT(TX, NULL);
  248. _IOCTL_CONFIG_USE_DEFAULT(RX, NULL);
  249. _IOCTL_CONFIG_USE_DEFAULT(RTS, NULL);
  250. _IOCTL_CONFIG_USE_DEFAULT(CTS, NULL);
  251. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  252. return 0;
  253. }
  254. int pika_hal_SPI_ioctl_merge_config(pika_hal_SPI_config* dst,
  255. pika_hal_SPI_config* src) {
  256. _IOCTL_CONFIG_USE_DEFAULT(lsb_or_msb, PIKA_HAL_SPI_MSB);
  257. _IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_SPI_MASTER);
  258. _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_SPI_MODE_0);
  259. _IOCTL_CONFIG_USE_DEFAULT(data_width, PIKA_HAL_SPI_DATA_WIDTH_8);
  260. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_SPI_SPEED_2M);
  261. _IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_SPI_TIMEOUT_1000MS);
  262. _IOCTL_CONFIG_USE_DEFAULT(CS, NULL);
  263. _IOCTL_CONFIG_USE_DEFAULT(SCK, NULL);
  264. _IOCTL_CONFIG_USE_DEFAULT(MOSI, NULL);
  265. _IOCTL_CONFIG_USE_DEFAULT(MISO, NULL);
  266. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  267. return 0;
  268. }
  269. int pika_hal_SOFT_SPI_ioctl_merge_config(pika_hal_SOFT_SPI_config* dst,
  270. pika_hal_SOFT_SPI_config* src) {
  271. _IOCTL_CONFIG_USE_DEFAULT(lsb_or_msb, PIKA_HAL_SPI_MSB);
  272. _IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_SPI_MASTER);
  273. _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_SPI_MODE_0);
  274. _IOCTL_CONFIG_USE_DEFAULT(data_width, PIKA_HAL_SPI_DATA_WIDTH_8);
  275. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_SPI_SPEED_2M);
  276. _IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_SPI_TIMEOUT_1000MS);
  277. _IOCTL_CONFIG_USE_DEFAULT(CS, NULL);
  278. _IOCTL_CONFIG_USE_DEFAULT(SCK, NULL);
  279. _IOCTL_CONFIG_USE_DEFAULT(MOSI, NULL);
  280. _IOCTL_CONFIG_USE_DEFAULT(MISO, NULL);
  281. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  282. return 0;
  283. }
  284. int pika_hal_IIC_ioctl_merge_config(pika_hal_IIC_config* dst,
  285. pika_hal_IIC_config* src) {
  286. _IOCTL_CONFIG_USE_DEFAULT(address_width, PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT);
  287. _IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_IIC_MASTER);
  288. _IOCTL_CONFIG_USE_DEFAULT(slave_addr, 0);
  289. _IOCTL_CONFIG_USE_DEFAULT(mem_addr_ena, PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE);
  290. _IOCTL_CONFIG_USE_DEFAULT(mem_addr_size, PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT);
  291. dst->mem_addr = src->mem_addr;
  292. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_IIC_SPEED_100K);
  293. _IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_IIC_TIMEOUT_1000MS);
  294. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  295. return 0;
  296. }
  297. int pika_hal_SOFT_IIC_ioctl_merge_config(pika_hal_SOFT_IIC_config* dst,
  298. pika_hal_SOFT_IIC_config* src) {
  299. _IOCTL_CONFIG_USE_DEFAULT(SDA, NULL);
  300. _IOCTL_CONFIG_USE_DEFAULT(SCL, NULL);
  301. _IOCTL_CONFIG_USE_DEFAULT(address_width, PIKA_HAL_IIC_ADDRESS_WIDTH_7BIT);
  302. _IOCTL_CONFIG_USE_DEFAULT(master_or_slave, PIKA_HAL_IIC_MASTER);
  303. _IOCTL_CONFIG_USE_DEFAULT(slave_addr, 0);
  304. _IOCTL_CONFIG_USE_DEFAULT(mem_addr_ena, PIKA_HAL_IIC_MEM_ADDR_ENA_DISABLE);
  305. _IOCTL_CONFIG_USE_DEFAULT(mem_addr_size, PIKA_HAL_IIC_MEM_ADDR_SIZE_8BIT);
  306. dst->mem_addr = src->mem_addr;
  307. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_IIC_SPEED_100K);
  308. _IOCTL_CONFIG_USE_DEFAULT(timeout, PIKA_HAL_IIC_TIMEOUT_1000MS);
  309. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  310. return 0;
  311. }
  312. int pika_hal_PWM_ioctl_merge_config(pika_hal_PWM_config* dst,
  313. pika_hal_PWM_config* src) {
  314. _IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_PWM_PERIOD_1MS * 10);
  315. // _IOCTL_CONFIG_USE_DEFAULT(duty, 0);
  316. dst->duty = src->duty;
  317. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  318. return 0;
  319. }
  320. int pika_hal_ADC_ioctl_merge_config(pika_hal_ADC_config* dst,
  321. pika_hal_ADC_config* src) {
  322. _IOCTL_CONFIG_USE_DEFAULT(sampling_resolution, PIKA_HAL_ADC_RESOLUTION_12);
  323. _IOCTL_CONFIG_USE_DEFAULT(sampling_freq, PIKA_HAL_ADC_SAMPLING_FREQ_100);
  324. _IOCTL_CONFIG_USE_DEFAULT(continue_or_single, PIKA_HAL_ADC_SINGLE);
  325. _IOCTL_CONFIG_USE_DEFAULT(vref, (pika_float)3.3);
  326. _IOCTL_CONFIG_USE_DEFAULT(max, 8192);
  327. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  328. return 0;
  329. }
  330. int pika_hal_DAC_ioctl_merge_config(pika_hal_DAC_config* dst,
  331. pika_hal_DAC_config* src) {
  332. _IOCTL_CONFIG_USE_DEFAULT(speed, PIKA_HAL_DAC_SPEED_1K * 8);
  333. _IOCTL_CONFIG_USE_DEFAULT(sampling_resolution, PIKA_HAL_DAC_RESOLUTION_12);
  334. _IOCTL_CONFIG_USE_DEFAULT(vref, (pika_float)3.3);
  335. _IOCTL_CONFIG_USE_DEFAULT(max, 3300000);
  336. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  337. return 0;
  338. }
  339. int pika_hal_WIFI_ioctl_merge_config(pika_hal_WIFI_config* dst,
  340. pika_hal_WIFI_config* src) {
  341. _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_WIFI_MODE_STA);
  342. _IOCTL_CONFIG_USE_DEFAULT(channel, PIKA_HAL_WIFI_CHANNEL_0);
  343. _IOCTL_CONFIG_USE_DEFAULT(max_connection, PIKA_HAL_WIFI_MAX_CONNECTION_4);
  344. _IOCTL_CONFIG_USE_DEFAULT_STR(ap_ssid, "pikapython.com");
  345. _IOCTL_CONFIG_USE_DEFAULT_STR(ap_bssid, "");
  346. _IOCTL_CONFIG_USE_DEFAULT_STR(ap_password, "pikapython.com");
  347. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  348. return 0;
  349. }
  350. int pika_hal_LAN_ioctl_merge_config(pika_hal_LAN_config* dst,
  351. pika_hal_LAN_config* src) {
  352. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  353. return 0;
  354. }
  355. int pika_hal_SG_ioctl_merge_config(pika_hal_SG_config* dst,
  356. pika_hal_SG_config* src) {
  357. _IOCTL_CONFIG_USE_DEFAULT(waveform, PIKA_HAL_SG_WAVEFORM_SINE);
  358. _IOCTL_CONFIG_USE_DEFAULT(frequency, 10);
  359. _IOCTL_CONFIG_USE_DEFAULT(amplitude, 0.1);
  360. dst->offset = src->offset;
  361. dst->seconds = src->seconds;
  362. _IOCTL_CONFIG_USE_DEFAULT(nonblocking, PIKA_HAL_SG_NONBLOCKING_ENABLE);
  363. _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
  364. _IOCTL_CONFIG_USE_DEFAULT(event_callback_filter,
  365. PIKA_HAL_SG_EVENT_SIGNAL_ANY);
  366. _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
  367. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
  368. _IOCTL_CONFIG_USE_DEFAULT(user_data, NULL);
  369. return 0;
  370. }
  371. int pika_hal_TIM_ioctl_merge_config(pika_hal_TIM_config* dst,
  372. pika_hal_TIM_config* src) {
  373. _IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_TIM_PERIOD_1S);
  374. _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_TIM_MODE_CONTINUOUS);
  375. _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
  376. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
  377. _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
  378. return 0;
  379. }
  380. int pika_hal_SOFT_TIM_ioctl_merge_config(pika_hal_SOFT_TIM_config* dst,
  381. pika_hal_SOFT_TIM_config* src) {
  382. _IOCTL_CONFIG_USE_DEFAULT(period, PIKA_HAL_TIM_PERIOD_1S);
  383. _IOCTL_CONFIG_USE_DEFAULT(mode, PIKA_HAL_TIM_MODE_CONTINUOUS);
  384. _IOCTL_CONFIG_USE_DEFAULT(event_callback_ena,
  385. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE);
  386. _IOCTL_CONFIG_USE_DEFAULT(event_callback, NULL);
  387. return 0;
  388. }
  389. int pika_hal_CAM_ioctl_merge_config(pika_hal_CAM_config* dst,
  390. pika_hal_CAM_config* src) {
  391. _IOCTL_CONFIG_USE_DEFAULT(format, PIKA_HAL_CAM_PIXFORMAT_RGB565);
  392. _IOCTL_CONFIG_USE_DEFAULT(framesize, PIKA_HAL_CAM_FRAMESIZE_QVGA);
  393. _IOCTL_CONFIG_USE_DEFAULT(buff_len, 320 * 240 * 16);
  394. return 0;
  395. }
  396. pika_hal_CircularQueue* pika_hal_circularQueue_create(size_t capacity) {
  397. pika_hal_CircularQueue* cb =
  398. (pika_hal_CircularQueue*)pikaMalloc(sizeof(pika_hal_CircularQueue));
  399. if (NULL == cb) {
  400. return NULL;
  401. }
  402. cb->head = 0;
  403. cb->tail = 0;
  404. cb->count = 0;
  405. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  406. pika_platform_thread_mutex_init(&cb->mutex);
  407. #endif
  408. cb->capacity = capacity;
  409. cb->buffer = (uint8_t*)pikaMalloc(capacity);
  410. if (NULL == cb->buffer) {
  411. pikaFree(cb, sizeof(pika_hal_CircularQueue));
  412. return NULL;
  413. }
  414. return cb;
  415. }
  416. int pika_hal_circularQueue_enqueue(pika_hal_CircularQueue* cb, uint8_t ch) {
  417. int ret = 0;
  418. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  419. pika_platform_thread_mutex_lock(&cb->mutex);
  420. #endif
  421. if (cb->count == cb->capacity) {
  422. ret = -1;
  423. goto __exit;
  424. }
  425. cb->buffer[cb->tail] = ch;
  426. cb->tail = (cb->tail + 1) % cb->capacity;
  427. cb->count++;
  428. __exit:
  429. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  430. pika_platform_thread_mutex_unlock(&cb->mutex);
  431. #endif
  432. return ret;
  433. }
  434. int pika_hal_circularQueue_dequeue(pika_hal_CircularQueue* cb, uint8_t* value) {
  435. int ret = 0;
  436. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  437. pika_platform_thread_mutex_lock(&cb->mutex);
  438. #endif
  439. if (cb->count == 0) {
  440. ret = -1;
  441. goto __exit;
  442. }
  443. *value = cb->buffer[cb->head];
  444. cb->head = (cb->head + 1) % cb->capacity;
  445. cb->count--;
  446. __exit:
  447. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  448. pika_platform_thread_mutex_unlock(&cb->mutex);
  449. #endif
  450. return ret;
  451. }
  452. int pika_hal_circularQueue_deinit(pika_hal_CircularQueue* cb) {
  453. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  454. pika_platform_thread_mutex_lock(&cb->mutex);
  455. #endif
  456. pikaFree(cb->buffer, cb->capacity);
  457. cb->buffer = NULL;
  458. cb->head = 0;
  459. cb->tail = 0;
  460. cb->count = 0;
  461. cb->capacity = 0;
  462. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  463. pika_platform_thread_mutex_destroy(&cb->mutex);
  464. #endif
  465. pikaFree(cb, sizeof(pika_hal_CircularQueue));
  466. return 0;
  467. }
  468. size_t pika_hal_circularQueue_getCount(pika_hal_CircularQueue* cb) {
  469. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  470. pika_platform_thread_mutex_lock(&cb->mutex);
  471. #endif
  472. size_t count = cb->count;
  473. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  474. pika_platform_thread_mutex_unlock(&cb->mutex);
  475. #endif
  476. return count;
  477. }
  478. int pika_hal_circularQueue_isEmpty(pika_hal_CircularQueue* cb) {
  479. return cb->count == 0;
  480. }
  481. int pika_hal_circularQueue_isFull(pika_hal_CircularQueue* cb) {
  482. return cb->count == cb->capacity;
  483. }
  484. int pika_hal_circularQueue_peek(pika_hal_CircularQueue* cb, uint8_t* value) {
  485. if (cb->count == 0) {
  486. return -1;
  487. }
  488. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  489. pika_platform_thread_mutex_lock(&cb->mutex);
  490. #endif
  491. *value = cb->buffer[cb->head];
  492. #if PIKA_HAL_CIRCULAR_QUEUE_MUTEX_ENABLE
  493. pika_platform_thread_mutex_unlock(&cb->mutex);
  494. #endif
  495. return 0;
  496. }