|  | 
 
| 在用到Linux设备驱动的platform框架时,常常会遇到两个函数platform_get_drvdata和platform_set_drvdata。通常,会在驱动的probe函数中获取device的相关信息,然后使用platform_set_drvdata进行保存。在其他函数中要用到时(比如remove),通过platform_get_drvdata来获取。 内核中的定义为:
 #define platform_get_drvdata(_dev) dev_get_drvdata(&(_dev)->dev)
 #define platform_set_drvdata(_dev,data) dev_set_drvdata(&(_dev)->dev, (data))
 _dev指的是struct platform_device,可以看到其实调用的是dev_get_drvdata和dev_set_drvdata。
 struct platform_device {
 const char * name;
 int  id;
 struct device dev;
 u32  num_resources;
 struct resource * resource;
 
 const struct platform_device_id *id_entry;
 
 /* arch specific additions */
 struct pdev_archdata archdata;
 };
 
 void *dev_get_drvdata(const struct device *dev)
 {
 if (dev && dev->p)
 return dev->p->driver_data;
 return NULL;
 }
 
 void *dev_get_drvdata(const struct device *dev)
 {
 if (dev && dev->p)
 return dev->p->driver_data;
 return NULL;
 }
 下面来看看涉及到的struct device的相关成员。
 struct device {
 ...
 struct device_private *p;
 struct device_driver *driver; /* which driver has allocated this
 void  *platform_data; /* Platform specific data, device core doesn't touch it */
 ...
 };
 struct device_private中的成员:
 struct device_private - structure to hold the private to the driver core portions of the device structure.这个结构用来保存struct device中的私有的设备驱动程序的核心部分。
 struct device_private {
 ...
 void *driver_data;
 struct device *device;
 };
 如果有定义struct platform_device *pdev;那设备相关的信息会保存在pdev->dev.platform_data中。在驱动中的probe配置好的设备信息则是通过platform_set_drvdata保存在pdev->dev->p->driver_data中,但是driver_data已经封装在函数platform_set_drvdata和platform_get_drvdata中了。
 
 
 | 
 |