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>,例如:
- $ 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如下所示:
- struct gpio_chip {
- const char *label; // 该文件的描述信息
- struct device *dev;
- struct module *owner;
- int (*request)(struct gpio_chip *chip, unsigned offset);
- void (*free)(struct gpio_chip *chip, unsigned offset);
- int (*direction_input)(struct gpio_chip *chip, unsigned offset);
- int (*get)(struct gpio_chip *chip, unsigned offset);
- int (*direction_output)(struct gpio_chip *chip,
- unsigned offset, int value);
- int (*set_debounce)(struct gpio_chip *chip,
- unsigned offset, unsigned debounce);
- void (*set)(struct gpio_chip *chip, unsigned offset, int value);
- int (*to_irq)(struct gpio_chip *chip, unsigned offset);
- void (*dbg_show)(struct seq_file *s, struct gpio_chip *chip);
- int base; // 表示首个个GPIO从此数字开始
- u16 ngpio; // 表示GPIO的个数
- const char *const *names; // 表示其名称
- unsigned can_sleep:1;
- unsigned exported:1;
- };
gpio_chip用于构建sys文件系统gpiochip<N>当中的每一个目录,也是在构建具体的GPIO驱动时的实现单元。
提示:各个gpio_chip实现的GPIO不应当重复。
完成一个GPIO芯片的注册和注销功能的函数如下所示:
- extern int gpiochip_add(struct gpio_chip *chip);
- extern int __must_check gpiochip_remove(struct gpio_chip *chip);
若干个函数用于控制GPIO,如下所示:
- extern int gpio_request(unsigned gpio, const char *label);
- extern void gpio_free(unsigned gpio);
- extern int gpio_direction_input(unsigned gpio);
- extern int gpio_direction_output(unsigned gpio, int value);
- extern int gpio_set_debounce(unsigned gpio, unsigned debounce);
- extern int gpio_get_value_cansleep(unsigned gpio);
- extern void gpio_set_value_cansleep(unsigned gpio, int value);
gpio_request()等函数实际上是内核的调用接口,可以在各个驱动程序或者板级的支持中调用,完成GPIO的统一控制。
- GPIO驱动框架
- GPIO驱动框架
- GPIO驱动框架
- Linux GPIO驱动 - 驱动框架概述
- linux驱动开发(一)—GPIO驱动框架
- linux驱动开发(一)—GPIO驱动框架
- Linux 内核设备驱动之GPIO驱动之GPIO 框架初始化
- GPIO驱动
- gpio驱动
- dm6441的 gpio驱动
- GPIO驱动初步
- GPIO的驱动注册表
- 转:linux GPIO驱动
- GPIO驱动相关笔记
- linux GPIO驱动
- Linux GPIO驱动
- GPIO驱动相关笔记
- s3c6410 GPIO驱动总结
- Oracle分页
- tortoisegit使用
- Android开发之浅谈框架模式MVC
- oracle语句中把一列的值合并为一个值,用逗号隔开
- Visual Studio中如何添加自己的代码段
- GPIO驱动框架
- R ggmap
- 消灭模板代码,自定义AndroidStudio文件模板(1)
- Codeforces Round #367 (Div. 2)D
- 牛客网 8-11 网络基础 操作系统 编译与体系结构 30题知识点总结
- JAVA学习代码——知识点
- 透明化activity实例
- 牛客网 8-12 网络基础 操作系统 编译与体系结构 30题知识点总结
- Java定时框架Quartz实例详解与定时任务的Mongodb、Mysql持久化实现(三)Quartz持久化