- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在 Linux 上开发驱动程序。我正在努力获取一些/sys 文件属性,这将使事情变得更好。在传递这些属性要传达的信息时,属性函数必须能够访问驱动程序存储的某些数据。由于事物的制作和存储方式,我认为我可以使用来自 device_create() 的 struct device 的 device_private *p
成员。基本上是这样的:
for (i = 0; i < total; i++) {
pDevice = device_create(ahcip_class, NULL, /*no parent*/
MKDEV(AHCIP_MAJOR, AHCIP_MINOR + i), NULL, /*no additional info*/
DRIVER_NAME "%d", AHCIP_MINOR + i);
if (IS_ERR(pDevice)) {
ret = PTR_ERR(pDevice);
printk(KERN_ERR "%s:%d device_create failed AHCIP_MINOR %d\n",
__func__, __LINE__, (AHCIP_MINOR + i));
break;
}
mydevs[i].psysfs_dev = pDevice;
ret = sysfs_create_group(&pDevice->kobj, &attr_group);
if (!ret) {
pr_err("%s:%d failed in making the device attributes\n",
__func__, __LINE__);
goto build_udev_quick_out;
}
}
这还没有显示对 device_private
指针的赋值,但这就是我要去的地方。在该类别下制造的每个新设备都需要相同的属性,因此该组。这是我开始“概念验证”的单一属性
static ahcip_dev *get_ahcip_dev(struct kobject *ko)
{
ahcip_dev *adev = NULL;
struct device *pdev = container_of(ko, struct device, kobj);
if (!pdev) {
pr_err("%s:%d unable to find device struct in kobject\n",
__func__, __LINE__);
return NULL;
}
/* **** problem dereferencing p **** */
adev = (ahcip_dev*)pdev->p->driver_data;
/* return the pointer anyway, but if it's null, print to klog */
if (!adev)
pr_err("%s:%d no ahcip_dev, private driver data is NULL\n",
__func__, __LINE__);
/* **** again problem dereferencing p **** */
return pdev->p->(ahcip_dev*)driver_data; // <--- problem here
}
static ssize_t pxis_show(struct kobject *kobj, struct kobj_attribute *attr,
char *buff)
{
u32 pi = 0;
ahcip_dev *adev = get_ahcip_dev(kobj);
/* get_ahcip_dev() will print what happened, this needs to return
* error code
*/
if (!adev)
return -EIO;
pi = adev->port_index;
return sprintf(buff, "%08x\n", get_port_reg(adev->hba->ports[pi], 0x10));
}
我认为,由于 device_create()
返回一个 struct device*
并且我使用它来创 build 备组,因此进入 pxis_show
的 struct kobject*
是由 device_create
创建的设备结构的成员。如果这是真的,那么我应该能够将一些私有(private)数据填充到该对象中,并在访问/sys 文件时使用它。但是,当上面标记的代码行取消引用 p
成员时,我从 gcc 得到取消引用不完整类型的指针。我确定是 struct device
的 struct device_private
成员不完整,但为什么呢?我应该使用不同的结构吗?这似乎是内核内部真正的事情。
最佳答案
要为设备分配私有(private)数据,您需要在 device_create()
中使用 void *drvdata
参数。创建后,可以通过dev_get_drvdata(pdev)
访问数据。
struct device_private
是设备实现的内部结构。从该结构的描述(drivers/base/base.h
):
Nothing outside of the driver core should ever touch these fields.
关于linux - 如何在struct device中取消引用device_private,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545809/
我是一名优秀的程序员,十分优秀!