嵌入式LINUX驱动学习之14软硬件分离编程(一)源码部分
一、描述硬件信息头文件、函数及说明
//头文件位置:linux/platform_device.h
/* struct platform_device{}结构体
功能:保存驱动的硬件信息
*/
struct platform_device {
/*
name 和id配合使用;
当id = -1时,注册到kobject列表里面驱动名称为name所指向的字符串"%s" , name ;
当id != -1时,注册到kobject列表里面的驱动名称为"%s,%d" , name,id ;
即:向struct kobject kobj对象的name里注册一名称 name.id
实现方式详见如下::
drivers/base/platform.c
platform_device_registe(struct platform_device *pdev) ->
platform_device_add(pdev) ->
if (pdev->id != -1)
dev_set_name(&pdev->dev, "%s,%d", pdev->name, pdev->id);
else
dev_set_name(&pdev->dev, "%s", pdev->name);
drivers/base/core.c
dev_set_name(struct device *dev, const char *fmt, ...) ->
va_list vargs;
kobject_set_name_vargs(&dev->kobj, fmt, vargs)
lib/kobject.c
kobject_set_name_vargs(struct kobject *kobj, const char *fmt,va_list vargs) ------>
kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
*/
const char * name;
int id;
struct device dev; //用于指定总线驱动器名称,可以不指令,默认dev.parent.init_name = "platform"
/*
//源码位置:include/linux/ioport.h
struct resource {
resource_size_t start; //硬件资源寄存器开始地址
resource_size_t end;//硬件资源寄存器结束地址
const char *name; //硬件资源名称
unsigned long flags; //参考:include/linux/ioport.h
struct resource *parent, *sibling, *child;//一般由内核维护
};
*/
u32 num_resources; //struct resource结构体数组中硬件资源的个数
struct resource * resource; //用于描述硬件资源,详见上术注释,
/* 结构体struct device 中有一个成员 void *platform_data;可以实现device和driver之间数据通过无类型传递
struct device {
struct kobject kobj;//向内核注册一个用于驱动匹配的名称
void *platform_data;//void * 可用于自定义数据类型,用于device和driver数据传递
*/
struct device *dev;
//..........省略更多,可参考源码了解...............................
};
//向内核注册硬件信息函数 :
int platform_device_register(struct platform_device *pdev); //结构体描述如上
//从内删除硬件信息函数:
void platform_device_unregister(struct platform_device *pdev); //结构体描述如上
/*
从内核获取struct resource结构体信息函数:
struct resource *platform_get_resource(pdev,type,num);
功能:主要用于分层思想的driver中,当platform_driver_register注册后,
name匹配成功,可以用此函数获取到device中的struct resource信息。
参数说明:
pdev: struct platform_device类型
type:struct resource 的成员变量;flags;
num : 第几个type
*/
extern struct resource *platform_get_resource(struct platform_device *pdev, unsigned int type, unsigned int num);
二、描述软件信息头文件、函数及说明
//头文件位置:linux/platform_device.h
/* 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;//主要关注结构体中的name成员,用于和struct platform_device中的name匹配
const struct platform_device_id *id_table;//一般内核维护,不用管
};
//向内核注册驱动软件信息
extern int platform_driver_register(struct platform_driver *);
//从内核删除驱动软件信息
extern void platform_driver_unregister(struct platform_driver *);