Linux设备驱动开发 - 平台设备驱动

发布时间:2024-09-20  

Linux2.6的内核中引入了一种新的设备驱动模型-平台(platform)设备驱动,平台设备驱动分为平台设备(platform_device)和平台驱动(platform_driver),平台设备的引入使得Linux设备驱动更加便于移植。


一、平台设备

平台设备结构体:


 1 struct platform_device {

 2     const char    * name;                      /* 设备名 */

 3     int        id;

 4     struct device    dev;                     /* 设备结构体 */

 5     u32        num_resources;                   /* 设备资源数量 */

 6     struct resource    * resource;              /* 设备资源 */

 7 

 8     const struct platform_device_id    *id_entry;

 9 

10     /* arch specific additions */

11     struct pdev_archdata    archdata;

12 };


平台设备主要是提供设备资源和平台数据给平台驱动,resource为设备资源数组,类型有IORESOURCE_IO、IORESOURCE_MEM、IORESOURCE_IRQ、IORESOURCE_DMA、IORESOURCE_DMA。下面是一个网卡芯片DM9000的外设资源:


 1 static struct resource dm9000_resources[] = {

 2     [0] = {

 3         .start        = S3C64XX_PA_DM9000,

 4         .end        = S3C64XX_PA_DM9000 + 3,

 5         .flags        = IORESOURCE_MEM,

 6     },

 7     [1] = {

 8         .start        = S3C64XX_PA_DM9000 + 4,

 9         .end        = S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,

10         .flags        = IORESOURCE_MEM,

11     },

12     [2] = {

13         .start        = IRQ_EINT(7),

14         .end        = IRQ_EINT(7),

15         .flags        = IORESOURCE_IRQ | IRQF_TRIGGER_HIGH,

16     },

17 };


dm9000_resources里面有三个设备资源,第一个为IORESOURCE_MEM类型,指明了第一个资源内存的起始地址为S3C64XX_PA_DM9000结束地址为S3C64XX_PA_DM9000 + 3,第二个同样为IORESOURCE_MEM类型,指明了第二个资源内存的起始地址为S3C64XX_PA_DM9000 + 4结束地址为S3C64XX_PA_DM9000 + S3C64XX_SZ_DM9000 - 1,第三个为IORESOURCE_IRQ类型,指明了中断号为IRQ_EINT(7)。


 1 struct device {

 2     struct device        *parent;

 3 

 4     struct device_private    *p;

 5 

 6     struct kobject kobj;

 7     const char        *init_name; /* initial name of the device */

 8     struct device_type    *type;

 9 

10     struct mutex        mutex;    /* mutex to synchronize calls to

11                      * its driver.

12                      */

13 

14     struct bus_type    *bus;        /* type of bus device is on */

15     struct device_driver *driver;    /* which driver has allocated this

16                        device */

17     void        *platform_data;    /* Platform specific data, device

18                        core doesn't touch it */

19     ...

20 };


struct device结构体里面有一个重要成员platform_data,它是平台设备和平台驱动进行数据传递的重要成员。


平台设备注册:


1 int platform_device_register(struct platform_device *pdev);

platform_device_register()会对平台设备进行相应的初始化之后调用platform_device_register()函数把它添加到子系统中。



平台设备注销:


1 void platform_device_unregister(struct platform_device *pdev);

platform_device_unregister()函数释放设备资源之后从子系统中将其移除。


平台设备模板:


 1 static struct resource xxx_resource = 

 2 {

 3     [0] = 

 4     {

 5         .start = ...,

 6         .end = ...,

 7         .flags = ...,

 8     },

 9     [1] = 

10     {

11         ...

12     }

13     ...

14 };

15 

16 static struct xxx_plat_data xxx_data = 

17 {

18     ...

19 };

20 

21 static struct platform_device xxx_platform_device = 

22 {

23     .name = NAME,

24     .num_resources = ARRAY_SIZE(xxx_resource),

25     .resource = xxx_resource,

26     .dev = 

27     {

28         .platform_data = &xxx_data,

29     }

30 };

31 

32 static int __init xxx_device_init(void)

33 {

34     ...

35     /* 注册平台设备 */

36     platform_device_register(&xxx_platform_device);

37     ...

38 }

39 

40 static void __exit xxx_device_exit(void)

41 {

42     ...

43     /* 注销平台设备 */

44     platform_device_unregister(&xxx_platform_device);

45     ...

46 }


二、平台驱动

平台驱动结构体:


1 struct platform_driver {

2     int (*probe)(struct platform_device *);

3     int (*remove)(struct platform_device *);

4     void (*shutdown)(struct platform_device *);

5     int (*suspend)(struct platform_device *, pm_message_t state);

6     int (*resume)(struct platform_device *);

7     struct device_driver driver;

8     const struct platform_device_id *id_table;

9 };


平台驱动结构体driver成员里面的name必须与平台设备结构体里面的name成员一致,在系统注册一个设备的时候,会通过设备结构体里面的name成员和平台驱动driver里面的name成员匹配,当匹配成功则调用平台驱动的probe函数,

通常在probe函数中获取平台设备的资源和私有数据并进行设备的初始化。


获取设备资源:


1 struct resource *platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);

platform_get_resource()函数用于获取平台设备的资源,dev为要平台设备,type为平台设备资源类型,num为平台资源号(比如同一个资源有两个则资源号为0,1)。

 


平台驱动注册:


1 int platform_driver_register(struct platform_driver *drv);

platform_driver_register()函数完成平台驱动的注册,在驱动模块加载时调用。


平台驱动注销:


1 void platform_driver_unregister(struct platform_driver *drv);

platform_driver_unregister()函数完成平台驱动的注销,在驱动模块卸载时调用。


平台驱动模板:


 1 static int __devinit xxx_probe(struct platform_device *pdev)

 2 {

 3     struct xxx_plat_data *pdata = pdev->dev.platform_data;    /* 获取私有数据 */

 4     platform_get_resource(pdev,xxx,x);                        /* 获取设备资源 */

 5     ...

 6 }

 7 

 8 static struct platform_driver xxx_platform_driver = 

 9 {

10     .probe = xxx_probe,

11     .remove = __devexit_p(xxx_remove),

12     .driver = 

13     {

14         .name = NAME,    /* 跟平台设备名一致 */

15         ...

16     },

17     ...

18 };

19 

20 static int __init xxx_driver_init(void)

21 {

22     ...

23     /* 驱动注册 */

24     platform_driver_register(&xxx_platform_driver);

25     ...

26 }

27 

28 static void __exit xxx_driver_exit(void)

29 {

30     ...

31     /* 驱动注销 */

32     platform_driver_unregister(&xxx_platform_driver);

33     ...

34 }


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>