【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在启动的过程中是先后启动了一系列的初始化函数有核心级的、有体系级的、有系统级的、有设备级等 接下来的文章介绍每一部分。
- 【2】OMAP335X-内核BSP之资源注册那些事.
- 【1】OMAP335X-内核BSP之C代码启动那些事.
- 【3】OMAP335X-内核BSP之hwmod(一).
- 【3】OMAP335X-内核BSP之hwmod(二)
- BSP资源
- bsp资源
- Linux内核之内核资源
- WinCE BSP资源收集
- 关于窗口创建的那些事 之 内核剖析 读笔
- 02_内核那些事之uname命令
- linux内核之设备驱动那些事(1)
- BSP 之Bootloader开发(2)
- 内核及内核切换的那些事
- Linux那些事儿之我是Block层(2)注册一个块设备驱动
- Linux那些事儿之我是Block层(2)注册一个块设备驱动
- Linux那些事儿之我是Block层(2)注册一个块设备驱动
- Linux那些事儿之我是Block层(2)注册一个块设备驱动
- BSP之OAL
- delphi10进制转换成16进制
- 编程这件小事儿之C语言篇:C语言自学必备
- 计算单词的个数
- CentOS 环境下C/C++程序的开发
- Activity编辑框光标和键盘同时消失
- 【2】OMAP335X-内核BSP之资源注册那些事.
- cocos2d-x暂停和恢复游戏
- DBCS字符集
- Matlab与C/C++混合编程调用OpenCV
- C++标准库中的数学函数
- 细说PHP:人人都能玩转PHP和MySQL Web开发
- 一种可分级防丢包的视频压缩想法
- 教你用U盘安装原版Win7系统详细步骤
- 西南大学网络与继续教育学院课程考试试题卷