原创 续:深入剖析barebox(U-BOOT-II)在i.MX27上的移植

2011-10-31 12:15 1836 12 12 分类: 消费电子

深入剖析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 :下载并烧写文件系统

1、Barebox链接技术详细分析

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函数来管理啊?

pll1.jpg

 

pll2.jpg

文章评论0条评论)

登录后参与讨论
我要评论
0
12
关闭 站长推荐上一条 /2 下一条