【2】OMAP335X-内核BSP之资源注册那些事.

来源:互联网 发布:知乎创始人周源 编辑:程序博客网 时间:2024/06/05 10:19

PC 系统 :ubuntu10.04

MPU平台:OAMP3352

内核版本:3.2.0

     声明:我讲解的范畴是从内核解压以后经过汇编代码执行最后跳到第一个C代码这个点开始讲解,一直讲到文件系统被正确的挂载起来,用户可以正常登入!至于之前的解压缩内核、汇编启动代码我会以后另开文章讲解。

     目标:本文想阐述清楚OAMP335X这个平台的BSP部分的设备注册过程。

第一步:  

 在上一讲中介绍了BSP的启动过程,明确了这个启动过程对我们有什么样的帮助呢?

第一点:有利于我们的调试,对于内核起不来的开发者就有思路了,至少可以作为一个参考思路。

第二点:让我们写驱动代码或系统工程师知道但前哪些设备的资源是被注册进内核的,让我们知道每种片内资源注册的先后顺序情况。

第三点:让我们更容易的找到自己想要的代码。

在上一节中我们知道在板级代码的初始化中,是有先后的初始化顺序的,那么我们看看在AM3352上面BSP代码中先后初始化了哪些设备。

第一级的初始化:pure_initcall()

没有

第二级的初始化:core_initcall()

omap_hwmod.c:  core_initcall(omap_hwmod_setup_all);

omap_device.c:   core_initcall(omap_device_init);

serial.c:         core_initcall(omap_serial_early_init);

第三级的初始化:core_initcall_sync()

没有

第四级的初始化:postcore_initcall()

devices.c: postcore_initcall(omap3_l3_init);

devices.c: postcore_initcall(omap4_l3_init);

pm.c:  postcore_initcall(omap2_common_pm_init);

gpio.c: postcore_initcall(omap2_gpio_init);

第五级的初始化:postcore_initcall_sync()

omap_l3_smx.c:postcore_initcall_sync(omap3_l3_init);

第六级的初始化:arch_initcall()

clock3xxx.c:arch_initcall(omap3xxx_clk_arch_init);

devices.c:arch_initcall(omap2_init_devices);

dma.c:arch_initcall(omap2_system_dma_init);

pm-debug.c:arch_initcall(pm_dbg_init);

timer.c:arch_initcall(omap2_dm_timer_init);

devices.c:arch_initcall(omap_init_devices);

fb.c:arch_initcall(omap_init_fb);

dma.c:arch_initcall(omap_system_dma_init);

第七级的初始化:arch_initcall_sync()

没有

第八级的初始化:subsys_initcall()

devices.c:subsys_initcall(omap_init_wdt);

prm2xxx_3xxx.c:  subsys_initcall(omap3xxx_prcm_init);

i2c.c:subsys_initcall(omap_register_i2c_bus_cmdline);

mailbox.c:subsys_initcall(omap_mbox_init);

第九级的初始化:subsys_initcall_sync()

没有

第十级的初始化:fs_initcall()

kernel/setup.c:fs_initcall(proc_cpu_init);

mm/dma-mapping.c:fs_initcall(dma_debug_do_init);

mm/alignment.c:fs_initcall(alignment_init);

第十一级的初始化:fs_initcall_sync()

没有

第十二级的初始化:rootfs_initcall()

drivers/iommu/intr_remapping.c:rootfs_initcall(ir_dev_scope_init);

init/initramfs.c:rootfs_initcall(populate_rootfs);

init/noinitramfs.c:rootfs_initcall(default_rootfs);

第十三级的初始化:device_initcall()

arch/arm/mach-omap2/cpuidle33xx.c:device_initcall(am33xx_cpuidle_init);

arch/arm/mach-omap2/opp3xxx_data.c:device_initcall(omap3_opp_init);

arch/arm/mach-omap2/mailbox.c:device_initcall(omap2_mbox_init);

第十四级的初始化:device_initcall_sync()

没有

第十五级的初始化:late_initcall()

mach-omap2/pm33xx.c:late_initcall(am33xx_pm_init);

mach-omap2/board-m3352.c:late_initcall(backlight_init);

mach-omap2/mux.c:late_initcall(omap_mux_late_init);

mach-omap2/pm.c:late_initcall(omap2_common_pm_late_init);

plat-omap/clock.c:late_initcall(clk_disable_unused);

plat-omap/clock.c:late_initcall(omap_clk_enable_autoidle_all);

plat-omap/clock.c:late_initcall(clk_debugfs_init);

第十六级的初始化:late_initcall_sync()

没有

第十七级的初始化:__initcall()

没有

第十八级的初始化:__exitcall()

没有

第十九级的初始化:console_initcall()

没有

第二十级的初始化:security_initcall()

没有

好了终于结束了一共有20级别,我这个只是arch下面对应的20个级别的代码,要是放整个内核几乎让人崩溃!还好我没崩溃!

好了我们看一下几个和本文相关的几个重要的函数:

omap_hwmod.c:  core_initcall(omap_hwmod_setup_all);

omap_device.c:   core_initcall(omap_device_init);

serial.c:         core_initcall(omap_serial_early_init);

------------------------------------------------------------------------

devices.c: postcore_initcall(omap3_l3_init);

devices.c: postcore_initcall(omap4_l3_init);

pm.c:  postcore_initcall(omap2_common_pm_init);

gpio.c: postcore_initcall(omap2_gpio_init);

------------------------------------------------------------------------

omap_l3_smx.c:postcore_initcall_sync(omap3_l3_init);

------------------------------------------------------------------------

clock3xxx.c:arch_initcall(omap3xxx_clk_arch_init);

devices.c:arch_initcall(omap2_init_devices);

dma.c:arch_initcall(omap2_system_dma_init);

pm-debug.c:arch_initcall(pm_dbg_init);

timer.c:arch_initcall(omap2_dm_timer_init);

devices.c:arch_initcall(omap_init_devices);

fb.c:arch_initcall(omap_init_fb);

dma.c:arch_initcall(omap_system_dma_init);

------------------------------------------------------------------------

devices.c:subsys_initcall(omap_init_wdt);

prm2xxx_3xxx.c:  subsys_initcall(omap3xxx_prcm_init);

i2c.c:subsys_initcall(omap_register_i2c_bus_cmdline);

mailbox.c:subsys_initcall(omap_mbox_init);

------------------------------------------------------------------------

arch/arm/mach-omap2/cpuidle33xx.c:device_initcall(am33xx_cpuidle_init);

arch/arm/mach-omap2/opp3xxx_data.c:device_initcall(omap3_opp_init);

arch/arm/mach-omap2/mailbox.c:device_initcall(omap2_mbox_init);

------------------------------------------------------------------------

mach-omap2/pm33xx.c:late_initcall(am33xx_pm_init);

mach-omap2/board-m3352.c:late_initcall(backlight_init);

mach-omap2/mux.c:late_initcall(omap_mux_late_init);

mach-omap2/pm.c:late_initcall(omap2_common_pm_late_init);

plat-omap/clock.c:late_initcall(clk_disable_unused);

plat-omap/clock.c:late_initcall(omap_clk_enable_autoidle_all);

plat-omap/clock.c:late_initcall(clk_debugfs_init);

------------------------------------------------------------------------

接下来只能老老实实的一部分一部分的分析吧

总结: 通过本文的分析 我们至少明确了 BSP在启动的过程中是先后启动了一系列的初始化函数有核心级的、有体系级的、有系统级的、有设备级等 接下来的文章介绍每一部分。