您的位置:首页 > 运维架构 > Linux

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

2012-05-06 10:42 471 查看
后天就要考试了,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 *);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: