linux写一个字符设备驱动程序
时间: 2023-11-28 15:04:41 浏览: 151
好的,下面是一个简单的字符设备驱动程序的示例代码:
```c
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#define DEVICE_NAME "my_char_dev"
#define BUFFER_SIZE 1024
static int major;
static char buffer[BUFFER_SIZE];
static ssize_t my_char_dev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos)
{
ssize_t retval = 0;
if (*f_pos >= BUFFER_SIZE) {
goto out;
}
if (*f_pos + count > BUFFER_SIZE) {
count = BUFFER_SIZE - *f_pos;
}
if (copy_to_user(buf, buffer + *f_pos, count)) {
retval = -EFAULT;
goto out;
}
*f_pos += count;
retval = count;
out:
return retval;
}
static ssize_t my_char_dev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos)
{
ssize_t retval = 0;
if (*f_pos >= BUFFER_SIZE) {
goto out;
}
if (*f_pos + count > BUFFER_SIZE) {
count = BUFFER_SIZE - *f_pos;
}
if (copy_from_user(buffer + *f_pos, buf, count)) {
retval = -EFAULT;
goto out;
}
*f_pos += count;
retval = count;
out:
return retval;
}
static struct file_operations my_char_dev_fops = {
.owner = THIS_MODULE,
.read = my_char_dev_read,
.write = my_char_dev_write,
};
static int __init my_char_dev_init(void)
{
int retval;
memset(buffer, 0, BUFFER_SIZE);
major = register_chrdev(0, DEVICE_NAME, &my_char_dev_fops);
if (major < 0) {
printk(KERN_ERR "Failed to register char device.\n");
return major;
}
printk(KERN_INFO "Registered char device with major number %d.\n", major);
return 0;
}
static void __exit my_char_dev_exit(void)
{
unregister_chrdev(major, DEVICE_NAME);
printk(KERN_INFO "Unregistered char device with major number %d.\n", major);
}
module_init(my_char_dev_init);
module_exit(my_char_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your name");
MODULE_DESCRIPTION("A simple character device driver.");
```
这个驱动程序只是一个非常简单的示例,它创建了一个名为 "my_char_dev" 的字符设备,具有读和写功能。当应用程序读取设备时,它从缓冲区中读取数据,并将其复制到应用程序的缓冲区中。当应用程序写入设备时,它将数据从应用程序的缓冲区中复制到驱动程序的缓冲区中。
当你编译并加载这个模块后,在终端中执行命令:
```
$ sudo mknod /dev/my_char_dev c <major number> 0
```
其中,`<major number>` 是上面注册的字符设备的主设备号。
然后,你就可以像操作一个普通的文件一样进行读写操作了,例如:
```
$ echo "Hello, world!" > /dev/my_char_dev
$ cat /dev/my_char_dev
Hello, world!
```
当然,这个示例只是一个非常简单的驱动程序,实际的驱动程序可能涉及到更复杂的操作,例如设备的初始化,中断处理等等。
阅读全文