使用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);
- }
字符设备模块使用insmod加载,加载完毕需要在/dev目录下使用mkmod命令建立相应的文件结点,编译生成的应用层可执行程序为test。本例运行结果如下:
- [root@/home]#insmod demo.ko
- [root@urbetter /home]# mknod /dev/fgj c 224 0
- [root@urbetter /home]# ./test
- open /dev/fgj successfully
- read successfully:fgj
使用register_chrdev注册字符设备相关推荐
- 使用cdev_add注册字符设备
在前面已经提到设备号有主设备号和次设备号,其中主设备号表示设备类 型,对应于确定的驱动程序,具备相同主设备号的设备之间共用同一个驱动程 序,而用次设备号来标识具体物理设备.因此在创建字符设备之前,必须 ...
- 虚拟字符设备驱动开发步骤
目录 前言 字符设备驱动简介 内核驱动操作函数集合(file_operations结构体) 字符设备驱动开发步骤 .ko驱动模块的加载和卸载(module_init驱动入口.insmod驱动加载) 字 ...
- Linux驱动开发(一):字符设备
目的:实现最简单的点灯操作. Linux一切皆文件,应用程序访问某个物理设备(文件)时,首先通过open, read, write等库函数调用系统调用接口(System call interface) ...
- 【正点原子MP157连载】第二十章 字符设备驱动开发-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 02_字符设备驱动开发
目录 1 字符设备驱动简介 2 字符设备驱动开发步骤 2.1 驱动模块的加载和卸载 2.2 字符设备注册与注销 2.3 实现设备的具体操作函数 2.4 添加 LICENSE 和作者信息 3 Linux ...
- 字符设备之register_chrdev与register_chrdev_region
之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个fi ...
- Linux驱动编程 step-by-step (四) 字符设备的注册与设备节点的自动创建
字符设备的注册与设备节点的自动创建 cdev 结构 内核内部使用struct cdev<linux/cdev.h>来表示一个字符设备 struct cdev { struct ko ...
- 浅谈linux字符设备注册
Linux中有两种字符设备注册的方法: 这里所提到的函数在文件:fs/char_dev.c中定义,在头文件include/linux/cdev.h中声明. 一. 老方法: 如果 ...
- cdev 结构体与字符设备的注册
在 linux 2.6内核中,使用 cdev结构体描述字符设备,cdev 的定义在 <linux/cdev.h> 中可找到,其定义如下: 引用 struct cdev { ...
最新文章
- 收藏 | YOLO系列综述:从V1到V4
- pip经常的使用技巧
- httpinvoker远程调用超时_RPC远程过程调用协议工作原理分析
- Tensorflow中文文档
- 【转载】SDRAM时钟相移估算
- 《对不队》团队项目用户验收评审
- 工作228:小程序学习2开始布局页面2
- Windows Phone 7 LongListSelector控件实现分类列表和字母索引
- JavaScript开发中几个常用知识点总结
- WEB-INF下jsp页面如何访问
- @echo off是什么意思_高街、BF、FOG、OS风。。。都是些什么鬼?
- RhinoMock异常ExpectationViolationException以及解决
- 【OpenCV】视频输入与相似度测量
- 搞AI的产品经理该怎么写PRD?谷歌的导师教你
- 纯CSS3实现动态火车行驶特效
- 解决NetworkOnMainThreadException
- lua table的__index ,setmetable()的一些操作
- 微信购物商城系统怎样吸引住客户,来转换为商城系统的粉丝?
- 寻路系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- compute的c语言用法,词汇精选:compute的用法和辨析
热门文章
- boost::mp11::mp_replace_if相关用法的测试程序
- boost::geometry::strategy::andoyer用法的测试程序
- boost::container实现显式实例静态向量测试程序
- boost::container模块实现分配器特征的测试程序
- Boost:不受约束的集合bimap的测试程序
- Boost:双图bimap与property地图的测试程序
- Boost:双图bimap与散列索引的测试程序
- VTK:PolyData之CellEdgeNeighbors
- VTK:图片之FillWindow
- OpenCV使用VideoCapture和VideoWriter的实例(附完整代码)