GPIO驱动框架

来源:互联网 发布:网络公司员工培训 编辑:程序博客网 时间:2024/05/29 07:03

GPIO驱动框架和具体驱动

GPIO(General Purpose Input Output )的含义为通用输入/输出。GPIO可以作为端口扩展器。从硬件上说,SOC提供一些独立的引脚,某些用于输入,某些用于输出,利用高低电平表示0或者1。可以通过SOC的寄存器进行读取和控制,也就是输入和输出。

 GPIO驱动框架

如果仅仅针对GPIO硬件构建驱动程序,实现一个字符驱动就可以完成,对用户空间的接口可以是read、write或者自定义的ioctl。内核中却提供了GPIO框架,作为GPIO驱动的统一架构,这样做的好处主要有以下几点:

复用公共代码。

使用sys文件系统作为到用户空间的统一接口,方便操作。

同时提供内核中的API,让内核的其他部分调用。

GPIO驱动的结构如图17-5所示。

GPIO驱动的头文件为:include/linux/gpio.h和include/asm-generic/gpio.h。

GPIO驱动框架的实现代码为:drivers/gpio/gpiolib.c。

GPIO驱动框架不是设备节点,而是sys文件系统,其根目录为:/sys/class/gpio/。

/sys/class/gpio/目录中有一个用于写export的文件,向其中写入一个数字表示建立一个GPIO端口的子目录gpio<N>,例如:
 

  1. $ echo 19 > export 

如下操作将在/sys/class/gpio/目录中建立一个gpio19子目录,这个子目录中就包含针对19号GPIO的操作。

/sys/class/gpio/gpio<N>目录当中包括了以下文件。

direction:可读写,使用"in"和"out"两个值表示输入和输出。

value:可读写,0代表低电平,1(或其他非0)代表高电平。

edge:表示上升沿和下降沿,可以为"none"、"rising"、"falling"。

/sys/class/gpio/gpiochip<N>/目录描述一个GPIO芯片创建信息,其中包括如下几个文件。

base:表示首个个GPIO从此数字开始。

ngpio:表示GPIO的个数。

label:提供诊断信息。

gpio.h头文件中描述GPIO芯片的结构gpio_chip如下所示:
 

  1. struct gpio_chip {  
  2.   const char      *label;             // 该文件的描述信息  
  3.   struct device       *dev;  
  4.   struct module       *owner;  
  5.   int         (*request)(struct gpio_chip *chip, unsigned offset);  
  6.   void            (*free)(struct gpio_chip *chip, unsigned offset);  
  7.   int         (*direction_input)(struct gpio_chip *chip, unsigned offset);  
  8.   int         (*get)(struct gpio_chip *chip, unsigned offset);  
  9.   int         (*direction_output)(struct gpio_chip *chip,  
  10.                       unsigned offset, int value);  
  11.   int         (*set_debounce)(struct gpio_chip *chip,  
  12.                       unsigned offset, unsigned debounce);  
  13.   void            (*set)(struct gpio_chip *chip, unsigned offset, int value);  
  14.   int         (*to_irq)(struct gpio_chip *chip, unsigned offset);  
  15.   void            (*dbg_show)(struct seq_file *s, struct gpio_chip *chip);  
  16.   int         base;              // 表示首个个GPIO从此数字开始  
  17.   u16         ngpio;             // 表示GPIO的个数  
  18.   const char  *const *names;   // 表示其名称  
  19.   unsigned        can_sleep:1;  
  20.   unsigned        exported:1;  
  21. }; 
  22. gpio_chip用于构建sys文件系统gpiochip<N>当中的每一个目录,也是在构建具体的GPIO驱动时的实现单元。

    提示:各个gpio_chip实现的GPIO不应当重复。

    完成一个GPIO芯片的注册和注销功能的函数如下所示:
     

    1. extern int gpiochip_add(struct gpio_chip *chip);  
    2. extern int __must_check gpiochip_remove(struct gpio_chip *chip); 

    若干个函数用于控制GPIO,如下所示:
     

    1. extern int gpio_request(unsigned gpio, const char *label);  
    2. extern void gpio_free(unsigned gpio);  
    3. extern int gpio_direction_input(unsigned gpio);  
    4. extern int gpio_direction_output(unsigned gpio, int value);  
    5. extern int gpio_set_debounce(unsigned gpio, unsigned debounce);  
    6. extern int gpio_get_value_cansleep(unsigned gpio);  
    7. extern void gpio_set_value_cansleep(unsigned gpio, int value); 

    gpio_request()等函数实际上是内核的调用接口,可以在各个驱动程序或者板级的支持中调用,完成GPIO的统一控制。


0 0
原创粉丝点击