Linux设备驱动之字符设备(三)
2016-07-13 17:28
597 查看
在Linux设备驱动之字符设备(一)中学习了设备号的构成,设备号的申请与释放。在Linux设备驱动之字符设备(二)中学习了如何创建一个字符设备,初始化,已经注册到系统中和最后释放该字符设备。
本节将结合前两节学到的知道,编写一个简单的字符设备驱动。最后总结一下字符设备驱动的模型。
可以看到系统给分配的主设备号为237,所以下一步就是根据主设备号创建设备节点。
测试结果如下:
可以看到是进入了open函数和read函数。
本节将结合前两节学到的知道,编写一个简单的字符设备驱动。最后总结一下字符设备驱动的模型。
字符设备驱动程序源码
#include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #include <linux/cdev.h> static int major = 0; static dev_t ndev; //static struct cdev char_dev; //静态分配 static struct cdev* char_dev; //动态分配 static ssize_t char_read(struct file *file, char __user *buf, size_t size, loff_t *offset) { printk(KERN_EMERG "char_dev: char_read!\n"); return 0; } static int char_open(struct inode *node, struct file *filp) { printk(KERN_EMERG "char_dev: char_open!\n"); return 0; } //文件操作函数集 static struct file_operations char_ops={ .owner = THIS_MODULE, .open = char_open, .read = char_read, }; static int char_dev_init(void) { int ret; //主设备号存在 if(major) { ret = register_chrdev_region(MKDEV(major, 0), 1, "char_dev"); if(ret < 0) { printk(KERN_EMERG "char_dev: register chardev error!\n"); return ret; } } else//主设备号不存在,动态分配 { ret = alloc_chrdev_region(&ndev,0,1,"char_dev"); if(ret < 0) { printk(KERN_EMERG "char_dev: alloc chardev error!\n"); return ret; } } char_dev = cdev_alloc();//动态分配cdev if(char_dev) { char_dev->ops = &char_ops;//设置文件操作集 } //cdev_init(&char_dev, &char_ops);//初始化cdev,以及设置操作函数集 cdev_add(char_dev, ndev, 1); return 0; } static void char_dev_exit(void) { cdev_del(char_dev);//注销cdev unregister_chrdev_region(ndev, 1); } module_init(char_dev_init); module_exit(char_dev_exit); MODULE_LICENSE("GPL"); 注: 注释掉的是静态分配cdev过程
安装模块
insmod demo_char_dev.ko查看安装后结果
cat /prco/devices root@test_home:/data # cat /proc/devices Character devices: .... 189 usb_device 237 char_dev 238 audio_dsp_mem
可以看到系统给分配的主设备号为237,所以下一步就是根据主设备号创建设备节点。
创建设备节点
root@test_home:/data # mknod /dev/mychardev c 237 0 root@test_home:/data # ls /dev/mychardev /dev/mychardev
编写应用程序测试
#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { int fd; int buf; fd = open("/dev/mychardev", O_RDWR); if(fd == -1) { printf("open device faild!\n"); return -1; } read(fd, &buf, 1); close(fd); return 0; }
测试结果如下:
root@test_home:/data # ./chardev_test root@test_home:/data # dmesg | grep char_dev [ 9921.636518] c7 char_dev: char_open! [ 9921.639924] c7 char_dev: char_read!
可以看到是进入了open函数和read函数。
字符设备驱动模型
相关文章推荐
- Linux socket 初步
- Linux Kernel 4.0 RC5 发布!
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- Linux 下无损图片压缩小工具介绍