linux系统,读取io口信息的驱动代码示例
时间: 2024-05-09 15:21:17 浏览: 111
下面是一个简单的Linux驱动程序,它可以读取GPIO端口的状态:
```c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/fs.h>
#define GPIO_PIN 17
MODULE_LICENSE("GPL");
static irqreturn_t gpio_irq_handler(int irq, void *dev_id)
{
printk(KERN_INFO "GPIO interrupt!\n");
return IRQ_HANDLED;
}
static ssize_t gpio_value_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buf)
{
int value = gpio_get_value(GPIO_PIN);
return sprintf(buf, "%d\n", value);
}
static struct kobj_attribute gpio_value_attribute =
__ATTR(value, 0444, gpio_value_show, NULL);
static struct attribute *gpio_attributes[] = {
&gpio_value_attribute.attr,
NULL,
};
static struct attribute_group gpio_attribute_group = {
.name = "gpio",
.attrs = gpio_attributes,
};
static struct kobject *gpio_kobj;
static int __init gpio_init(void)
{
int result;
if (!gpio_is_valid(GPIO_PIN)) {
printk(KERN_INFO "Invalid GPIO pin number\n");
return -1;
}
result = gpio_request(GPIO_PIN, "gpio-example");
if (result < 0) {
printk(KERN_INFO "GPIO request failed\n");
return result;
}
result = gpio_direction_input(GPIO_PIN);
if (result < 0) {
printk(KERN_INFO "GPIO direction set failed\n");
gpio_free(GPIO_PIN);
return result;
}
result = gpio_to_irq(GPIO_PIN);
if (result < 0) {
printk(KERN_INFO "GPIO to IRQ conversion failed\n");
gpio_free(GPIO_PIN);
return result;
}
result = request_irq(result, gpio_irq_handler, IRQF_TRIGGER_RISING,
"gpio-example", NULL);
if (result < 0) {
printk(KERN_INFO "IRQ request failed\n");
gpio_free(GPIO_PIN);
return result;
}
gpio_kobj = kobject_create_and_add("gpio-example", kernel_kobj);
if (!gpio_kobj) {
printk(KERN_INFO "Failed to create sysfs object\n");
free_irq(gpio_to_irq(GPIO_PIN), NULL);
gpio_free(GPIO_PIN);
return -ENOMEM;
}
result = sysfs_create_group(gpio_kobj, &gpio_attribute_group);
if (result < 0) {
printk(KERN_INFO "Failed to create sysfs group\n");
kobject_put(gpio_kobj);
free_irq(gpio_to_irq(GPIO_PIN), NULL);
gpio_free(GPIO_PIN);
return result;
}
printk(KERN_INFO "GPIO driver loaded\n");
return 0;
}
static void __exit gpio_exit(void)
{
sysfs_remove_group(gpio_kobj, &gpio_attribute_group);
kobject_put(gpio_kobj);
free_irq(gpio_to_irq(GPIO_PIN), NULL);
gpio_free(GPIO_PIN);
printk(KERN_INFO "GPIO driver unloaded\n");
}
module_init(gpio_init);
module_exit(gpio_exit);
```
这个驱动程序使用sysfs文件系统来公开GPIO端口的状态。它创建了一个名为“gpio”的sysfs组,其中包含一个名为“value”的sysfs属性,该属性可以读取GPIO端口的状态。当GPIO端口状态发生变化时,驱动程序将触发一个中断处理程序并打印一条消息。
阅读全文