使用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。本例运行结果如下:

[[email protected]/home]#insmod demo.ko
[[email protected] /home]# mknod /dev/fgj c 224 0
[[email protected] /home]# ./test
open /dev/fgj successfully
read successfully:fgj  
时间: 2024-07-30 11:05:42

使用register_chrdev注册字符设备的相关文章

register_chrdev_region/alloc_chrdev_region和cdev注册字符设备驱动

内核提供了三个函数来注册一组字符设备编号,这三个函数分别是 register_chrdev_region().alloc_chrdev_region() 和 register_chrdev(). (1)register_chrdev  比较老的内核注册的形式   早期的驱动(2)register_chrdev_region/alloc_chrdev_region + cdev  新的驱动形式 (3)register_chrdev()函数是老版本里面的设备号注册函数,可以实现静态和动态注册两种方法

002_linux驱动之_register_chrdev注册字符设备

(一)解析:register_chrdev函数和unregister_chrdev函数 (二)register_chrdev函数原型 int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops) * register_chrdev() -为字符设备注册一个主号码. * @major:用于动态分配的主要设备号或0 * @name:这一系列设备的名称 * @fops:与此设备相

注册字符设备接口

老接口:register_chrdev//注册设备驱动(实现注册设备号和相应的file_operation操作结构体)//缺点:只有主设备号,没有(不支持)次设备号新接口:register_chrdev_region(注册设备号)/alloc_chrdev_region(自动分配设备号) + cdev cdev结构体及相关函数 结构体: struct cdev { struct kobject kobj; struct module *owner; const struct file_opera

字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev() (转载)

1. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里.该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char_device_struct {        struct char_device_struct *next;    // 指向散列冲突链表中的下一个元素的指针        unsigned int major;                 // 主设备号       

字符设备 register_chrdev_region()、alloc_chrdev_region() 和 register_chrdev()

1. 字符设备结构体 内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里.该散列表中的每一个元素是一个 char_device_struct 结构,它的定义如下: static struct char_device_struct {       struct char_device_struct *next;    // 指向散列冲突链表中的下一个元素的指针       unsigned int major;                 // 主设备号       un

字符设备之register_chrdev与register_chrdev_region

之前写字符设备驱动,都是使用register_chrdev向内核注册驱动程序中构建的file_operations结构体,之后创建的设备文件,只要是主设备号相同(次设备号不同),则绑定的都是同一个file_operations结构体,应用程序使用的也都是这一个结构体中注册的函数.这就会出现这样的一个弊端:同一类字符设备(即主设备号相同),会在内核中连续注册了256(分析内核代码中可知),也就是所以的此设备号都会被占用,而在大多数情况下都不会用到这么多次设备号,所以会造成极大的资源浪费.所以reg

20150216简单的Linux字符设备驱动程序

20150216简单的Linux字符设备驱动程序 2015-02-16 李海沿 关于字符设备驱动程序详细的知识点,本文就不再介绍了,很多同志,看了知识点,还是一头雾水,写不出来,所以,本文从实战出发,带领各位同胞们来实现一个字符设备驱动程序,改程序可作为字符设备的通用模板. 好了废话不多说,先上驱动程序,在驱动程序中加入详细注释: 1 /****************************** 2 linux 字符设备驱动程序 3 *****************************/

LINUX设备驱动程序笔记(三)字符设备驱动程序

      <一>.主设备号和次设备号        对字符设备的访问时通过文件系统内的设备名称进行的.那些设备名称简单称之为文件系统树的节点,它们通常位于/dev目录.字符设备驱动程序的设备文件可通过ls -l命令输出的第一列中的'c'来识别.块设备同样位于/dev下,由字符'b'标识 crw-rw----  1 root root    253,   0 2013-09-11 20:33 usbmon0 crw-rw----  1 root root    253,   1 2013-09

Samsung_tiny4412(笔记)--&gt;字符设备驱动基本操作及调用流程

/*********************************************************************************** * * Samsung_tiny4412(笔记)-->字符设备驱动基本操作及调用流程 * * 声明: * 以下所有的shell命令都是在root权限下运行的; * * 2015-3-7 阴 深圳 尚观 Sbin 曾剑锋 *******************************************************