移植前的准备
下载 android_uboot_smdkv210.tar.bz2 这个文件,找不到可以去公众号回复
下载|三星uboot
开始移植
本人使用的开发板是九鼎的 x210,在三星 uboot 的主 Makefile 中找到了类似的 smdkv210 的相关配置,因为这些配置都差不多,就随便选择了 smdkv210single_config
在 make smdkv210single_config; make 执行之后进行 SD 卡烧录
源码中的 SD 卡烧录脚本 sd_fusing.sh 在本人的电脑上运行有问题,需要将 21 行开始的代码进行修改如下
// line 19
if [ $1 = $reader_type1 ]
then
# partition1="$11"
# partition2="$12"
# partition3="$13"
# partition4="$14"
partition1="$*1"
partition2="$*2"
partition3="$*3"
partition4="$*4"
在烧录后发现,串口没有信息输出,但是开发板供电锁存成功
开发板供电锁存是在 lowlevel_init.S 中进行的
可以判定 lowlevel_init.S 中有问题,需要进行修改
启动第一阶段
在 lowlevel_init.S 中发现了一段代码对开发板上不存在的 PMIC 的初始化,在注释后串口成功打印 ‘OK’
/* init PMIC chip */
// bl PMIC_InitIp
uboot 开始进入启动第二阶段,通过串口输出信息可以看出,虽然 uboot 启动成功,但是很多配置信息是错误的
时钟配置
系统时钟是通过 lowlevel_init.S 中的 system_clock_init 进行的
由于三星在移植 uboot 时已经设置好系统时钟了,相关的时钟配置也都以宏的方式定义在 smdkv210single.h 文件中了
所以时钟这一块不用自己操心
ddr 配置
在 uboot 启动信息中发现串口输出的信息中,DRAM 大小和开发板的不符合
DRAM: 1 G
在 smdkv210single.h 文件中找到 ddr 的相关的配置
将 ddr 的地址更改为 0x30000000 (改了可以让两个 ddr 的地址连续),更改 ddr 的大小
// #define MEMORY_BASE_ADDRESS 0x20000000
#define MEMORY_BASE_ADDRESS 0x30000000
...
#define CONFIG_NR_DRAM_BANKS 2 /* we have 2 bank of DRAM */
// #define SDRAM_BANK_SIZE 0x20000000 /* 512 MB */
#define SDRAM_BANK_SIZE 0x10000000 /* 256 MB */
#define PHYS_SDRAM_1 MEMORY_BASE_ADDRESS /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE SDRAM_BANK_SIZE
#define PHYS_SDRAM_2 (MEMORY_BASE_ADDRESS + SDRAM_BANK_SIZE) /* SDRAM Bank #2 */
#define PHYS_SDRAM_2_SIZE SDRAM_BANK_SIZE
...
然后是修改 ddr 的初始化参数
// #define DMC0_MEMCONFIG_0 0x20E01323 // MemConfig0 256MB config, 8 banks,Mapping Method[12:15]0:linear, 1:linterleaved, 2:Mixed
#define DMC0_MEMCONFIG_0 0x30F01323