ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年3月20日 星期二

keep uboot splash as long as possible

其實是在找讓 uboot splash screen 清掉的code。
先是 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,很多地方會導致當機。

沒有留言:

標籤

網誌存檔