一:Platform总线
1.1概述
一个现实的linux设备驱动通常需要挂接在一种总线上,对于本身依附于PCI,USB,IIC,SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,
SOC系统中集成的独立的外设控制器,挂接在SOC内存空间的外设等确不依附于此类总线。基于这一背景,linux发明了一种虚拟的总线,称为platform总线,相应的
设备称为platform_device,而驱动成为platform_driver.Platform总线是linux2.6内核加的一种虚拟总线.
1.2.Platform总线优势
Platform驱动与传统的设备驱动模型相比,优势在于Platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序使用这些资源时使用统一的接口,提高了程序的可移植性。
二.平台设备的驱动软件设计流程
三.平台设备:
3.1.平台设备使用struct Platform_device来描述
struct platform_device {
const char * name; //设备名
int id;//设备编号,配合设备名使用
struct device dev;
u32 num_resources;//设备所使用各类资源数量
struct resource * resource;//设备资源
};
3.2.分配一个平台设备结构体
Strcut platform_device的分配使用:
struct platform_device *platform||_device_alloc(const char *name,int id)
参数:
Name:设备名
Id:设备id,一般为-1
3.3.平台设备注册
注册平台设备,使用函数:
Int platform_device_add(struct paltform_device *pdev)
3.4.设备资源
平台设备资源使用struct resource来描述
struct resource {
resource_size_t start;//资源的起始物理地址
resource_size_t end;//资源的结束物理地址
const char *name;//资源的名称
unsigned long flags;//资源的类型,如MEM,IRQ
struct resource *parent, *sibling, *child;//资源的链表指针
};
3.5.资源的获取
Struct resource *platform_get_resource(struct platform_device *dev,unsigned int type,unsigned int num)
参数:
Dev:资源所属的设备
Type:获取的资源类型
Num:获取的资源数
Eg:platform_get_resource(pdev,IORESOURCE_IRQ,0)
四:平台驱动
4.1.平台驱动描述
平台驱动使用struct 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;
struct platform_device_id *id_table;
};
4.2.平台驱动注册
平台驱动注册使用函数:
int platform_driver_register(struct platform_driver*)
4.3.实现struct platform_driver结构体中某些函数的功能
五.平台设备与平台驱动代码分析