gpio简单使用

1.0 struct gpio_chip

struct gpio_chip代表一个gpio控制器。用一个全局数组保存所有的gpio控制器。

 90 struct gpio_chip {
 91 >---const char>->---*label;
 92 >---struct device>-->---*dev;
 93 >---struct device>-->---*cdev;
 94 >---struct module>-->---*owner;
 95 >---struct list_head        list;
 96 
 97 >---int>>--->---(*request)(struct gpio_chip *chip,
 98 >--->--->--->--->--->---unsigned offset);//请求gpio
 99 >---void>--->--->---(*free)(struct gpio_chip *chip,
100 >--->--->--->--->--->---unsigned offset);//释放
101 >---int>>--->---(*get_direction)(struct gpio_chip *chip,
102 >--->--->--->--->--->---unsigned offset);
103 >---int>>--->---(*direction_input)(struct gpio_chip *chip,
104 >--->--->--->--->--->---unsigned offset);//配置gpio为输入
105 >---int>>--->---(*direction_output)(struct gpio_chip *chip,
106 >--->--->--->--->--->---unsigned offset, int value);//配置gpio为输出,设置为value
107 >---int>>--->---(*get)(struct gpio_chip *chip,
108 >--->--->--->--->--->---unsigned offset);
109 >---void>--->--->---(*set)(struct gpio_chip *chip,
110 >--->--->--->--->--->---unsigned offset, int value);//设置gpio为value
111 >---void>--->--->---(*set_multiple)(struct gpio_chip *chip,
112 >--->--->--->--->--->---unsigned long *mask,
113 >--->--->--->--->--->---unsigned long *bits);
114 >---int>>--->---(*set_debounce)(struct gpio_chip *chip,
115 >--->--->--->--->--->---unsigned offset,
116 >--->--->--->--->--->---unsigned debounce);
117 
118 >---int>>--->---(*to_irq)(struct gpio_chip *chip,
119 >--->--->--->--->--->---unsigned offset);//gpio转为中断号
120 
121 >---void>--->--->---(*dbg_show)(struct seq_file *s,
122 >--->--->--->--->--->---struct gpio_chip *chip);
123 >---int>>--->---base;//这个gpio控制器的gpio开始编号
124 >---u16>>--->---ngpio;//控制的gpio数
125 >---struct gpio_desc>---*desc;//gpio descriptor数组
126 >---const char>->---*const *names;
127 >---bool>--->--->---can_sleep;
128 >---bool>--->--->---irq_not_threaded;
...
}

1.1 struct gpio_desc

//表示一个gpio口,含对应的gpio_chip.
//对于每一个gpio,都有一个gpio描述符,这个描述符包含了这个gpio所属的控制器即chip和一些标志,label等。

 86 struct gpio_desc {
 87 >---struct gpio_chip>---*chip;//所属gpio控制器
 88 >---unsigned long>-->---flags;
 89 /* flag symbols are bit numbers */
 90 #define FLAG_REQUESTED>-0
 91 #define FLAG_IS_OUT>1
 92 #define FLAG_EXPORT>2>--/* protected by sysfs_lock */
 93 #define FLAG_SYSFS>-3>--/* exported via /sys/class/gpio/control */
 94 #define FLAG_ACTIVE_LOW>6>--/* value has active low */
 95 #define FLAG_OPEN_DRAIN>7>--/* Gpio is open drain type */
 96 #define FLAG_OPEN_SOURCE 8>-/* Gpio is open source type */
 97 #define FLAG_USED_AS_IRQ 9>-/* GPIO is connected to an IRQ */
 98 #define FLAG_IS_HOGGED>-11>-/* GPIO is hogged */
 99 
100 >---/* Connection label */
101 >---const char>->---*label;
102 >---/* Name of the GPIO */
103 >---const char>->---*name;
104 };

由gpio号获得gpio_desc

  68 struct gpio_desc *gpio_to_desc(unsigned gpio)
  69 {
  70 >---struct gpio_chip *chip;
  71 >---unsigned long flags;
  72 
  73 >---spin_lock_irqsave(&gpio_lock, flags);
  74 
  75 >---list_for_each_entry(chip, &gpio_chips, list) {
  76 >--->---if (chip->base <= gpio && chip->base + chip->ngpio > gpio) {
  77 >--->--->---spin_unlock_irqrestore(&gpio_lock, flags);
  78 >--->--->---return &chip->desc[gpio - chip->base];
  79 >--->---}
  80 >---} 
  81 
  82 >---spin_unlock_irqrestore(&gpio_lock, flags);
  83 
  84 >---if (!gpio_is_valid(gpio))
  85 >--->---WARN(1, "invalid GPIO %d\n", gpio);
  86 
  87 >---return NULL; 
  88 }

int of_get_named_gpio(struct device_node *np, const char *propname, int index)

 of_get_named_gpio() - Get a GPIO number to use with GPIO API

@np:>>---device node to get GPIO from
@propname:>--Name of property containing gpio specifier(s)

@index:>-index of the GPIO


bool gpio_is_valid(int number)//检查gpio号


int devm_gpio_request(struct device *dev, unsigned gpio, const char *label)

devm_gpio_request - request a GPIO for a managed device

@dev: device to request the GPIO for

@gpio: GPIO to allocate

@label: the name of the requested GPIO


//gpio配置为输出,并初始化为value

int gpio_direction_output(unsigned gpio, int value)

void gpio_set_value(unsigned gpio, int value)//gpio配置为输出时可用


int gpio_direction_input(unsigned gpio)//gpio配置为输入

int gpio_get_value(unsigned gpio)

猜你喜欢

转载自blog.csdn.net/chm880910/article/details/80222204