Linux设备模型之platform总线
来源:互联网 发布:电路图设计软件 编辑:程序博客网 时间:2024/05/17 16:56
static int __init i8042_init(void)
err = platform_driver_register(&i8042_driver);
i8042_platform_device = platform_device_alloc("i8042", -1);
err = platform_device_add(i8042_platform_device);
int __init platform_bus_init(void)
error = bus_register(&platform_bus_type);
struct bus_type platform_bus_type = {
.name = "platform",
.dev_attrs = platform_dev_attrs,
.match = platform_match,
.uevent = platform_uevent,
.suspend = platform_suspend,
.resume = platform_resume,
struct platform_device *platform_device_alloc(const char *name, int id)
pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
pa->pdev.dev.release = platform_device_release;
Struct platform_object结构定义如下:
struct platform_object {
pa = kzalloc(sizeof(struct platform_object) + strlen(name), GFP_KERNEL);
struct device结构如下:
struct platform_device {
const char * name;
int platform_device_add(struct platform_device *pdev)
pdev->dev.parent = &platform_bus;
snprintf(pdev->dev.bus_id, BUS_ID_SIZE, "%s.%d", pdev->name,
strlcpy(pdev->dev.bus_id, pdev->name, BUS_ID_SIZE);
for (i = 0; i < pdev->num_resources; i++) {
struct resource *p, *r = &pdev->resource[i];
if (r->flags & IORESOURCE_MEM)
else if (r->flags & IORESOURCE_IO)
if (p && insert_resource(p, r)) {
"%s: failed to claim resource %d\n",
pr_debug("Registering platform device '%s'. Parent at %s\n",
pdev->dev.bus_id, pdev->dev.parent->bus_id);
if (pdev->resource[i].flags & (IORESOURCE_MEM|IORESOURCE_IO))
在分析linux设备模型的时候,曾说过.调用device_add()会产生一个hotplug事件.platform device的hotplug与一般的device事件相比.它还要它所属bus_type的uevent().对这个流程不熟悉的可以参照<< linux设备模型深探>>.platform device所属的bus_type为platform_bus_type.它的uevent()接口代码如下:
static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
add_uevent_var(env, "MODALIAS=platform:%s", pdev->name);
int platform_driver_register(struct platform_driver *drv)
drv->driver.bus = &platform_bus_type;
drv->driver.probe = platform_drv_probe;
drv->driver.remove = platform_drv_remove;
drv->driver.shutdown = platform_drv_shutdown;
drv->driver.suspend = platform_drv_suspend;
drv->driver.resume = platform_drv_resume;
return driver_register(&drv->driver);
struct platform_driver主要封装了struct device_driver结构.如下:
struct platform_driver {
int (*suspend)(struct platform_device *, pm_message_t state);
int (*suspend_late)(struct platform_device *, pm_message_t state);
int (*resume_early)(struct platform_device *);
不要被上面的platform_drv_XXX吓倒了,它们其实很简单,就是将struct device转换为struct platform_device和struct platform_driver.然后调用platform_driver中的相应接口函数
bus ->match --- > bus->probe/driver->probe (如果总线的probe操作不存在,就会调用设备的probe接口).
static int platform_match(struct device *dev, struct device_driver *drv)
pdev = container_of(dev, struct platform_device, dev);
return (strncmp(pdev->name, drv->name, BUS_ID_SIZE) == 0);
- Linux设备模型之platform总线
- Linux设备驱动模型之platform总线
- Linux设备模型之platform总线
- Linux设备驱动模型之platform总线
- Linux设备模型之platform总线
- Linux设备模型之platform总线
- linux设备模型之platform总线
- linux设备模型之platform总线
- Linux设备模型之platform总线
- Linux设备模型之platform总线
- Linux设备模型之platform总线
- Linux设备模型之platform总线
- linux设备模型之platform总线(转)
- Linux设备模型之platform总线
- Linux设备驱动模型之platform总线
- linux设备总线驱动模型 之 platform总线驱动
- linux设备总线驱动模型 之 platform总线驱动
- linux设备总线驱动模型 之 platform总线驱动
- 获取图片缩略图和视频缩略图
- linux查找目录下的所有文件中是否含有某个字符串
- Core Animation学习之anchorPoint
- 用C语言给指定的内存地址赋值(通过指针)
- java大数
- Linux设备模型之platform总线
- java类反射机制
- TCP协议三次握手过程分析
- U-boot的启动过程分析
- Shell脚本语法
- H264 编码详解(转)
- QTP的基本功能介绍
- TOMCATv5.0.16安装
- u-boot简介