追根溯源,从代码中看到,module_platform_driver最终还是调用了module_init,但是,又不仅仅是调用了module_init,还调用了platform_driver_register和platform_driver_unregister,这两个函数的作用就是注册和卸载平台驱动。 再来看看platform_driver_register /* include/linux/platform_device.h */ #defineplatform_driver_reg...
extern int __platform_driver_register(struct platform_driver *, struct module *); /** * __platform_driver_register - register a driver for platform-level devices * @drv: platform driver structure * @owner: owning module/driver */ int __platform_driver_register(struct platform_driver *drv, ...
* use this macro once, and calling it replaces module_init() and module_exit() */#definemodule_i2c_driver(__i2c_driver) \ module_driver(__i2c_driver, i2c_add_driver, \ i2c_del_driver) “module_driver”也是一个宏,传入了i2c设备驱动注册和注销函数,宏原型位于“kernel/linux/device....
这里module_driver宏定义下,首先定义__driver##_init函数然后传入module_init()函数,其次定义__exit __driver##_exit()函数传入module_exit()函数。 module_init()和module_exit()定义为: // include/linux/module.h#definemodule_init(x) __initcall(x);#define module_exit(x) __exitcall(x);// inclu...
由以上展开可以看出,module_platform_driver是由module_driver封装而来,并填充了platform_driver_register、platform_driver_unregister两个函数作为宏的参数传递给了 module_driver的宏,这样做的目的是统一了接口函数,使得所有驱动的注册、注销函数都能统一的管理。
1. 初次见面 module_init 是 linux kernel 绝大多数模块的起始点。我们所熟悉的应用程序都是从一个 ...
使用module_platform_driver宏时,还需要在模块初始化函数中调用它,如下所示: c Copy code static int __init my_driver_init(void) { return module_platform_driver(my_platform_driver); } 在模块退出函数中,不需要调用platform_driver_unregister函数,因为这个函数已经被module_platform_driver宏自动提供了。©...
platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); 4)platform_driver 1◐ resource platform_device设备的注册过程必须在相应设备驱动加载之前被调用,因为驱动注册时需要匹配内核中所以已注册的设备名。platform_device 是在系统启动时在init.c 里的s3c_arch_init() 函数里进行注册的。这个函...
这个init_post中的第一句就是free_initmem(),就是用来释放初始化代码和数据的。voidfree_initmem(void...
4.10 电话面 吃饭的点打的电话 大概问了问项目 还有一些简单的八股 4.24 一面 开发字符设备的流程 module_init具体的工作 init_call的作用 为什么要分级 platform_driver 和 设备树怎么匹配的? 匹配的优先级有哪些? 不用device的ma...