linux设备驱动程序——gpio控制

本文详细介绍了如何在Linux下编写GPIO设备驱动程序,包括GPIO库函数的使用、驱动程序框架、LED控制的实现、中断处理以及用户程序的编写。通过实例展示了如何连接LED、查看日志、编译加载驱动模块和用户程序,并提供了GPIO映射到/sys目录的方法。最后,还讲解了GPIO中断的实现和按键控制LED的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一章节开始我们讲解各种外设的控制,包括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_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值