Download presentation
Presentation is loading. Please wait.
1
如何生成设备节点 广州创龙电子科技有限公司
Guangzhou Tronlong Electronic Technology Co., Ltd
2
01 设备节点的生成 02 应用程序的编写 03 使用cat和echo操作设备节点
3
01 设备节点的生成 第 1 部分
4
设备节点的生成 编程步骤: 分别定义一个class和device的结构体。 填充file_operations结构体。
调用register_chrdev()注册字符设备。 调用class_create()在/sys/class/目录下注册一个类。 调用device_create()在/dev/目录下创建一个设备节点。 static struct class *my_dev_class; static struct device *my_dev_class_dev; 04 广州创龙电子科技有限公司
5
设备节点的生成 file_operations :
static struct file_operations my_dev_fops = { .owner = THIS_MODULE, .open = my_dev_open, .write = my_dev_write, .read = my_dev_read, }; 05 广州创龙电子科技有限公司
6
设备节点的生成 int (*open) (struct inode *inode, struct file *file)
在操作设备前先要调用open函数打开文件,在该函数里可以的初始化设备操作。打开成功时open返回0。如果不实现该函数,驱动会默认设备的打开永远成功。 int (*release) (struct inode *, struct file *); 当设备文件被关闭时,内核会调用该函数。可以不实现该函数,函数默认为NULL,关闭设备永远成功。 06 广州创龙电子科技有限公司
7
设备节点的生成 ssize_t (*read) (struct file *file, char __user *buf, size_t count, loff_t *offset) *file 文件的描述符 *buf 用户空间中的缓存的指针 count 请求传输的数据的大小 *offset 用户正在存取的文件位置 07 广州创龙电子科技有限公司
8
设备节点的生成 ssize_t (*write) (struct file *file, const char __user *buf, size_t count, loff_t *offset) *file 文件的描述符 *buf 用户空间中的缓存的指针 count 请求传输的数据的大小 *offset 用户正在存取的文件位置 08 广州创龙电子科技有限公司
9
02 应用程序的编写 第 2 部分
10
应用程序的编写 ssize_t write (int fd, const void *buf, size_t count)
把参数buf所指的内存写入count个字节到参数fd所指的文件内。 ssize_t read(int fd, void *buf, size_t count); 把参数fd所指的文件传送count个字节到buf指针所指的内存中。 arm-linux-gnueabihf-gcc rw_test.c -o rw_test 10 广州创龙电子科技有限公司
11
03 使用cat和echo操作设备节点 第 3 部分
12
使用cat和echo操作设备节点 12 广州创龙电子科技有限公司
static ssize_t my_dev_read(struct file *file, char __user *buf, size_t count, loff_t *offset) { int ret; char temp[16]; char status; if (*offset > 0) return 0; count = sprintf(temp, "%u\n", val); ret = copy_to_user(buf, temp, count + 1); if(ret < 0) printk("ret = %d \n",ret); status = -EFAULT; } else { *offset += count; //如果缺少这句,执行cat时会一直返回读取到的值,停不下来 status = count; return status; static ssize_t my_dev_write(struct file *file, const char __user *buf, size_t count, loff_t *offset) char status = 0; memset(temp, 0, 16); ret = copy_from_user(temp, buf, count); /* get value from user */ goto err; val = simple_strtoul(temp, NULL, 0); if (!status) status = count; //如果不加上这个,使用echo写入值是会一直不停地写,按ctrl+c也挺不下来。 err: 12 广州创龙电子科技有限公司
13
广州创龙电子科技有限公司 谢谢 官网: 论坛: 微信公众号:广州创龙
Similar presentations