drv_gpio.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-11-27 WangHuachen the first version
  9. */
  10. #include <rtdevice.h>
  11. #include <rthw.h>
  12. #include "drv_gpio.h"
  13. #include "xgpiops.h"
  14. #define DBG_TAG "drv.gpio"
  15. #define DBG_LVL DBG_INFO
  16. #include "rtdbg.h"
  17. #define GPIO_DEVICE_ID XPAR_XGPIOPS_0_DEVICE_ID
  18. static XGpioPs Gpio; /* The driver instance for GPIO Device. */
  19. void xgpiops_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
  20. {
  21. switch (mode)
  22. {
  23. case PIN_MODE_OUTPUT:
  24. case PIN_MODE_OUTPUT_OD:
  25. XGpioPs_SetDirectionPin(&Gpio, pin, 1);
  26. XGpioPs_SetOutputEnablePin(&Gpio, pin, 1);
  27. break;
  28. case PIN_MODE_INPUT:
  29. case PIN_MODE_INPUT_PULLUP:
  30. case PIN_MODE_INPUT_PULLDOWN:
  31. XGpioPs_SetDirectionPin(&Gpio, pin, 0);
  32. break;
  33. default:
  34. break;
  35. }
  36. }
  37. void xgpiops_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
  38. {
  39. if (pin >= Gpio.MaxPinNum)
  40. return;
  41. XGpioPs_WritePin(&Gpio, pin, (value == PIN_HIGH)?1:0);
  42. }
  43. rt_ssize_t xgpiops_pin_read(rt_device_t dev, rt_base_t pin)
  44. {
  45. if (pin >= Gpio.MaxPinNum)
  46. {
  47. return -RT_EINVAL;
  48. }
  49. int DataRead = XGpioPs_ReadPin(&Gpio, pin);
  50. return DataRead?PIN_HIGH:PIN_LOW;
  51. }
  52. const static struct rt_pin_ops _xgpiops_pin_ops =
  53. {
  54. xgpiops_pin_mode,
  55. xgpiops_pin_write,
  56. xgpiops_pin_read,
  57. RT_NULL,
  58. RT_NULL,
  59. RT_NULL,
  60. RT_NULL,
  61. };
  62. int rt_hw_pin_init(void)
  63. {
  64. int result;
  65. XGpioPs_Config *ConfigPtr;
  66. /* Initialize the GPIO driver. */
  67. ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
  68. if (XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
  69. ConfigPtr->BaseAddr) == XST_SUCCESS)
  70. {
  71. result = rt_device_pin_register("pin", &_xgpiops_pin_ops, RT_NULL);
  72. return result;
  73. }
  74. return -RT_ERROR;
  75. }
  76. INIT_BOARD_EXPORT(rt_hw_pin_init);