免费咨询热线
13621929115概括来说,Platform设备包括:基于端口的设备(已不推荐使用军事模型,保留下来只为兼容旧设备,legacy);连接物理总线的桥设备;集成在SOC平台上面的控制器;连接在其它bus上的设备(很
platform_dri军事模型ver_registe、platform_driver_unregister,platform driver的注册、注销接口platform_driver_probe,主动执行probe动作。
platform_set_drvdata、platform_get_drvdata,设置或者获取driver军事模型保存在device变量中的私有数据3.4 懒人API又是注册platform device,又是注册platform driver,看着挺啰嗦的。
不过内核想到了这点,所以提供一个懒人API,可以同时注册platform driver,并分配一个platform device:#define plat军事模型form_create_bundle(driver, probe, res, n_res, data, size) \
只要提供一个platform_driver(要把driver的probe接口显式的传入),并告知军事模型该设备占用的资源信息,platform模块就会帮忙分配资源,并执行probe操作对于那些不需要热拔插的设备来说,这种方式是最省事的了。
3.5 Early platform device/driver内核启动时,要完成一定的初始化操作之后,才会处理device和driver的注册及probe,因此在这军事模型之前,常规的platform设备是无法使用的。
但是在Linux中,有些设备需要尽早使用(如在启动过程中充当console输出的serial设备),所以platform模块提供了一种称作Early platform device/driver的机制,允许驱动开发人员,在开发驱动时,向内核注册可在内核早军事模型期启动过程中使用的driver。
这些机制提供了如下接口:4. Platform模块的内部动作解析4.1 Platform模块的初始化Platform模块的初始化是由drivers/base/platform.c中platform_bus_init接口完成的,该接口的实现和动作如下:
early_platform_cleanup,清除所有和Ear军事模型ly device/driver相关的代码因为执行到这里的时候,证明系统已经完成了Early阶段的启动,转而进行正常的设备初始化、启动操作,所以不再需要Early Platform相关的东西。
device_register,注册一个名称为platform_bus的设备,该设备的定义非常简单,只包含i军事模型nit_name(为“platform”)该步骤会在sysfs中创建“/sys/devices/platform/”目录,所有的Platform设备,都会包含在此目录下。
bus_register,注册一个名称为platform_bus_type的bus,该bus的定义如下:struct bus_ty军事模型pe platform_bus_type = { .name = "platform", .dev_attrs = platform_dev_attrs, .match = platform_match, .uevent = platform_uevent, .pm = &platform_dev_军事模型pm_ops, };
该步骤会在sysfs中创建“/sys/bus/platform/”目录,同时,结合“Linux设备模型(6)_Bus”的描述,会在“/sys/bus/platform/”目录下,创建uevent attribute(/sys/bus/platform/uevent)、device军事模型s目录、drivers目录、drivers_probe和drivers_autoprobe两个attribute(/sys/bus/platform/drivers_probe和/sys/bus/platform/drivers_autoprobe)。
4.2 platform device和plat军事模型form driver的注册结合第3章的描述,platform device和platform driver的注册,由platform_device_add和platform_driver_register两个接口实际实现。
其内部动作分别如下platform_device_add的内部动作:如果该设军事模型备没有指定父设备,将其父设备设置为platform_bus,即“/sys/devices/platform/”所代表的设备,这时该设备的sysfs目录即为“/sys/devices/platform/xxx_device”。
将该设备的bus指定为platform_bus_type(pdev->dev军事模型.bus = &platform_bus_type)根据设备的ID,修改或者设置设备的名称对于多个同名的设备,可以使用ID区分,在这里将实际名称修改为“name.id”的形式。
调用resource模块的insert_resource接口,将该设备需要使用的resource统一管理起来(我们知道,在这军事模型之前,只是声明了本设备需要使用哪些resource,但resource模块并不知情,也就无从管理,因此需要告知)。
调用device_add接口,将内嵌的struct device变量添加到内核中platform_driver_register的内部动作:将该driver的bus指定为platform军事模型_bus_type(drv->driver.bus = &platform_bus_type)。
如果该platform driver提供了probe、remove、shutdown等回调函数,将该它内嵌的struct driver变量的probe、remove、shutdown等指针,设置为plat军事模型form模块提供函数,包括platform_drv_probe、platform_drv_remove和platform_drv_shutdown。
因为probe等动作会从struct driver变量开始,经过platform_drv_xxx等接口的转接,就可以到达platform diver自身军事模型的回调函数中调用driver_register接口,将内嵌的struct driver变量添加到内核中。
4.3 platform设备的probe我们在“Linux设备模型(6)_Bus”中讲过,设备的probe,都发生在向指定的bus添加device或者device_driver时,由bus模块的b军事模型us_probe_device,或者device_driver模块driver_attach接口触发。
这里就不再详细描述了
Copyright © 2002-2020 上海润之模型设计有限公司 版权所有 展示模型,展品模型,展厅模型,展示道具,展厅展品,展品道具,模型定制,模型公司,上海模型公司 备案号:沪ICP备20018260号