uboot版本:u-boot-1.1.6
交叉编译器:3.4.5
开发板:友善之臂mini2440
开发板配置:SoC s3c2440 、网卡 DM9000 、 Nor Flash AM29LV160DB (2M) 、NAND FLash (256M) 、SDRAM (64M)
1.移植准备工作
1)下载u-boot-1.1.6源码:
u-boot-1.1.6的官方下载地址为:ftp://ftp.denx.de/pub/u-boot/
我们需要下载的文件是:u-boot-1.1.6.tar.bz
2)解压u-boot-1.1.6源码到当前文件夹
解压命令是:# tar xvfj u-boot-1.1.6.tar.bz -C ./
3)进入u-boot-1.1.6目录开始移植工作
在当前目录下执行:# cd u-boot-1.1.6 回车,即可进入u-boot-1.1.6源文件目录。
4)测试源代码和编译环境
执行命令 :#make smdk2410_config后,系统显示:Configuring for smdk2410 board…。
执行命令:#make 后开始编译,编译完成,如何没有错误,则会生成u-boot.bin文件。
5)删除源文件目录里不需要的文件(此步骤可以不做),删除后文件结构更清晰
-
删除board目录下除smdk2410文件夹外的所有文件夹
#cd board
#rm -fr !(smdk2410)
#cd … -
删除cpu目录下除arm920t文件夹外的所有文件夹
#cd cpu
#rm -fr !(arm920t)
#cd … -
删除include/configs/目录下除smdk2410.h外的所有文件
#cd inclue/configs/
#rm -fr !(smdk2410.h)
#cd …
#cd … -
删除include/目录下除asm-arm文件夹外的所有asm-xxx文件夹
-
删除源文件根目录下除lib_arm和lib_generic文件夹外的所有lib_xxx文件夹
2.修改顶层Makefile,增加mini2440开发板配置选项
打开 源文件根目下的Makefile ,找到smdk2410板配置选项:
命令是#vim Makefile +1881
内容如下:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
各项参数意义:
arm:CPU架构
arm920t:CPU型号
smdk2410:开发板名称
NULL:开发者
s3c24x0:片上系统
参照此项添加mini2440的配置选项:
mini2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0
3.建立mini2440开发板相关主代码
1)找到 /board/smdk2410 目录,将此目录复制为 /board/mini2440 ,打开mini2440目录,将smdk2410.c文件重命名为mini2440.c。打开同目录下Makefile文件,修改代码
COBJS := smdk2410.o flash.o
改为
COBJS := mini2440.o flash.o
2)将include/configs目录下的smdk2410.h文件复制为mini2440.h
将以上步骤建立的代码编译测试:
#make mini2440_config
Configuring for mini2440 board…
#make
将生成u-boot.bin 下载至开发板运行,发现并未打印出任何信息。原因是2410和2440在频率设置方面有所不同。
4 修改CPU频率设置
1)打开 /board/mini2440/mini2440.c ,然后修改board_init函数
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
clk_power->CLKDIVN = 0x05; /* 1 : 4 : 8 */
__asm__( "mrc p15,0,r1,c1,c0,0\n"
"orr r1,r1,#0xc0000000\n"
"mcr p15,0,r1,c1,c0,0\n"
:::"r1"
);//异步总线
/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFF;
/* configure MPLL */
clk_power->MPLLCON = ((0x5c << 12) + (0x01 << 4) + 0x01); //400MHz
/* some delay between MPLL and UPLL */
delay (4000);
/* configure UPLL */
clk_power->UPLLCON = ((0x38 << 12) + (0x02 << 4) + 0x02); //48MHz
/* some delay between MPLL and UPLL */
delay (8000);
/* set up the I/O ports */
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00044555;
gpio->GPBUP = 0x000007FF;
gpio->GPCCON = 0xAAAAAAAA;
gpio->GPCUP = 0x0000FFFF;
gpio->GPDCON = 0xAAAAAAAA;
gpio->GPDUP = 0x0000FFFF;
gpio->GPECON = 0xAAAAAAAA;
gpio->GPEUP = 0x0000FFFF;
gpio->GPFCON = 0x000055AA;
gpio->GPFUP = 0x000000FF;
gpio->GPGCON = 0xFF95FFBA;
gpio->GPGUP = 0x0000FFFF;
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
icache_enable();
dcache_enable();
return 0;
}
2)串口初始化时需要获取系统时钟,这里修改 /cpu/arm920t/s3c24x0/speed.c ,
get_PLLCLK()中
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
改为
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
这是因为2410和2440主频计算公式的差异。
其他修改:
/* return HCLK frequency */
ulong get_HCLK(void)
{
return(get_FCLK()/4 );
}
/* return PCLK frequency */
ulong get_PCLK(void)
{
return(get_HCLK()/2 );
}
再次进行编译测试,烧录测试,出现打印信息:
U-Boot 1.1.6 (Feb 2 2019 - 15:45:14)
DRAM: 64 MB<