drv_gpio.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Copyright (c) 2021-2024 RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-06-03 supperthomas first version
  9. * 2024-12-08 wumingzi support open drain mode for soft i2c
  10. */
  11. #include <rtthread.h>
  12. #include <rtdevice.h>
  13. #include "driver/gpio.h"
  14. #ifdef RT_USING_PIN
  15. static void mcu_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
  16. {
  17. gpio_set_level(pin, value);
  18. /*TODO:set gpio out put mode */
  19. }
  20. static rt_ssize_t mcu_pin_read(rt_device_t dev, rt_base_t pin)
  21. {
  22. rt_ssize_t value;
  23. value = gpio_get_level(pin);
  24. return value;
  25. }
  26. static void mcu_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
  27. {
  28. gpio_config_t io_conf;
  29. io_conf.intr_type = GPIO_INTR_DISABLE;
  30. io_conf.mode = GPIO_MODE_OUTPUT;
  31. io_conf.pin_bit_mask = (1ULL << pin);
  32. io_conf.pull_down_en = 0;
  33. io_conf.pull_up_en = 0;
  34. gpio_config(&io_conf);
  35. switch (mode)
  36. {
  37. case PIN_MODE_INPUT:
  38. gpio_set_direction(pin, GPIO_MODE_INPUT);
  39. case PIN_MODE_OUTPUT:
  40. gpio_set_direction(pin, GPIO_MODE_OUTPUT);
  41. case PIN_MODE_OUTPUT_OD:
  42. gpio_set_direction(pin, GPIO_MODE_INPUT_OUTPUT_OD);
  43. }
  44. /*TODO:set gpio out put mode */
  45. }
  46. static rt_err_t mcu_pin_attach_irq(struct rt_device *device, rt_base_t pin,
  47. rt_uint8_t irq_mode, void (*hdr)(void *args), void *args)
  48. {
  49. /*TODO: start irq handle */
  50. return -RT_ENOSYS;
  51. }
  52. static rt_err_t mcu_pin_detach_irq(struct rt_device *device, rt_base_t pin)
  53. {
  54. /*TODO:disable gpio irq handle */
  55. return RT_EOK;
  56. }
  57. static rt_err_t mcu_pin_irq_enable(struct rt_device *device, rt_base_t pin,
  58. rt_uint8_t enabled)
  59. {
  60. /*TODO:start irq handle */
  61. return RT_EOK;
  62. }
  63. const static struct rt_pin_ops _mcu_pin_ops =
  64. {
  65. mcu_pin_mode,
  66. mcu_pin_write,
  67. mcu_pin_read,
  68. mcu_pin_attach_irq,
  69. mcu_pin_detach_irq,
  70. mcu_pin_irq_enable,
  71. RT_NULL,
  72. };
  73. int rt_hw_pin_init(void)
  74. {
  75. /*TODO: INIT THE GPIO CLOCK AND OTHER */
  76. return rt_device_pin_register("pin", &_mcu_pin_ops, RT_NULL);
  77. }
  78. INIT_BOARD_EXPORT(rt_hw_pin_init);
  79. #endif /* RT_USING_PIN */