1.banner 信息补全
从crt0.S看,找到board_init_f,然后找到Board.c (z:\uboot\uboot2013\u-boot-2013.10.bak\arch\arm\lib)。
找到init_sequence。
看下display_banner.
自己定义一个:
结果:
2.CPU信息补全
回到init_sequence。看下print_cpuinfo。
找到Cpu_info.c (z:\uboot\uboot2013\u-boot-2013.10.bak\arch\arm\cpu\armv7\s5p-common):int print_cpuinfo(void)。
问题分析
1)时钟显示ARMCLK是400MHz。
2)调试,把m、p、s和apll_ratio打印出来后,发现这几个值的设置和之前的uboot的设置是不同的。原因在于我们当前版本的uboot中并未对SoC的时钟进行过设置,当前uboot中的时钟是iROM代码默认设置的。
3)我自己之前一直认为iROM中把210的时钟设置为了1000MHz,然后三星版本的uboot中设置的时钟也是按照这个数据手册356页推荐的这个最佳性能配置时钟设置的。所以以前认为uboot中可以没有时钟设置也是一样的。
4)但是实际上不是这样的,实际上内部iROM中设置的时钟APLL输出是800MHz,ARMCLK是400MHz。如果uboot中不做时钟的设置实际得到的就是这个时钟。所以我们之前代码得到的结果是400MHz。
5)所以要解决这个时钟不对的问题,要在lowlevel_init.S中添加上时钟初始化的代码即可。
时钟初始化函数的添加
在lowlevel_init.S中移植system_clock_init函数,并且在s5p_goni.h中添加相关的宏定义参数,然后在lowlevel_init函数中调用system_clock_init函数。
移植结束,第一行打印:
我们继续看:
添加信息:把三星的uboot中的时钟信息移植过来。
同时移植三星的各个时钟函数:
例如:
但还是编译不通过,因为缺少了一个宏定义:CONFIG_SYS_CLK_FREQ,这个是使用的外部时钟,我们查下三星的uboot和原理图,然后自己定义24MHz:
编译通过,串口打印如下:
3.board名称更改
Goni.c (z:\uboot\uboot2013\u-boot-2013.10.bak\board\samsung\goni):int checkboard(void).
我们改成S5pv210。
I2C我们不看了。不需要的话可以把宏定义去掉。
4.内存大小显示
Goni.c (z:\uboot\uboot2013\u-boot-2013.10.bak\board\samsung\goni):int dram_init(void)。
还是在goni.c中。
宏定义在S5p_goni.h (z:\uboot\uboot2013\u-boot-2013.10.bak\include\configs),进行修改,我们只使用DCM1和DCM2。每个内存块是256MB。
上述结果:
5.关于MACH_TYPE的定义问题。
1)在uboot2013.10中和uboot1.3.4中设计有所不同。在uboot1.3.4中这个东西是分散定义在各个配置头文件当中的。但是在uboot2013.10中我们把MACH_TYPE集中定义在一个文件arch/arm/include/asm/mach-types.h中了。
2)集中定义其实是uboot从linux内核中学来的。在linux kernel中MACH_TYPE就是在文件中集中定义的。集中定义的好处是方便查阅,不容易定义重复。
3)这个MACH_TYPE是和开发板绑定的,原则上每一个开发板型号都有一个MACH_TYPE,这个机器码由linux内核管理者来分配的,如果需要应该向这些人申请。
在S5P_GONI.h中定义:
但后面board_init_f会再次定义,这里可以注释掉。
6.DDR初始化的代码并打印出来
删掉第三个。
6. board_init_r
Board.c (z:\uboot\uboot2013\u-boot-2013.10.bak\arch\arm\lib):void board_init_r(gd_t *id, ulong dest_addr)
注释掉enable_caches。
Goni.c (z:\uboot\uboot2013\u-boot-2013.10.bak\board\samsung\goni):int board_init(void)。
机器码不对,进行修改:
7. 去掉PMIC的代码
8去掉one nand的代码
但编译出错:
Goni文件夹Makefile中拿掉onenand.o。
重新编译:
Mmc.c (z:\uboot\uboot2013\u-boot-2013.10.bak\drivers\mmc):int mmc_initialize(bd_t *bis)
改成1通道: