【Tiny6410 And Linux】—(2.1)—platform 总线、设备、驱动—

后天就要考试了,PLC,呵呵,这个还不算什么事情,所以呢,继续!

1、platform总线介绍

一个现实的 Linux 设备和驱动通常都需要挂载在一种总线上,对于本身依附于 PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里,SoC 系统中集成的独立的外设控制器、挂载在 SoC内存空间的外设等确不依附于此类总线。

基于这一背景,Linux 发明了一种虚拟的总线,称为 platform 总线,相应的设备称为 platform_device,而驱动则成为 platform_driver。

Platform 驱动与传统的设备驱动模型相比,优势在与 platform 机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序使用这些资源时使用统一的接口,这样就提高了程序的可移植性!!

2、platform设备

1)platform设备描述结构:

Platform 设备由 platform_device 结构表示,定义在 <linux/platform_device.h>中。

Struct platform_device{         Const char *name;                                                /* 设备名 */         Int id;                                                          /* 设备编号,配合设备名使用 */         Struct device dev;                                               /* 内嵌 device 结构 */         U32 num_resource;         Struct resource *resource;                                       /* 设备资源,这里记录了硬件的相关信息 */         …}; 

2)设备资源描述结构:

平台设备资源使用 resource结构来描述,定义在 <linux/ioport.h> 中(该头文件已经包含在 <linux/device.h>中了)。

Struct resource{         Resource_size_t start;                                         /* 资源的起始物理地址 */         Resource_size_t end;                                           /* 资源的结束物理地址 */         Const char *name;                                                /* 资源的名称 */         Unsigned long flags;                                              /* 资源的类型,比如 MEM、IO 等 */         Struct resource *parent,*sibling,*child;              /* 资源链表指针 */};

3)platform设备操作方法:

①、分配一个 platform_device结构,使用函数:

Struct platform_device *platform_device_alloc(const char *name,int id);

▲:name:platform设备名。

▲:id:设备 id,一般为 -1。

②、为平台设备添加平台设备资源,使用函数:

Int platform_device_add_resources(struct platform_device *pdev,

Const struct resource *res,

Unsigned int num);

▲:pdev:platform设备结构。

▲:res:指向欲添加资源的集合。

▲:num:添加资源的数量。

③、注册平台驱动,使用函数(通常和 platform_device_alloc()函数配合使用):

Int platform_device_add(struct platform_device *pdev);

④、注册失败情况下,释放相关内存:

Int platform_device_put(struct platform_device *pdev);

⑤、获取平台设备资源(这个一般应用在驱动程序中),使用函数:

Struct resource *platform_get_resource(struct platform_device *dev,unsigned int type,

Unsigned int num);

▲:dev:资源所属的设备。

▲:type:获取的资源类型。

▲:num:获取的资源数。

3、platform驱动

Platform 驱动程序用 platform_driver 结构来描述:

Struct platform_driver{         Int (*probe)(struct platform_device *);         Int (*remove)(struct platform_device *);         void (*shutdown)(struct platform_device *);         int (*suspend)(struct platform_device *,pm_message_t state);         int (* resume)(struct platform_device *);         struct device_driver *driver;         const struct platform_device_id *id_table;};

平台驱动注册使用函数:

Int platform_driver_register(struct platform_driver *);

总结成功的经验能够让人越来越聪明,

【Tiny6410 And Linux】—(2.1)—platform 总线、设备、驱动—

相关文章:

你感兴趣的文章:

标签云: