内核驱动程序 - 驱动程序私有数据与设备私有数据

问题描述 投票:0回答:0

我试图找到一种方法来保存和访问私有设备数据结构。我希望每个设备实例(如 /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() 函数对应于设备树中的节点?

感谢您的帮助。

module kernel device platform
© www.soinside.com 2019 - 2024. All rights reserved.