gpio.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * File : gpio.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2015, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. */
  11. #include <rthw.h>
  12. #include <rtthread.h>
  13. #include <rtdevice.h>
  14. #include <am33xx.h>
  15. #include "gpio.h"
  16. #ifdef RT_USING_PIN
  17. #define reg(base) *(int*)(base)
  18. #define GPIO_PIN_LOW (0x0)
  19. #define GPIO_PIN_HIGH (0x1)
  20. #define GPIO_CLEARDATAOUT (0x190)
  21. #define GPIO_SETDATAOUT (0x194)
  22. #define GPIO_DATAIN (0x138)
  23. #define GPIO_OE (0x134)
  24. static rt_base_t GPIO_BASE[] =
  25. {
  26. AM33XX_GPIO_0_REGS,
  27. AM33XX_GPIO_1_REGS,
  28. AM33XX_GPIO_2_REGS,
  29. AM33XX_GPIO_3_REGS
  30. };
  31. static void am33xx_pin_mode(struct rt_device *device, rt_base_t pin, rt_base_t mode)
  32. {
  33. RT_ASSERT(pin >= 0 && pin < 128);
  34. RT_ASSERT(mode != PIN_MODE_INPUT_PULLUP); /* Mode not supported */
  35. rt_base_t gpiox = pin >> 5;
  36. rt_base_t pinNumber = pin & 0x1F;
  37. if(PIN_MODE_OUTPUT == mode)
  38. {
  39. reg(GPIO_BASE[gpiox] + GPIO_OE) &= ~(1 << pinNumber);
  40. }
  41. else if(PIN_MODE_INPUT == mode)
  42. {
  43. reg(GPIO_BASE[gpiox] + GPIO_OE) |= (1 << pinNumber);
  44. }
  45. }
  46. static void am33xx_pin_write(struct rt_device *device, rt_base_t pin, rt_base_t value)
  47. {
  48. RT_ASSERT(pin >= 0 && pin < 128);
  49. rt_base_t gpiox = pin >> 5;
  50. rt_base_t pinNumber = pin & 0x1F;
  51. if(GPIO_PIN_HIGH == value)
  52. {
  53. reg(GPIO_BASE[gpiox] + GPIO_SETDATAOUT) = (1 << pinNumber);
  54. }
  55. else /* GPIO_PIN_LOW */
  56. {
  57. reg(GPIO_BASE[gpiox] + GPIO_CLEARDATAOUT) = (1 << pinNumber);
  58. }
  59. }
  60. static int am33xx_pin_read(struct rt_device *device, rt_base_t pin)
  61. {
  62. RT_ASSERT(pin >= 0 && pin < 128);
  63. rt_base_t gpiox = pin >> 5;
  64. rt_base_t pinNumber = pin & 0x1F;
  65. return reg(GPIO_BASE[gpiox] + GPIO_DATAIN) & (1 << pinNumber) ? 1 : 0;
  66. }
  67. static struct rt_pin_ops am33xx_pin_ops =
  68. {
  69. am33xx_pin_mode,
  70. am33xx_pin_write,
  71. am33xx_pin_read,
  72. RT_NULL,
  73. RT_NULL,
  74. RT_NULL,
  75. RT_NULL,
  76. };
  77. int rt_hw_gpio_init(void)
  78. {
  79. rt_device_pin_register("gpio", &am33xx_pin_ops , RT_NULL);
  80. return 0;
  81. }
  82. INIT_BOARD_EXPORT(rt_hw_gpio_init);
  83. #endif