这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就涉及到具体的目标板,博主在这里使用的开发板是开源平台beagle bone green,内核版本为4.14.
今天我们来讲解gpio的设备驱动程序。
gpio相关的库函数
为了linux的可移植性和统一,linux提供一套函数库供用户使用,内容涵盖了GPIO/I2C/SPI等外设的控制,关于函数库可以参考官方网站
这一章我们需要用到gpio相关的库函数:
//检查gpio number是否合法
int gpio_to_irq(unsigned gpio)
//根据gpio number申请gpio资源,label为gpio名称
int gpio_request(unsigned gpio, const char *label)
//释放gpio 资源
void gpio_free(unsigned gpio)
//设置gpio 为输入
int gpio_direction_input(unsigned gpio)
//设置gpio 为输出
int gpio_direction_output(unsigned gpio, int value)
//设置gpio的值
gpio_set_value(unsigned gpio, int value)
//设置gpio的消抖时间,主要用于按键消抖
int gpio_set_debounce(unsigned gpio, unsigned debounce)
//获取gpio对应的中断线路
int gpio_to_irq(unsigned gpio)
//gpio中断,当产生中断时调用handle函数
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char * name, void * dev)
linux gpio设备驱动程序
在前面的章节我们知道了怎么写一个字符设备驱动程序的框架,现在我们就只需要往框架里面添加相应的处理代码就可以了。
现在尝试实现这样的需求:
- 在beagle bone green开发板上的gpio上连接一个指示灯
- 当用户打开/dev目录下的设备文件时,完成对gpio的初始化
- 往文件中写入OPEN实现打开灯,往文件中写入CLOSE关闭灯
- 关闭设备文件时,释放gpio资源
下面就是我们实现的代码,gpio_led_control.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/string.h>
MODULE_AUTHOR("Downey");
MODULE_LICENSE("GPL");
static int majorNumber = 0;
/*Class 名称,对应/sys/class/下的目录名称*/
static const char *CLASS_NAME = "led_control_class";
/*Device 名称,对应/dev下的目录名称*/
static const char *DEVICE_NAME = "led_control_demo";
static int led_control_open(struct inode *node, struct file *file);
static ssize_t led_control_read(struct file *file,char *buf, size_t len,loff_t *offset);
static ssize_t led_control_write(struct file *file,const char *buf,size_t len,loff_t* offset);
static int led_control_release(struct inode *node,struct file *file);
#define LED_