Linux驱动学习字符设备

   在内核中,dev_t类型(在<linux/types.h>中定义)用来持有设备编号--主次部分都包括。对于2.6.0内核,dev_t是32位的量,12位用作主编号,20位用作次编号。为获得一个dev_t的主或次编号使用:

MAJOR(dev_t dev);获取主编号

MINOR(dev_t dev);获取次编号

如果有主次编号,需要将其转换为一个dev_t,使用MKDEV(int major, int minor)即可。

在建立一个字符驱动时需要做的第一件事就是获取一个或多个设备编号来使用,为此目的的函数是register_chrdev_region,在<linux/fs.h>中声明如下:

int register_chrdev_region(dev_t first, unsigned int count, char* name);

first是要分配的起始设备编号,first的次编号部分常常是0,count是请求的连续设备编号的总数。

如果不知道需要使用哪个设备编号,可以使用alloc_chrdev_region函数动态分配设备编号。声明如下:

int alloc_chrdev_region(dev_t* dev, unsigned int firstminor, unsigned int count, char* name);

在不再使用设备编号的时候,设备编号的释放使用:

void unregister_chrdev_region(dev_t first, unsigned int count);


注册设备编号仅仅是驱动代码必须进行的其中一个步骤, 而大部分的基础性驱动操作包括3个重要的内核书记结构,分别是file_operations,file和inode.我们只有对这些基本结构了解才能够做大量感兴趣的事情哦。

file_operations定义在<linux/fs.h>,是一系列函数指针的结合。

file代表一个打开的文件,它由内核在open时创建,并传递给文件file_operations上的任何函数,直到关闭,在文件所有实例都关闭后,内核释放这个数据结构。

inode结构由内核在内部用来表示文件,因此,它和代表打开文件描述符的file结构是不同的.可能有代表单个文件的多个打开描述符的许多文件结构,但是他们都指向一个单个inode结构。inode结构包含大量关于文件的信息。作为一个通用规则,这个结构只有2个成员对于编写驱动代码有用:

dev_t i_rdev;对于代表设备文件的节点,这个成员包含实际的设备编号。

struct cdev* i_cdev;

struct cedv是内核的内部结构,代表字符设备;当节点指的是一个字符设备文件时,这个成员包含一个指针指向这个结构。

可以宏从inode中获取主次编号:

unsigned int iminor(struct inode *inode);

unsigned int imajor(struct inode *inode);


字符设备注册的两种方式:

struct cdev *my_cdev = cdev_alloc();

my_cdev->ops = &my_fops;

如果cdev结构嵌套在其他结构中则使用函数void cdev_init(struct cdev* cdev, struct file_operations *fops);

一旦cdev结构建立,下一步是把它告诉给内核,使用int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

而从内核移出一个字符设备使用void cdev_del(struct cdev *dev);即可

如果cdev是包含在其他结构中,要获取那个结构的指针使用container_of宏。container_of(pointer, container_type, container_field);如:

struct scull_dev *dev;//scull_dev是一个字符设备,其中包含了cdev结构。

dev = container_of(inode->i_cdev, struct scull_dev, cdev);//从i_cdev结构得到scull_dev结构首地址

filp->private_data = dev;





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值