gpio.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. */
  7. #include <rthw.h>
  8. #include <rtthread.h>
  9. #include <rtdevice.h>
  10. #include <am33xx.h>
  11. #include "gpio.h"
  12. #ifdef RT_USING_PIN
  13. #define reg(base) *(int*)(base)
  14. #define GPIO_PIN_LOW (0x0)
  15. #define GPIO_PIN_HIGH (0x1)
  16. #define GPIO_CLEARDATAOUT (0x190)
  17. #define GPIO_SETDATAOUT (0x194)
  18. #define GPIO_DATAIN (0x138)
  19. #define GPIO_OE (0x134)
  20. static rt_base_t GPIO_BASE[] =
  21. {
  22. AM33XX_GPIO_0_REGS,
  23. AM33XX_GPIO_1_REGS,
  24. AM33XX_GPIO_2_REGS,
  25. AM33XX_GPIO_3_REGS
  26. };
  27. static void am33xx_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode)
  28. {
  29. RT_ASSERT(pin >= 0 && pin < 128);
  30. RT_ASSERT(mode != PIN_MODE_INPUT_PULLUP); /* Mode not supported */
  31. rt_base_t gpiox = pin >> 5;
  32. rt_base_t pinNumber = pin & 0x1F;
  33. if(PIN_MODE_OUTPUT == mode)
  34. {
  35. reg(GPIO_BASE[gpiox] + GPIO_OE) &= ~(1 << pinNumber);
  36. }
  37. else if(PIN_MODE_INPUT == mode)
  38. {
  39. reg(GPIO_BASE[gpiox] + GPIO_OE) |= (1 << pinNumber);
  40. }
  41. }
  42. static void am33xx_pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value)
  43. {
  44. RT_ASSERT(pin >= 0 && pin < 128);
  45. rt_base_t gpiox = pin >> 5;
  46. rt_base_t pinNumber = pin & 0x1F;
  47. if(GPIO_PIN_HIGH == value)
  48. {
  49. reg(GPIO_BASE[gpiox] + GPIO_SETDATAOUT) = (1 << pinNumber);
  50. }
  51. else /* GPIO_PIN_LOW */
  52. {
  53. reg(GPIO_BASE[gpiox] + GPIO_CLEARDATAOUT) = (1 << pinNumber);
  54. }
  55. }
  56. static int am33xx_pin_read(struct rt_device *device, rt_base_t pin)
  57. {
  58. RT_ASSERT(pin >= 0 && pin < 128);
  59. rt_base_t gpiox = pin >> 5;
  60. rt_base_t pinNumber = pin & 0x1F;
  61. return reg(GPIO_BASE[gpiox] + GPIO_DATAIN) & (1 << pinNumber) ? 1 : 0;
  62. }
  63. static struct rt_pin_ops am33xx_pin_ops =
  64. {
  65. am33xx_pin_mode,
  66. am33xx_pin_write,
  67. am33xx_pin_read,
  68. RT_NULL,
  69. RT_NULL,
  70. RT_NULL,
  71. RT_NULL,
  72. };
  73. int rt_hw_gpio_init(void)
  74. {
  75. rt_device_pin_register("gpio", &am33xx_pin_ops , RT_NULL);
  76. return 0;
  77. }
  78. INIT_BOARD_EXPORT(rt_hw_gpio_init);
  79. #endif