drv_gpio.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. return 0;
  47. int DataRead = XGpioPs_ReadPin(&Gpio, pin);
  48. return DataRead?PIN_HIGH:PIN_LOW;
  49. }
  50. const static struct rt_pin_ops _xgpiops_pin_ops =
  51. {
  52. xgpiops_pin_mode,
  53. xgpiops_pin_write,
  54. xgpiops_pin_read,
  55. RT_NULL,
  56. RT_NULL,
  57. RT_NULL,
  58. RT_NULL,
  59. };
  60. int rt_hw_pin_init(void)
  61. {
  62. int result;
  63. XGpioPs_Config *ConfigPtr;
  64. /* Initialize the GPIO driver. */
  65. ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);
  66. if (XGpioPs_CfgInitialize(&Gpio, ConfigPtr,
  67. ConfigPtr->BaseAddr) == XST_SUCCESS)
  68. {
  69. result = rt_device_pin_register("pin", &_xgpiops_pin_ops, RT_NULL);
  70. return result;
  71. }
  72. return -RT_ERROR;
  73. }
  74. INIT_BOARD_EXPORT(rt_hw_pin_init);