ls1b_gpio.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. * 2017-09-06 勤为本 first version
  9. */
  10. #ifndef __LOONGSON_GPIO_H
  11. #define __LOONGSON_GPIO_H
  12. // 龙芯1c的gpio是按照0,1,2,3,4...这样的顺序编号的,
  13. // 但在操作寄存器的时候,又是按照每32个一组来分的
  14. // 这里利用这个特性,将每组的32个gpio叫做一个"port",每个gpio在每组中的索引叫"pin"
  15. // port = gpio / 32
  16. // pin = gpio % 32
  17. // 例如GPIO50,port=1,pin=18
  18. #define GPIO_GET_PORT(gpio) ((gpio) / 32)
  19. #define GPIO_GET_PIN(gpio) ((gpio) % 32)
  20. // gpio的工作模式--输入、输出
  21. typedef enum{
  22. gpio_mode_output = 0, // 输出
  23. gpio_mode_input = 1 // 输入
  24. }gpio_mode_t;
  25. // gpio高低电平值
  26. typedef enum{
  27. gpio_level_low = 0, // 低电平
  28. gpio_level_high = 1 // 高电平
  29. }gpio_level_t;
  30. typedef enum {
  31. // 上升沿触发
  32. IRQ_TYPE_EDGE_RISING = 0x00000001,
  33. // 下降沿触发
  34. IRQ_TYPE_EDGE_FALLING = 0x00000002,
  35. IRQ_TYPE_EDGE_BOTH = (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING),
  36. // 高电平触发
  37. IRQ_TYPE_LEVEL_HIGH = 0x00000004,
  38. // 低电平触发
  39. IRQ_TYPE_LEVEL_LOW = 0x00000008,
  40. IRQ_TYPE_LEVEL_MASK = (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH),
  41. }gpio_irq_type_t;
  42. /*
  43. * 获取指定gpio的CFG寄存器
  44. * @gpio gpio编号
  45. * @ret CFG寄存器
  46. */
  47. volatile unsigned int *gpio_get_cfg_reg(unsigned int gpio);
  48. /*
  49. * gpio初始化
  50. * @gpio gpio引脚,取值范围[0, 127]
  51. * @mode gpio的工作模式(输入、输出)
  52. *
  53. * 例: 将gpio50初始化为输出
  54. * gpio_init(50, gpio_mode_output);
  55. */
  56. void gpio_init(unsigned int gpio, gpio_mode_t mode);
  57. /*
  58. * 在指定gpio输出高电平或低电平
  59. * @gpio gpio引脚,取值范围[0, 127]
  60. * @level 电平值
  61. *
  62. * 例: 在gpio50上输出低电平
  63. * gpio_set(50, gpio_level_low);
  64. */
  65. void gpio_set(unsigned int gpio, gpio_level_t level);
  66. /*
  67. * 读取指定gpio引脚的值
  68. * @gpio gpio引脚,取值范围[0,127]
  69. *
  70. * 例: 读取gpio50引脚上的值
  71. * gpio_level_t level;
  72. * level = gpio_get(50);
  73. */
  74. unsigned int gpio_get(unsigned int gpio);
  75. /**
  76. * 设置中断类型
  77. * @gpio gpio引脚
  78. * @type 触发中断的条件。高电平触发、低电平触发、上升沿触发 or 下降沿触发
  79. */
  80. void gpio_set_irq_type(unsigned int gpio, gpio_irq_type_t type);
  81. #endif