字符设备驱动:在open函数中获得私有设备结构体指针的方法

前言

        整理我自己使用过的两种正确方法和一个错误方法。

        第一种适用于使用miscdevice 框架创建的字符设备。

        第二种适用于自的定义cdev的设备驱动

        第三种看似没问题,测试没通过

        通过container_of宏获得私有结构体指针,container_of的原理是计算其成员的地址和其成员在结构体中的内存偏移,来确定整个结构体的地址。

一 通过file结构体的f_op指针

1)定义私有结构体struct css_dev_ ,将struct file_operations css_fops;    作为其成员。

struct css_dev_ {
	struct fasync_struct * fa;
	char *name;
	struct miscdevice css_misc;
	struct file_operations css_fops;	
};

 2)在open函数的参数中struct file结构体有如下成员:

struct file {
...
    const struct file_operations	*f_op;
...
};

3)通过struct file 的f_op成员指针找到struct css_dev_结构体指针

struct css_dev_ *css_dev = (struct css_dev_ *)container_of(file->f_op,struct css_dev_,css_fops);

二 通过 struct inode结构体的i_cdev指针

struct inode {
...
    union {
		struct pipe_inode_info	*i_pipe;
		struct block_device	*i_bdev;
		struct cdev		*i_cdev;
	};
...
};

如下所示:

struct my_led_dev{
	int major;
	struct class *class;
	struct child_device child[MYLED_COUNT];
	dev_t  devid;
	struct cdev dev;
};
struct my_led_dev *p = container_of(inode->i_cdev,struct my_led_dev,dev);

三 通过 struct inode结构体的i_fop指针(错误的)

        经过后来测试,发现这个i_fop并不是我们自己的struct file_operations,所以这个不对。

struct inode {
...
    const struct file_operations	*i_fop;
...
};

私有结构体:

struct css_dev_ {
	struct fasync_struct * fa;
	char *name;
	struct miscdevice css_misc;
	struct file_operations css_fops;	
};

如下所示:

struct css_dev_ *css_dev = (struct css_dev_ *)container_of(inode->i_fop,struct css_dev_,css_fops);

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千册

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值