我试图找到一种方法来保存和访问私有设备数据结构。我希望每个设备实例(如 /dev/xxx-0 /dev/xxx-1 等)都有自己的私有结构。我该如何实现? 我知道可以保留驱动程序私有数据结构,例如使用静态分配的 of_device_id 结构:
static struct of_device_id stepper_motor_of_match[] = {
{ .compatible = "jg,stepper-motor", .data = (void*)&sm_drv_data },
{ /* end of list */ },
};
而这个 sm_drv_data 应该可用于该驱动程序处理的所有设备实例。
这里是我的探测函数:
int stepper_motor_stepper_motor_probe(struct platform_device * device) {
int ret = 0;
struct device * dev = &(device->dev);
struct stepper_motor_device_data * dev_prv_data =
kzalloc(sizeof(struct stepper_motor_device_data), GFP_KERNEL);
struct stepper_motor_driver_priv_data * driver_prv_data =
(struct stepper_motor_driver_priv_data *)of_device_get_match_data(dev);
if(!dev_prv_data) {
printk(KERN_WARNING "<stepper_motor_dstepper_motor_probe> private device structure memory allocation failed\n");
return -ENOMEM;
}
cdev_init(& dev_prv_data->cdev,&stepper_motor_fops );
dev_prv_data->devnum = MKDEV(MAJOR(driver_prv_data->devnum_base),MINOR(driver_prv_data->devnum_base) + driver_prv_data->number_of_devices);
dev_prv_data->cdev.owner = THIS_MODULE;
ret = cdev_add(& dev_prv_data->cdev, dev_prv_data->devnum,1);
if(ret < 0) {
printk(KERN_ERR "<setpper_motor_setup_device> failed to add cdev struct! error: %d\n",ret);
return ret;
}
driver_prv_data->number_of_devices++;
dev_prv_data->device = device_create(driver_prv_data->dev_class,dev, dev_prv_data->devnum,dev_prv_data,DEVICE_NAME"-%d",MINOR(dev_prv_data->devnum));
if(IS_ERR( dev_prv_data->device)) {
ret = PTR_ERR( dev_prv_data->device);
printk(KERN_ERR "<setpper_motor_setup_device> Failed to create device: %d\n",ret);
cdev_del(& dev_prv_data->cdev);
return ret;
}
return ret;
}
我正在将设备私有数据结构传递给 device_create 函数。我可以通过调用 dev_get_drvdata 来访问它,但是如何在 remove 函数中访问它呢?我需要释放这个动态分配的结构。
int stepper_motor_remove(struct platform_device * device) {
struct device * dev = &(device->dev);
return 0;
}
platform_device->dev 与从 device_create 函数获取的 dev 不同。 这暗示了我的其他问题:platform_device->device 结构到底是什么?为什么我们需要保留两个设备结构?如果我不调用 device_create,则不会创建设备文件,即使设备结构已经聚合在 platform_device 结构中。所以现在我有两个设备结构......这些结构如何根据间接调用 probe() 函数对应于设备树中的节点?
感谢您的帮助。