先是 bootloader :
diff --git a/cpu/arm_cortexa8/cpu.c b/cpu/arm_cortexa8/cpu.c
index ac7ac13..1e3c940 100644
--- a/cpu/arm_cortexa8/cpu.c
+++ b/cpu/arm_cortexa8/cpu.c
@@ -137,8 +137,8 @@ int cleanup_before_linux(void)
unsigned int i;
#ifdef CONFIG_VIDEO_MX5
- ipu_disable_channel(MEM_BG_SYNC);
- ipu_uninit_channel(MEM_BG_SYNC);
+// ipu_disable_channel(MEM_BG_SYNC);
+// ipu_uninit_channel(MEM_BG_SYNC);
#endif
這兩行 code 會 disable ipu.然後是 kernel:
arch/arm/mach-mx5/mx51_babbage.c:
/*
* The following uses standard kernel macros define in arch.h in order to
* initialize __mach_desc_MX51_BABBAGE data structure.
*/
/* *INDENT-OFF* */
MACHINE_START(MX51_BABBAGE, "Freescale MX51 Babbage Board")
/* Maintainer: Freescale Semiconductor, Inc. */
.phys_io = AIPS1_BASE_ADDR,
.io_pg_offst = ((AIPS1_BASE_ADDR_VIRT) >> 18) & 0xfffc,
#ifdef CONFIG_ANDROID_PMEM
.fixup = fixup_android_board,
#else
.fixup = fixup_mxc_board,
#endif
.map_io = mx5_map_io,
.init_irq = mx5_init_irq,
.init_machine = mxc_board_init,
.timer = &mxc_timer,
MACHINE_END
所以timer 是 mxc_timer然後 timer init 的 code 是:
static void __init mx51_babbage_timer_init(void)
{
struct clk *uart_clk;
/* Change the CPU voltages for TO2*/
if (mx51_revision() == IMX_CHIP_REVISION_2_0) {
cpu_wp_auto[0].cpu_voltage = 1175000;
cpu_wp_auto[1].cpu_voltage = 1100000;
cpu_wp_auto[2].cpu_voltage = 1000000;
}
mx51_clocks_init(32768, 24000000, 22579200, 24576000);
uart_clk = clk_get_sys("mxcintuart.0", NULL);
early_console_setup(UART1_BASE_ADDR, uart_clk);
}
static struct sys_timer mxc_timer = {
.init = mx51_babbage_timer_init,
};
結果是在 arch/arm/mach-mx5/clock.c : mx51_clocks_init :
__raw_writel(0, MXC_CCM_CCGR1);
__raw_writel(0, MXC_CCM_CCGR2);
__raw_writel(0, MXC_CCM_CCGR3);
__raw_writel(1 << MXC_CCM_CCGRx_CG8_OFFSET, MXC_CCM_CCGR4);
__raw_writel(1 << MXC_CCM_CCGRx_CG2_OFFSET |
1 << MXC_CCM_CCGR5_CG6_1_OFFSET |
1 << MXC_CCM_CCGR5_CG6_2_OFFSET |
3 << MXC_CCM_CCGRx_CG7_OFFSET |
1 << MXC_CCM_CCGRx_CG8_OFFSET |
3 << MXC_CCM_CCGRx_CG9_OFFSET |
1 << MXC_CCM_CCGRx_CG10_OFFSET |
3 << MXC_CCM_CCGRx_CG11_OFFSET, MXC_CCM_CCGR5);
__raw_writel(1 << MXC_CCM_CCGRx_CG4_OFFSET, MXC_CCM_CCGR6);
這一段 code ,應該是把 ipu 的 clock 關掉了..加上
3 << MXC_CCM_CCGRx_CG5_OFFSET
把 IPU的 clock 也打開後,這一段就不會 clean splash screen。... 但是後面還有人把 splash screen clean..
在 init/main.c : do_initcalls( )。還是會把 screen clean 掉。
這個 function call 是一一呼叫 所有 driver 的 init function。
for (fn = __early_initcall_end; fn < __initcall_end; fn++) {
do_one_initcall(*fn);
}
查 System.map,可以知道 __early_initcall_end 到 __initcall_end 之間有多少 function.. 518...
姊果是在 cpu_freq,這個disable dvfs 後,舊可以拿掉。
然後.. 卡在 board_io_init....
其實光是把 bootloader disable ipu 的code 拿掉,就有機會在kernel boot 到 cpufreq 時當機,,,
因為 IPU 的 clock 牽扯很多 system clock,所以要維持住 splash screen,不關閉 ipu clk,很多地方會導致當機。
沒有留言:
張貼留言