写一个按键的linux驱动代码
时间: 2023-12-01 20:52:49 浏览: 26
以下是一个简单的按键 Linux 驱动代码示例:
```c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/cdev.h>
#include <linux/uaccess.h>
#include <linux/gpio.h>
#define DEVICE_NAME "mykey" // 设备名称
#define MYKEY_GPIO 18 // GPIO 引脚号
static dev_t devno; // 设备号
static struct cdev mykey_cdev; // 字符设备结构体
static int mykey_open(struct inode *inode, struct file *file)
{
printk(KERN_INFO "mykey: Device opened successfully\n");
return 0;
}
static ssize_t mykey_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos)
{
int value = gpio_get_value(MYKEY_GPIO); // 读取按键值
if (value) {
printk(KERN_INFO "mykey: Key pressed\n");
} else {
printk(KERN_INFO "mykey: Key released\n");
}
return 0;
}
static struct file_operations mykey_fops = {
.owner = THIS_MODULE,
.open = mykey_open,
.read = mykey_read,
};
static int __init mykey_init(void)
{
int ret;
// 动态分配设备号
ret = alloc_chrdev_region(&devno, 0, 1, DEVICE_NAME);
if (ret < 0) {
printk(KERN_ERR "mykey: Failed to allocate device number\n");
return ret;
}
// 初始化字符设备结构体
cdev_init(&mykey_cdev, &mykey_fops);
mykey_cdev.owner = THIS_MODULE;
// 注册字符设备
ret = cdev_add(&mykey_cdev, devno, 1);
if (ret < 0) {
printk(KERN_ERR "mykey: Failed to register device\n");
goto err_cdev_add;
}
// 配置 GPIO 引脚
ret = gpio_request(MYKEY_GPIO, "mykey_gpio");
if (ret < 0) {
printk(KERN_ERR "mykey: Failed to request GPIO %d\n", MYKEY_GPIO);
goto err_gpio_request;
}
ret = gpio_direction_input(MYKEY_GPIO);
if (ret < 0) {
printk(KERN_ERR "mykey: Failed to set direction for GPIO %d\n", MYKEY_GPIO);
goto err_gpio_direction_input;
}
printk(KERN_INFO "mykey: Module loaded successfully\n");
return 0;
err_gpio_direction_input:
gpio_free(MYKEY_GPIO);
err_gpio_request:
cdev_del(&mykey_cdev);
err_cdev_add:
unregister_chrdev_region(devno, 1);
return ret;
}
static void __exit mykey_exit(void)
{
// 取消 GPIO 引脚配置
gpio_free(MYKEY_GPIO);
// 注销字符设备
cdev_del(&mykey_cdev);
unregister_chrdev_region(devno, 1);
printk(KERN_INFO "mykey: Module unloaded successfully\n");
}
module_init(mykey_init);
module_exit(mykey_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Linux driver for a key connected to a GPIO pin");
```
这个驱动程序注册了一个名为 `mykey` 的字符设备,每当按键按下或松开时,`read` 函数就会被调用,打印相应的消息。驱动程序使用 GPIO 18 作为按键输入引脚。在初始化过程中,它动态分配了一个设备号,并将字符设备结构体添加到内核中。同时,它还配置了 GPIO 引脚来读取按键输入。在卸载过程中,驱动程序释放了 GPIO 引脚并注销了字符设备。