使用register_chrdev注册字符设备
1.2.2 使用register_chrdev注册字符设备
注册字符设备可以使用register_chrdev函数。
- int register_chrdev (unsigned int major, const char *name, struct file_operations*fops);
register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号。
注销字符设备可以使用unregister_chrdev函数。
- int unregister_chrdev(unsigned int major, const char *name);
例1.3 register_chrdev注册字符设备实例
代码见光盘\src\1drivermodel\1-3register_chrdev。核心代码如下所示:
- static unsigned char simple_inc=0;
- static unsigned char demoBuffer[256];
- int simple_open(struct inode *inode, struct file *filp)
- {
- if(simple_inc>0)return -ERESTARTSYS;
- simple_inc++;
- return 0;
- }
- int simple_release(struct inode *inode, struct file *filp)
- {
- simple_inc--;
- return 0;
- }
- ssize_t simple_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos)
- {
- /* 把数据复制到应用程序空间 */
- if (copy_to_user(buf,demoBuffer,count))
- {
- count=-EFAULT;
- }
- return count;
- }
- ssize_t simple_write(struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)
- {
- /* 把数据复制到内核空间 */
- if (copy_from_user(demoBuffer+*f_pos, buf, count))
- {
- count = -EFAULT;
- }
- return count;
- }
- struct file_operations simple_fops = {
- .owner = THIS_MODULE,
- .read = simple_read,
- .write = simple_write,
- .open = simple_open,
- .release = simple_release,
- };
- /*******************************************************
- MODULE ROUTINE
- *******************************************************/
- void simple_cleanup_module(void)
- {
- unregister_chrdev(simple_MAJOR, "simple");
- printk("simple_cleanup_module!\n");
- }
- int simple_init_module(void)
- {
- int ret;
- //根据设备号与设备名注册字符设备
- ret = register_chrdev(simple_MAJOR, "simple", &simple_fops);
- if (ret < 0)
- {
- printk("Unable to register character device %d!\n",simple_MAJOR);
- return ret;
- }
- return 0;
- }
- module_init(simple_init_module);
- module_exit(simple_cleanup_module);
应用程序的代码如下:
- void main(void)
- {
- int fd;
- int i;
- char data[256];
- int retval;
- fd=open("/dev/fgj",O_RDWR);
- if(fd==-1)
- {
- perror("error open\n");
- exit(-1);
- }
- printf("open /dev/fgj successfully\n");
- //写数据
- retval=write(fd,"fgj",3);
- if(retval==-1)
- {
- perror("write error\n");
- exit(-1);
- }
- //读数据
- retval=read(fd,data,3);
- if(retval==-1)
- {
- perror("read error\n");
- exit(-1);
- }
- data[retval]=0;
- printf("read successfully:%s\n",data);
- //关闭设备
- close(fd);
- }
【使用register_chrdev(LED_MAJOR,DEVICE_NAME,&dev_fops)注册字符设备驱动程序时都要手动建立节点 ,否则在应用程序无法打开该设备】
字符设备模块使用insmod加载,加载完毕需要在/dev目录下使用mkmod命令建立相应的文件结点,编译生成的应用层可执行程序为test。本例运行结果如下:
[root@/home]#insmod demo.ko
[root@urbetter /home]# mknod /dev/fgj c
[root@urbetter /home]# ./test
open /dev/fgj successfully
read successfully:fgj
使用register_chrdev注册字符设备的更多相关文章
- register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动
内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1 ...
- 29.使用register_chrdev_region()系列来注册字符设备
1.之前注册字符设备用的如下函数注册字符设备驱动: register_chrdev(unsigned int major, const char *name,const struct file_ope ...
- 002_linux驱动之_register_chrdev注册字符设备
(一)解析:register_chrdev函数和unregister_chrdev函数 (二)register_chrdev函数原型 int register_chrdev(unsigned int ...
- 字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev() (转载)
1. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里.该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static ...
- 字符设备之register_chrdev与register_chrdev_region(转)
之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个fi ...
- liunx驱动之字符设备的注册
上一篇文章学习了如何编写linux驱动,通过能否正常加载模块进行验证是否成功,有做过liunx应用开发的小伙伴都知道驱动会在'/dev'目录下以文件的形式展现出来,所以只是能加载驱动模块不能算是完成驱 ...
- linux 字符设备驱动写法
字符设备,块设备书 一.register_chrdev_region, register_chrdev, misc_register misc device(杂项设备) 在 Linux 内核的incl ...
- Linux学习 :字符设备框架
一.系统功能框架: U-boot : 启动内核 linux kernel: 启动应用 应用: open,read,write 都是通过C库实现,汇编就相当于swi val,引发中断,通过系统调用接口在 ...
- Tiny6410 LED字符设备驱动
1.查看用户手册 led1.led2.led3.led4 连接的分别是 GPK4.GPK5.GPK6.GPK7 2.查询6410芯片手册 下面还需要3个步骤: 1.设置GPIO为OUTPUT. 将GP ...
随机推荐
- 【Codeforces】Codeforces Round #374 (Div. 2) -- C. Journey (DP)
C. Journey time limit per test3 seconds memory limit per test256 megabytes inputstandard input outpu ...
- Spring Boot (13) druid监控
druid druid是和tomcat jdbc一样优秀的连接池,出自阿里巴巴.除了连接池,druid哈hi有一个很实用的监控功能. pom.xml 添加了以下依赖后,会自动用druid连接池替代默认 ...
- SQL SERVER 2000 如何提高大数据筛选GROUP BY 的效率
数据库有83W条记录,本想计算20180101之后的每天赔付情况,故写了以下SQL语句: SELECT 起保时间,sum(赔付金额) as 日赔付 FROM maindata WHERE 起保时间&g ...
- 溢出文本省略号的js实现
function ellipsis(element) { var limitWidth = element.clientWidth; var temp = element.cloneNode(true ...
- selenium菜单操作
连接到前端这个菜单下面的HTML/CSS子菜单 driver.get("https://www.imooc.com"); WebElement login = driver.fin ...
- ROS: Ubuntu16.04安装ROS-kinetic
参考连接:SLAM: Ubuntu14.04_Kylin安装ROS-Indigo第一步: 软件源配置 1. 增加下载源(增加ubuntu版的ros数据仓库,即下载源)(通用指令适合任何版本的ros) ...
- 【技术累积】【点】【java】【18】URLEncode
基础概念 由于以URL的形式传递信息给服务器时,不允许URL中出现一些特殊字符和空格的,所以需要对URL进行编码处理. 原理是: 将要转码的字符转变为16进制: 从右到左,每两位前面加% 哪些字符是需 ...
- Table边框使用总结 ,只显示你要显示的边框
表格的常用属性 基本属性有:width(宽度).height(高度).border(边框值).cellspacing(表格的内宽,即表格与tr之间的间隔). cellpadding(表格内元素的间隔, ...
- Unicode转换为UTF-8过程Demo
碎碎念:这几天在学习Python对Unicode的支持 上学的时候,计算机基础课上总能听到老师讲什么字节,字符,Unicode,UTF-8吧啦吧啦一堆,反正我是只记住了名字,至于具体这些名字所表达的含 ...
- Arrays工具类的使用
1.包: java.util 导包 2.此类包含用来操作数组(比如排序和搜索)的各种方法 特点: 该类中的方法都是静态方法,所以可以直接使用类名.方法名(实参)调用 3.查看成员方法: public ...