drv_gpio.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * Copyright (c) 2006-2025, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-08-21 kurisaw first version
  9. */
  10. #include <drv_gpio.h>
  11. #include <rtthread.h>
  12. void rt_pin_mode(rt_uint64_t pin, rt_uint8_t mode)
  13. {
  14. fsp_err_t err;
  15. switch (mode)
  16. {
  17. case PIN_MODE_OUTPUT:
  18. err = R_IOPORT_PinCfg(&g_ioport_ctrl, (bsp_io_port_pin_t)pin, BSP_IO_DIRECTION_OUTPUT);
  19. if (err != FSP_SUCCESS)
  20. {
  21. return;
  22. }
  23. break;
  24. case PIN_MODE_INPUT:
  25. err = R_IOPORT_PinCfg(&g_ioport_ctrl, (bsp_io_port_pin_t)pin, BSP_IO_DIRECTION_INPUT);
  26. if (err != FSP_SUCCESS)
  27. {
  28. return;
  29. }
  30. break;
  31. case PIN_MODE_OUTPUT_OD:
  32. err = R_IOPORT_PinCfg(&g_ioport_ctrl, (bsp_io_port_pin_t)pin, IOPORT_CFG_NMOS_ENABLE);
  33. if (err != FSP_SUCCESS)
  34. {
  35. return;
  36. }
  37. break;
  38. }
  39. }
  40. void rt_pin_write(rt_uint64_t pin, rt_uint8_t value)
  41. {
  42. bsp_io_level_t level = BSP_IO_LEVEL_HIGH;
  43. if (value != level)
  44. {
  45. level = BSP_IO_LEVEL_LOW;
  46. }
  47. R_BSP_PinAccessEnable();
  48. #ifdef SOC_SERIES_R9A07G0
  49. R_IOPORT_PinWrite(&g_ioport_ctrl, (bsp_io_port_pin_t)pin, (bsp_io_level_t)level);
  50. #else
  51. R_BSP_PinWrite(pin, level);
  52. #endif
  53. R_BSP_PinAccessDisable();
  54. }
  55. rt_int8_t rt_pin_read(rt_uint64_t pin)
  56. {
  57. if ((pin > RA_MAX_PIN_VALUE) || (pin < RA_MIN_PIN_VALUE))
  58. {
  59. return -RT_EINVAL;
  60. }
  61. #ifdef SOC_SERIES_R9A07G0
  62. bsp_io_level_t io_level;
  63. R_IOPORT_PinRead(&g_ioport_ctrl, (bsp_io_port_pin_t)pin, &io_level);
  64. return io_level;
  65. #else
  66. return R_BSP_PinRead(pin);
  67. #endif
  68. }