linux 读取gpio口的驱动代码示例
时间: 2023-10-27 17:35:44 浏览: 81
linux驱动示例代码
4星 · 用户满意度95%
以下是一个读取GPIO口的驱动代码示例:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
MODULE_LICENSE("GPL");
#define GPIO_PIN 17 // GPIO口的编号
#define GPIO_DESC "My GPIO Device" // GPIO设备的描述
#define IRQ_NUM IRQ_EINT17 // 中断号
#define IRQ_NAME "my_gpio_irq" // 中断的名称
static irqreturn_t my_gpio_irq_handler(int irq, void *dev_id)
{
printk(KERN_INFO "GPIO Interrupt!\n");
return IRQ_HANDLED;
}
static int __init my_gpio_init(void)
{
int ret;
// 配置GPIO口
ret = gpio_request(GPIO_PIN, GPIO_DESC);
if (ret < 0) {
printk(KERN_ERR "Failed to request GPIO %d\n", GPIO_PIN);
return ret;
}
ret = gpio_direction_input(GPIO_PIN);
if (ret < 0) {
printk(KERN_ERR "Failed to set direction for GPIO %d\n", GPIO_PIN);
gpio_free(GPIO_PIN);
return ret;
}
// 配置中断
ret = request_irq(IRQ_NUM, my_gpio_irq_handler, IRQF_TRIGGER_RISING, IRQ_NAME, NULL);
if (ret < 0) {
printk(KERN_ERR "Failed to request IRQ %d\n", IRQ_NUM);
gpio_free(GPIO_PIN);
return ret;
}
printk(KERN_INFO "My GPIO device initialized\n");
return 0;
}
static void __exit my_gpio_exit(void)
{
// 释放中断
free_irq(IRQ_NUM, NULL);
// 释放GPIO口
gpio_free(GPIO_PIN);
printk(KERN_INFO "My GPIO device exited\n");
}
module_init(my_gpio_init);
module_exit(my_gpio_exit);
上述代码首先定义了GPIO口的编号、GPIO设备的描述、中断号和中断的名称。然后,在my_gpio_init函数中首先配置GPIO口,然后配置中断,并且在中断处理函数中打印一条信息。最后,在my_gpio_exit函数中释放GPIO口和中断。
阅读全文