当前位置: 首页 > news >正文

使用register_chrdev注册字符设备

1.2.2  使用register_chrdev注册字符设备

注册字符设备可以使用register_chrdev函数。

  1. int register_chrdev (unsigned int major, const  char *name, struct file_operations*fops); 

register_chrdev函数的major参数如果等于0,则表示采用系统动态分配的主设备号。

注销字符设备可以使用unregister_chrdev函数。

  1. int unregister_chrdev(unsigned int major, const char *name); 

例1.3  register_chrdev注册字符设备实例

代码见光盘\src\1drivermodel\1-3register_chrdev。核心代码如下所示:

  1. static unsigned char simple_inc=0;  
  2. static unsigned char demoBuffer[256];  
  3. int simple_open(struct inode *inode, struct file *filp)  
  4. {  
  5.     if(simple_inc>0)return -ERESTARTSYS;  
  6.     simple_inc++;  
  7.     return 0;  
  8. }  
  9. int simple_release(struct inode *inode, struct file *filp)  
  10. {  
  11.     simple_inc--;  
  12.     return 0;  
  13. }  
  14. ssize_t simple_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos)  
  15. {  
  16.     /* 把数据复制到应用程序空间 */  
  17.     if (copy_to_user(buf,demoBuffer,count))  
  18.     {  
  19.        count=-EFAULT;   
  20.     }  
  21.     return count;  
  22. }  
  23. ssize_t simple_write(struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)  
  24. {  
  25.     /* 把数据复制到内核空间 */  
  26.     if (copy_from_user(demoBuffer+*f_pos, buf, count))  
  27.     {  
  28.         count = -EFAULT;  
  29.     }  
  30.     return count;  
  31. }  
  32. struct file_operations simple_fops = {  
  33.     .owner =    THIS_MODULE,  
  34.     .read =     simple_read,  
  35.     .write =    simple_write,  
  36.     .open =     simple_open,  
  37.     .release =  simple_release,  
  38. };  
  39. /*******************************************************  
  40.                 MODULE ROUTINE  
  41. *******************************************************/  
  42. void simple_cleanup_module(void)  
  43. {  
  44.     unregister_chrdev(simple_MAJOR,  "simple");   
  45.     printk("simple_cleanup_module!\n");  
  46. }  
  47. int simple_init_module(void)  
  48. {  
  49.     int ret;  
  50.     //根据设备号与设备名注册字符设备  
  51.     ret = register_chrdev(simple_MAJOR, "simple", &simple_fops);   
  52.     if (ret 0)  
  53.     {  
  54.         printk("Unable to register character device %d!\n",simple_MAJOR);  
  55.         return ret;  
  56.     }  
  57.     return 0;  
  58. }  
  59. module_init(simple_init_module);  
  60. module_exit(simple_cleanup_module);  

 

应用程序的代码如下:

  1. void main(void)  
  2. {  
  3.     int fd;  
  4.     int i;  
  5.     char data[256];  
  6.     int retval;  
  7.     fd=open("/dev/fgj",O_RDWR);  
  8.     if(fd==-1)  
  9.     {  
  10.         perror("error open\n");  
  11.         exit(-1);  
  12.     }  
  13.     printf("open /dev/fgj successfully\n");  
  14.     //写数据  
  15.     retval=write(fd,"fgj",3);  
  16.     if(retval==-1)  
  17.     {  
  18.         perror("write error\n");  
  19.         exit(-1);  
  20.     }  
  21.     //读数据  
  22.     retval=read(fd,data,3);  
  23.     if(retval==-1)  
  24.     {  
  25.         perror("read error\n");  
  26.         exit(-1);  
  27.     }  
  28.     data[retval]=0;  
  29.     printf("read successfully:%s\n",data);  
  30.     //关闭设备  
  31.     close(fd);  
  32. }  

 【使用register_chrdev(LED_MAJOR,DEVICE_NAME,&dev_fops)注册字符设备驱动程序时都要手动建立节点 ,否则在应用程序无法打开该设备

字符设备模块使用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  

 

转载于:https://www.cnblogs.com/Ph-one/p/5726579.html

相关文章:

  • ioctl方法详解
  • 手机对支持128G扩展内存的介绍
  • Linux sync命令的作用
  • touch 命令
  • 良子博客
  • mipi协议中文详解
  • 理解mipi协议
  • 待查项
  • drivers/mfd/Mfd-core.c
  • LInux ugo权限详解[修]
  • Camera 图像处理原理分析
  • camera isp
  • isp和3a的联系与区别是什么?
  • ihalcon网站
  • Android系统中 setprop,getprop,watchprops命令的使用
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 2017 前端面试准备 - 收藏集 - 掘金
  • Angularjs之国际化
  • Babel配置的不完全指南
  • input实现文字超出省略号功能
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript实现分页效果
  • LintCode 31. partitionArray 数组划分
  • mongodb--安装和初步使用教程
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 彻底搞懂浏览器Event-loop
  • ------- 计算机网络基础
  • 你不可错过的前端面试题(一)
  • 云大使推广中的常见热门问题
  • - 转 Ext2.0 form使用实例
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • #FPGA(基础知识)
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (16)Reactor的测试——响应式Spring的道法术器
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (poj1.2.1)1970(筛选法模拟)
  • (差分)胡桃爱原石
  • (二)JAVA使用POI操作excel
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (译)2019年前端性能优化清单 — 下篇
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .net 托管代码与非托管代码
  • .netcore如何运行环境安装到Linux服务器
  • .NET开发人员必知的八个网站
  • .NET是什么
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .net中调用windows performance记录性能信息
  • @Autowired @Resource @Qualifier的区别
  • @RequestMapping 的作用是什么?
  • @我的前任是个极品 微博分析
  • [ solr入门 ] - 利用solrJ进行检索