后天就要考试了,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 *);
总结成功的经验能够让人越来越聪明,