学习总结:

在linux2.6中引入platform的概念,包括platform_device与platform_driver结构。每个设备的资源(地址、中断号等)在platform_device中的resource中描述,resource结构在kernel/include/linux/ioport.h定义,resource资源一般都位于/arch/arm/mach-xxx中定义。开发设备驱动时,不但注册platform_device设备,还要注册platform_driver驱动。platform_device与platform_driver结构体中都有name成员,两个结构体的name成员必须匹配。驱动程序注册时找到与其name相同的platform_device后,调用其结构中的probe()函数进行相关初始化,probe()函数通过platform_get_resource()获取platform_device中的resource资源信息。在probe()可以进行字符设备的注册,包括file_optations成员的实现。从resource中可以通过platform_get_irq()获取其中资源的中断号(看具体定义是硬中断号还是软中断号),从而可以调用request irq()进行中断请求。在linux2.6之后,内核始祖Linus Torvalds发现内核充斥大量板级的垃圾代码而震怒,arm社区于是借鉴PowerPC引入设备树。将板级信息用设备树表示,通过uboot的解析之后传给linux内核。设备树描述了所有的板级信息,由platform_device与resource结构定义的一些实体都不再需要,内核会根据设备树的信息利用函数of_platform_bus_probe自动展开为驱动程序probe()函数的platform_device结构的入参,这样在probe()中就可以用platform_get_resource()获取资源。在进行中断注册时会与原来不同,没用设备树时从resource读出的中断号为软中断号,采用设备树时中断号为硬件中断号,这是需要利用irq_of_parse_and_map()进行动态分配软中断号,再利用request irq()进行中断请求。

Logo

更多推荐