追根溯源,从代码中看到,module_platform_driver最终还是调用了module_init,但是,又不仅仅是调用了module_init,还调用了platform_driver_register和platform_driver_unregister,这两个函数的作用就是注册和卸载平台驱动。 再来看看platform_driver_register /* include/linux/platform_device.h */ #defineplatform_driver_reg...
EXPORT_SYMBOL_GPL(__platform_driver_register); /** * platform_driver_unregister - unregister a driver for platform-level devices * @drv: platform driver structure */ void platform_driver_unregister(struct platform_driver *drv) { driver_unregister(&drv->driver); } EXPORT_SYMBOL_GPL(platform_dri...
先不看platform_driver_registerplatform_driver_unregister的具体实现,先看module_platform_driver,可以发现module_platform_driver依然是一个宏定义: // include/linux/device/driver.h#define module_driver(__driver, __register, __unregister, ...) \static int __init __driver##_init(void) \{ \return _...
方式二: /* module_platform_driver() - Helper macro for drivers that don't do* anything special in module init/exit. This eliminates a lot of* boilerplate. Each module may only use this macro once, and* calling it replaces module_init() and module_exit()*/#define module_platform_drive...
在阅读其他人编写的Linux驱动源码发现,最后驱动注册和注销时并未使用传统的“module_init”和“module_exit”,而是使用一个宏“module_xxx_driver”代替,如module_i2c_driver、module_spi_driver、module_platform_driver等等。 Linux驱动程序模型是“总线驱动”+“设备驱动”,比如i2c总线和i2c设备,spi总...
remove,// ...};module_i2c_driver(demo_i2c_drv);// plathform 驱动staticstructplatform_driver...
platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices)); 4)platform_driver 1◐ resource platform_device设备的注册过程必须在相应设备驱动加载之前被调用,因为驱动注册时需要匹配内核中所以已注册的设备名。platform_device 是在系统启动时在init.c 里的s3c_arch_init() 函数里进行注册的。这个函...
module_driver(__platform_driver, platform_driver_register, \ platform_driver_unregister) 这个宏接受一个platform_driver结构体作为参数,这个结构体必须包含probe函数和remove函数。然后,该宏定义了一个platform_driver_register函数和一个platform_driver_unregister函数,它们分别用于注册和注销平台驱动程序。这两个函数都...
static int __init axp288_extcon_init(void) { return platform_driver_register(&axp288_extcon_driver); } module_init(axp288_extcon_init); static void __exit axp288_extcon_exit(void) { platform_driver_unregister(&axp288_extcon_driver); } module_exit(axp288_extcon_exit); module_platform_dri...
voidkernel_init() { a_init(); b_init(); ... m_init(); } 但是,这种做法在RTOS系统中或许可以,对于 Linux 庞大的系统来说,驱动很多,不可能每添加一个驱动就会改动一下 kernel_init() 代码,这将会是一场灾难。 Linux 内核提供了解决方案: