platform device注册顺序
在linux2.6设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动。相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的。
一个现实的Linux 设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI 等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC 系统中集成的独立的外设控制器、挂接在SoC 内存空间的外设等确不依附于此类总线。基于这一背景,Linux 发明了一种虚拟的总线,称为platform 总线。SOC系统中集成的独立外设单元(LCD,RTC,WDT等)都被当作平台设备来处理,而它们本身是字符型设备。
platform_driver_register(struct platform_driver *drv) --> driver_register(struct device_driver *drv) --> bus_add_driver(struct device_driver *drv)
一. 平台设备struct platform_device
以omap4430为例:kernel/arch/arm/mach-omap2/board-4430sdp.c
static struct platform_device sdp4430_disp_led = {
.name = "display_led",
.id = -1,
.dev = {
.platform_data = &sdp4430_disp_led_data,
},
};
struct platform_device nec_infrared_remote
= {
.name = "infrared-gpio",
.id = -1,
};
向系统添加platform device设备:
platform_add_devices(struct platform_device **devs, int num);
二. 平台驱动struct platform_driver
kernel/drivers/input/iabox-ir.c:
static struct platform_driver infrared_gpio_driver
= {
.probe = infrared_gpio_probe,
.remove = infrared_gpio_remove,
.suspend = infrared_gpio_suspend,
.resume = infrared_gpio_resume,
.driver = {
.owner = THIS_MODULE,
.name = "infrared-gpio",
},
};
驱动的注册:
static int __init infrared_receiver_init(void)
{
int ret;
ret = platform_driver_register( &infrared_gpio_driver);
if(!ret)
printk(KERN_INFO"infrared gpio receiver driver\n");
return ret;
}
本文介绍了Linux 2.6设备模型中的平台设备注册顺序。在Linux系统中,平台设备和驱动通过platform总线进行绑定。文章详细讲解了如何注册平台设备`platform_device`,如在OMAP4430中的例子,并展示了如何添加设备到系统。同时,阐述了平台驱动`platform_driver`的注册过程,以`infrared_gpio_driver`为例,包括`probe`、`remove`等回调函数,并提供了驱动注册的代码示例。
354

被折叠的 条评论
为什么被折叠?



