【2】OMAP335X-核心BSP之資源註冊那些事.
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在啟動的過程中是先後啟動了一系列的初始化函式有核心級的、有體系級的、有系統級的、有裝置級等 接下來的文章介紹每一部分。