前言
整理我自己使用过的两种正确方法和一个错误方法。
第一种适用于使用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);