pika_hal_bflb_GPIO.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #include "bflb_gpio.h"
  2. #include "pika_hal_bflb_common.h"
  3. int pika_hal_platform_GPIO_open(pika_dev* dev, char* name) {
  4. dev->platform_data = pikaMalloc(sizeof(platform_gpio_t));
  5. memset(dev->platform_data, 0, sizeof(platform_gpio_t));
  6. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  7. /* Support P1/P2 ... */
  8. gpio->device = bflb_device_get_by_name("gpio");
  9. gpio->pin = fast_atoi(name + 1);
  10. return 0;
  11. }
  12. int pika_hal_platform_GPIO_close(pika_dev* dev) {
  13. pikaFree(dev->platform_data, sizeof(platform_gpio_t));
  14. return 0;
  15. }
  16. int pika_hal_platform_GPIO_read(pika_dev* dev, void* buf, size_t count) {
  17. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  18. bool val = bflb_gpio_read(gpio->device, gpio->pin);
  19. *(uint32_t*)buf = val;
  20. return 0;
  21. }
  22. int pika_hal_platform_GPIO_write(pika_dev* dev, void* buf, size_t count) {
  23. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  24. bool val = *(uint32_t*)buf;
  25. if (val) {
  26. bflb_gpio_set(gpio->device, gpio->pin);
  27. } else {
  28. bflb_gpio_reset(gpio->device, gpio->pin);
  29. }
  30. return 0;
  31. }
  32. int pika_hal_platform_GPIO_ioctl_enable(pika_dev* dev) {
  33. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  34. bflb_gpio_init(gpio->device, gpio->pin, gpio->config);
  35. return 0;
  36. }
  37. int pika_hal_platform_GPIO_ioctl_disable(pika_dev* dev) {
  38. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  39. bflb_gpio_deinit(gpio->device, gpio->pin);
  40. return 0;
  41. }
  42. static void _gpio_irq_hanlder(int irq, void* arg) {
  43. static int i = 0;
  44. // get the device
  45. pika_dev* dev = (pika_dev*)arg;
  46. // get the gpio
  47. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  48. // get the config
  49. pika_hal_GPIO_config* cfg = (pika_hal_GPIO_config*)dev->ioctl_config;
  50. // get the int status
  51. bool intstatus = bflb_gpio_get_intstatus(gpio->device, gpio->pin);
  52. if (intstatus) {
  53. // call the callback
  54. cfg->event_callback(dev, cfg->event_callback_filter);
  55. // clear the int status
  56. bflb_gpio_int_clear(gpio->device, gpio->pin);
  57. }
  58. }
  59. int pika_hal_platform_GPIO_ioctl_config(pika_dev* dev,
  60. pika_hal_GPIO_config* cfg) {
  61. platform_gpio_t* gpio = (platform_gpio_t*)dev->platform_data;
  62. switch (cfg->dir) {
  63. case PIKA_HAL_GPIO_DIR_IN:
  64. gpio->config |= GPIO_INPUT;
  65. break;
  66. case PIKA_HAL_GPIO_DIR_OUT:
  67. gpio->config |= GPIO_OUTPUT;
  68. break;
  69. default:
  70. return -1;
  71. }
  72. switch (cfg->pull) {
  73. case PIKA_HAL_GPIO_PULL_NONE:
  74. gpio->config |= GPIO_FLOAT;
  75. break;
  76. case PIKA_HAL_GPIO_PULL_UP:
  77. gpio->config |= GPIO_PULLUP;
  78. break;
  79. case PIKA_HAL_GPIO_PULL_DOWN:
  80. gpio->config |= GPIO_PULLDOWN;
  81. break;
  82. default:
  83. return -1;
  84. }
  85. /* support event callback */
  86. if (NULL != cfg->event_callback &&
  87. PIKA_HAL_EVENT_CALLBACK_ENA_ENABLE == cfg->event_callback_ena) {
  88. switch (cfg->event_callback_filter) {
  89. case PIKA_HAL_GPIO_EVENT_SIGNAL_RISING:
  90. gpio->config |= GPIO_INT_TRIG_MODE_SYNC_RISING_EDGE;
  91. break;
  92. case PIKA_HAL_GPIO_EVENT_SIGNAL_FALLING:
  93. gpio->config |= GPIO_INT_TRIG_MODE_SYNC_FALLING_EDGE;
  94. break;
  95. default:
  96. __platform_printf(
  97. "Error: not supported event callback filter %d\r\n",
  98. cfg->event_callback_filter);
  99. return -1;
  100. }
  101. /* register the irq */
  102. bflb_gpio_int_mask(gpio->device, gpio->pin, false);
  103. bflb_irq_attach(gpio->device->irq_num, _gpio_irq_hanlder, dev);
  104. bflb_irq_enable(gpio->device->irq_num);
  105. }
  106. return 0;
  107. }