字符设备驱动:在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);

结束

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Linux驱动源码\1.8.1gdb的调试过程.c .............\10.3.3Linux USB内核的主要数据结构.c .............\11.3.10主机端设备驱动程序.c .............\11.3.3主机控制器驱动程序设计.c .............\12.2.13OTG FSM的设计和实现.c .............\12.2.6USBD接口模块.c .............\12.2.8HCD初始化模块.c .............\3.8.7实现断处理程序.c .............\4.12chardevxxx设备驱动程序设计.c .............\4.13.1cdev 结构体.c .............\4.13.3file_operations 结构体.c .............\4.13.4字符设备驱动模块加载与卸载函数.c .............\4.13.5字符设备驱动的file_operations 结构体成员.c .............\4.14.1头文件、宏及设备结构体.c .............\4.14.2加载与卸载设备驱动.c .............\4.14.3读写函数.c .............\4.14.4seek 函数.c .............\4.14.8使用文件私有数据.c .............\4.8字符设备驱动程序用到的主要数据结构.c .............\5.3.1主要的数据结构.c .............\5.3.3初始化设备模块.c .............\5.3.4打开设备模块.c .............\6.2.2驱动程序file_operations数据结构.c .............\6.3.1SOUND设备的打开和释放.c .............\6.3.2定义SOUND设备的读写函数.c .............\6.3.3SOUND设备的控制操作处理.c .............\6.3.4SOUND设备驱动程序的其他部分.c .............\6.3.5Mixer驱动的实现.c .............\7.4.5设定DMA通道.c .............\7.6.4驱动程序底层文件实现的基础.c .............\7.7.1上层文件的实现.c .............\7.7.6电源管理功能.c .............\8.1.3块设备读写请求.c .............\8.2.3request与bio结构体.c .............\8.3.5块设备驱动IO请求处理.c .............\8.4.2RAMDISK驱动模块加载与卸载.c .............\8.4.3RAMDISK设备驱动block_device_operations及成员函数.c .............\8.5.2IDE硬盘设备驱动block_device_operations及成员函数.c .............\8.5.3IDE硬盘设备驱动IO请求处理.c .............\8.5.4在内核增加对新系统IDE设备的支持.c .............\9.3.1数据结构struct net_device.c .............\9.3.2数据结构struct sk_buff.c .............\9.5.10参数设置和统计数据.c .............\9.5.11多播(set_multicast_list).c .............\9.5.3打开(open).c .............\9.5.4关闭(stop).c .............\9.5.5发送(hard_start_xmit).c .............\9.5.6接收(reception).c .............\9.5.7断处理(interrupt).c .............\HAL的设计和实现.c Linux驱动源码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千册

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

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

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

打赏作者

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

抵扣说明:

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

余额充值