注册字符设备可以使用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. }

字符设备模块使用insmod加载,加载完毕需要在/dev目录下使用mkmod命令建立相应的文件结点,编译生成的应用层可执行程序为test。本例运行结果如下:

  1. [root@/home]#insmod demo.ko
  2. [root@urbetter /home]# mknod /dev/fgj c 224 0
  3. [root@urbetter /home]# ./test
  4. open /dev/fgj successfully
  5. read successfully:fgj

使用register_chrdev注册字符设备相关推荐

  1. 使用cdev_add注册字符设备

    在前面已经提到设备号有主设备号和次设备号,其中主设备号表示设备类 型,对应于确定的驱动程序,具备相同主设备号的设备之间共用同一个驱动程 序,而用次设备号来标识具体物理设备.因此在创建字符设备之前,必须 ...

  2. 虚拟字符设备驱动开发步骤

    目录 前言 字符设备驱动简介 内核驱动操作函数集合(file_operations结构体) 字符设备驱动开发步骤 .ko驱动模块的加载和卸载(module_init驱动入口.insmod驱动加载) 字 ...

  3. Linux驱动开发(一):字符设备

    目的:实现最简单的点灯操作. Linux一切皆文件,应用程序访问某个物理设备(文件)时,首先通过open, read, write等库函数调用系统调用接口(System call interface) ...

  4. 【正点原子MP157连载】第二十章 字符设备驱动开发-摘自【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7

    1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...

  5. 02_字符设备驱动开发

    目录 1 字符设备驱动简介 2 字符设备驱动开发步骤 2.1 驱动模块的加载和卸载 2.2 字符设备注册与注销 2.3 实现设备的具体操作函数 2.4 添加 LICENSE 和作者信息 3 Linux ...

  6. 字符设备之register_chrdev与register_chrdev_region

    之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个fi ...

  7. Linux驱动编程 step-by-step (四) 字符设备的注册与设备节点的自动创建

    字符设备的注册与设备节点的自动创建 cdev 结构 内核内部使用struct cdev<linux/cdev.h>来表示一个字符设备 struct cdev {     struct ko ...

  8. 浅谈linux字符设备注册

    Linux中有两种字符设备注册的方法: 这里所提到的函数在文件:fs/char_dev.c中定义,在头文件include/linux/cdev.h中声明. 一.             老方法: 如果 ...

  9. cdev 结构体与字符设备的注册

    在 linux 2.6内核中,使用 cdev结构体描述字符设备,cdev 的定义在 <linux/cdev.h> 中可找到,其定义如下: 引用 struct cdev {         ...

最新文章

  1. 收藏 | YOLO系列综述:从V1到V4
  2. pip经常的使用技巧
  3. httpinvoker远程调用超时_RPC远程过程调用协议工作原理分析
  4. Tensorflow中文文档
  5. 【转载】SDRAM时钟相移估算
  6. 《对不队》团队项目用户验收评审
  7. 工作228:小程序学习2开始布局页面2
  8. Windows Phone 7 LongListSelector控件实现分类列表和字母索引
  9. JavaScript开发中几个常用知识点总结
  10. WEB-INF下jsp页面如何访问
  11. @echo off是什么意思_高街、BF、FOG、OS风。。。都是些什么鬼?
  12. RhinoMock异常ExpectationViolationException以及解决
  13. 【OpenCV】视频输入与相似度测量
  14. 搞AI的产品经理该怎么写PRD?谷歌的导师教你
  15. 纯CSS3实现动态火车行驶特效
  16. 解决NetworkOnMainThreadException
  17. lua table的__index ,setmetable()的一些操作
  18. 微信购物商城系统怎样吸引住客户,来转换为商城系统的粉丝?
  19. 寻路系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  20. compute的c语言用法,词汇精选:compute的用法和辨析

热门文章

  1. boost::mp11::mp_replace_if相关用法的测试程序
  2. boost::geometry::strategy::andoyer用法的测试程序
  3. boost::container实现显式实例静态向量测试程序
  4. boost::container模块实现分配器特征的测试程序
  5. Boost:不受约束的集合bimap的测试程序
  6. Boost:双图bimap与property地图的测试程序
  7. Boost:双图bimap与散列索引的测试程序
  8. VTK:PolyData之CellEdgeNeighbors
  9. VTK:图片之FillWindow
  10. OpenCV使用VideoCapture和VideoWriter的实例(附完整代码)