深入剖析barebox(U-BOOT-II)在i.MX27上的移植
# can be either 'nfs', 'tftp', 'nor' or 'nand'
kernel_loc=nand :内核的加载路径,可以支持tftp加载serverip的上的内核,或者从nand中启动
# can be either 'net', 'nor', 'nand' or 'initrd'
rootfs_loc=nand :rootfs的加载路径,可以支持从nfs启动,或则从本机的nand启动
支持zImage和uImage,raw,raw_lzo类型的内核
# The image type of the kernel. Can be uimage, zimage, raw, or raw_lzo
#kernelimage_type=zimage
#kernelimage=zImage-$machine
kernelimage_type=uimage
kernelimage=uImage-$machine
#kernelimage_type=raw
#kernelimage=Image-$machine
#kernelimage_type=raw_lzo
#kernelimage=Image-$machine.lzo
修改后,如果需要保存到flash中,则必须输入save命令即可。
如何更新barebox,内核,以及文件系统
Update –t barebox –d nand
通过tftp从服务器上取得barebox.bin文件,并且重新写入到barebox所在的分区。
Update –t kernel –d nand : 下载并烧写内核
Update –t rootfs –d nand :下载并烧写文件系统
Barebox的链接文件
arch\arm\mach-imx\include\mach\barebox.lds.h 定义了内部启动模式下的映像头部信息
#ifdef CONFIG_ARCH_IMX_INTERNAL_BOOT
#define PRE_IMAGE \
.pre_image : { \
KEEP(*(.flash_header_start*)) \
. = 0x100; \
KEEP(*(.flash_header_0x0100*)) \
KEEP(*(.dcd_entry_0x0100*)) \
KEEP(*(.image_len_0x0100*)) \
. = 0x400; \
KEEP(*(.flash_header_0x0400*)) \
KEEP(*(.dcd_entry_0x0400*)) \
KEEP(*(.image_len_0x0400*)) \
. = 0x1000; \
KEEP(*(.flash_header_0x1000*)) \
KEEP(*(.dcd_entry_0x1000*)) \
KEEP(*(.image_len_0x1000*)) \
. = 0x2000; \
}
#endif
include\asm-generic\ barebox.lds 中定义了链接节定义宏,可以方便的定义一些预定义节
被定义在这些节中的函数在common/startup.c中的startup函数中被调用,调用的顺序是从小到大也就是.initcall.0到.initcall.11这样可以保证优先级最高的函数最先被调用
#define INITCALLS \
KEEP(*(.initcall.0)) \
KEEP(*(.initcall.1)) \
KEEP(*(.initcall.2)) \
KEEP(*(.initcall.3)) \
KEEP(*(.initcall.4)) \
KEEP(*(.initcall.5)) \
KEEP(*(.initcall.6)) \
KEEP(*(.initcall.7)) \
KEEP(*(.initcall.8)) \
KEEP(*(.initcall.9)) \
KEEP(*(.initcall.10)) \
KEEP(*(.initcall.11))
这里定义了barebox的命令函数节,barebox中所有的命令函数被定义到了这个节中
#define BAREBOX_CMDS KEEP(*(SORT_BY_NAME(.barebox_cmd*)))
#define BAREBOX_SYMS KEEP(*(__usymtab))
Barebox的时钟源分析
Arch/arm/mach-imx/clocksource.c
通用定时器1被用作时钟源
static int clocksource_init (void)
{
int i;
uint32_t val;
/* setup GP Timer 1 */ 软复位定时器
writel(TCTL_SWR, timer_base + GPT_TCTL);
#ifdef CONFIG_ARCH_IMX21
PCCR1 |= PCCR1_GPT1_EN;
#endif
#ifdef CONFIG_ARCH_IMX27
PCCR0 |= PCCR0_GPT1_EN; 启用gpt1的ipg时钟
PCCR1 |= PCCR1_PERCLK1_EN; 启用外设1时钟
#endif
#ifdef CONFIG_ARCH_IMX25
writel(readl(IMX_CCM_BASE + CCM_CGCR1) | (1 << 19),
IMX_CCM_BASE + CCM_CGCR1);
#endif
for (i = 0; i < 100; i++)
writel(0, timer_base + GPT_TCTL); /* We have no udelay by now */
writel(0, timer_base + GPT_TPRER);
val = readl(timer_base + GPT_TCTL);
val |= TCTL_FRR | (1 << TCTL_CLKSOURCE) | TCTL_TEN; /* Freerun Mode, PERCLK1 input */
writel(val, timer_base + GPT_TCTL);
将时钟频率转化成倍数以便以后转化
cs.mult = clocksource_hz2mult(imx_get_gptclk(), cs.shift);
init_clock(&cs);
clock_register_client(&imx_clock_notifier);
return 0;
}
core_initcall(clocksource_init); 该函数在以优先级3startup.c中被调用
1.barebox一般不用clk_get和clk_enable来获取和设置时钟,而是直接在板级初始化文件中来初始化外设的时钟,或者在驱动中启动外设的时钟,为什么不用标准的clk_xx函数来管理啊?
文章评论(0条评论)
登录后参与讨论