yc11xx_gpio.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include "yc11xx_gpio.h"
  2. #include "yc_drv_common.h"
  3. void GPIO_SetOut(GPIO_NUM gpio, GPIO_OutputTypeDef GPIO_Output)
  4. {
  5. hw_delay();
  6. if (gpio == GPIO_MAX_NUM)
  7. return;
  8. switch (GPIO_Output)
  9. {
  10. case OUT_LOW:
  11. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK),GPCFG_OUTPUT_LOW);
  12. break;
  13. case OUT_HIGH:
  14. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK),GPCFG_OUTPUT_HIGH);
  15. break;
  16. default:
  17. break;
  18. }
  19. hw_delay();
  20. }
  21. void GPIO_SetInput(GPIO_NUM gpio,GPIO_InputTypeDef GPIO_InputMode)
  22. {
  23. hw_delay();
  24. if (gpio == GPIO_MAX_NUM)
  25. return;
  26. switch(GPIO_InputMode)
  27. {
  28. case GPIO_Mode_IN_FLOATING:
  29. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK),GPCFG_INPUT);
  30. break;
  31. case GPIO_Mode_IPU:
  32. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK),GPCFG_PULLUP);
  33. break;
  34. case GPIO_Mode_IPD:
  35. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK),GPCFG_PULLDOWN);
  36. break;
  37. case GPIO_Mode_AIN:
  38. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK),GPCFG_NO_IE);
  39. break;
  40. default: break;
  41. }
  42. hw_delay();
  43. }
  44. void GPIO_ClearWakeup(GPIO_NUM gpio)
  45. {
  46. uint8_t row;
  47. uint8_t col;
  48. if (gpio == GPIO_MAX_NUM)
  49. return;
  50. row = (gpio>>3) & 0x03;
  51. col = (gpio & 0x07);
  52. HWRITE(mem_gpio_wakeup_low+row,HREAD(mem_gpio_wakeup_low+row)& (~(1<<col)));
  53. HWRITE(mem_gpio_wakeup_high+row,HREAD(mem_gpio_wakeup_high+row)& (~(1<<col)));
  54. }
  55. void GPIO_SetGpioMultFunction(GPIO_NUM gpio, uint8_t Func)
  56. {
  57. HWRITE(CORE_GPIO_CONF + (gpio & GPIO_NUM_MASK), Func);
  58. }
  59. BOOL gpioGetBit(uint8_t Num, uint32_t regBase)
  60. {
  61. uint8_t queue = 0;
  62. uint8_t group = 0;
  63. uint8_t st = 0;
  64. queue = (Num & 7);
  65. group = Num >> 3 & 3;
  66. st = HREAD(regBase+group);
  67. return (st & (1 << queue));
  68. }
  69. BOOL GPIO_GetInputStatus(GPIO_NUM gpio)
  70. {
  71. if (gpio == GPIO_MAX_NUM)
  72. {
  73. error_handle();
  74. }
  75. return gpioGetBit(gpio&0x1f,CORE_GPIO_IN);
  76. }
  77. void GPIO_SetWakeup(GPIO_NUM gpio,GPIO_AwakenTypeDef AWAKEN)
  78. {
  79. uint8_t row;
  80. uint8_t col;
  81. if (gpio == GPIO_MAX_NUM)
  82. return;
  83. row = (gpio>>3) & 0x03;
  84. col = (gpio & 0x07);
  85. switch(AWAKEN)
  86. {
  87. case LOW_AWAKEN:
  88. HWRITE(GPIO_WAKEUP_LOW_REG+row,HREAD(GPIO_WAKEUP_LOW_REG+row) | (1<<col));
  89. HWRITE(GPIO_WAKEUP_HIGH_REG+row,HREAD(GPIO_WAKEUP_HIGH_REG+row) & (~(1<<col)));
  90. break;
  91. case HIGH_AWAKEN:
  92. HWRITE(GPIO_WAKEUP_HIGH_REG+row,HREAD(GPIO_WAKEUP_HIGH_REG+row) | (1<<col));
  93. HWRITE(GPIO_WAKEUP_LOW_REG+row,HREAD(GPIO_WAKEUP_LOW_REG+row) & (~(1<<col)));
  94. break;
  95. }
  96. }
  97. void GPIO_SetWakeupByCurrentState(GPIO_NUM gpio)
  98. {
  99. BOOL St = GPIO_GetInputStatus(gpio);
  100. if (St) //high
  101. {
  102. GPIO_SetWakeup(gpio,LOW_AWAKEN);
  103. }
  104. else //low
  105. {
  106. GPIO_SetWakeup(gpio,HIGH_AWAKEN);
  107. }
  108. }