环境:
uboot-2012.04
linux-3.4.2
***************************************************************************************************************************
若uboot和内核版本源码所支持的默认配置文件不包括要移植单板的型号,则该uboot和内核修改时,只有其核心功能可以使用,外围功能都不能使用!
**********************************************************************************************************************************
一、uboot移植步骤:
只需修改三处即可成功配置和编译:
1、board/sansung/:cp smdk2410/ smdk2440 -rf 、mv smdk2410.c smkd2440.c
2、include/configs/: cp smdk2410.h smdk2440.h //ubootdanb单板相关配置文件很关键,uboot裁剪及很多配置都在此文件 中修改
3、vi boards.cfg: 添加smdk2440信息
4、配置 make smdk2440_config //在单板名后加“_config”
5、编译 make
*****************************配置、编译 success!*****************************************************************
但是烧写单板不成功,调试:
6、uboot配置、编译通过后,要烧写到新单板上运行,必须修改设置适合新单板的CPU时钟设置和内存时钟设置;
主要是针对CPU时钟和内存进行设置:
1)CPU时钟设置:
start.S中先以60MHz时钟参数来设置内存控制器,但是CPU时钟MPLL还未设置;
改进:在arch/arm/cpu/arm920t/start.S中添加时钟分频系数设置和CPU时钟设置,(删除start.S中原分频系数设置,并取消board_init_f到init_sequence到board_early_init_f中对MPLL的设置)
2)内存时钟设置:
在cpu_init_crit到lowlevel_init到SMRDATA:修改13个内存控制器寄存器数据;
3)乱码现象:修改串口波特率
在board_init_f到init_sequence到serial_init到serial_init_dev到serial_setbrg到get_pclk到get_pclk:发现需要定义CONFIG_S3C2440;
改进:在include/configs.smdk2440.h中:
添加 #define s3c2440_CONFIG
删除 #define s3c2410_CONFIG
4)修改乱码后编译uboot报错,关于nand
改进:在include/configs.smdk2440.h中:
屏蔽/* #define CONFIG_CMD_NAND*/
5)重新编译烧写单板,有正确串口信息输出
但提示:WARNING:Cache not enable
Flash:***failed ***
###ERROR### Please RESET the board### //说明不支持flash
********************************************************************************************************************************
接下来进行uboot的flash设置
7、uboot支持nand启动的设置
8、uboot支持DM9000网卡的设置
9、uboot环境变量的设置
uboot执行时会读取设置的环境参数,并判断是否有效,若有效则用,若无效则使用默认环境参数;
注:在uboot界面使用命令擦除环境参数分区,即可是uboot使用默认环境参数
nand erase 40000 20000
1)默认环境参数配置在common/env_common.c中default_environment[ ]该数组包含了所有默认启动环境参数:bootargs、 bootcmd、ipaddr、serverip、ethaddr等,这些默认环境参数的具体配置均在include/configs/smdk2440.h中添加宏定义来 设置。
2)uboot环境参数是在include/configs/smdk240.h中添加设置:
#define CONFIG_BOOTARGS "console=ttySAC0,115200 root=/dev/mtdblock3"
#define CONFIG_BOOTCMD "nand read.jffs2 30000000 60000 200000; bootm 30000000"
smdk2440.h中还可以添加其它启动配置参数的hong宏定义
3)在smdk2440.h中可以添加设置uboot分区mtdparts的宏定义:
#define CONFIG_CMD_MTDPARTS
#define CONFIG_CMD_DEVICE
#define MTDIDS_DEFAULT "nand0=jz2440-0" //名字可以随便写
#define MTDPARTS_DEFAULT "mtdparts=jz2440-0:256k(u-boot)," \
"128k(params)," \
"2m(kernel)," \
"-(rootfs),"
此外需要在board.c中tian添加:
mtdparts_init();
run_command("mtdparts default", 0);
uboot划分分区之后就可以在uboot界面使用mtdparts命令chak查看分区,也可以使用分区名代替地址进行擦除烧写;
**************************************************************************************************************************
kernel移植步骤:
1、修改顶层Makefile:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2、find ./ -name "*defconfig" //查找内核默认支持哪些单板配置文件
例:有s3c2410_defconfig
3、配置
make s3c2410_defconfig
在此基础上,参考.config文件执行make menuconfigjinx进行裁剪配置:
{注:
1)kernel裁剪主要就是在make menuconfig界面进行peiz配置,
而且主要是针对编译进内核的-y选项进行取消来裁剪或添加来设置功能,
-m选项是编译成模块的,不bian编译进内核,不影响uImage大小;
2)内核裁剪一般主要是针对三大类进行取消设置来裁剪:
a)system type //单板board类型相关
b)file systems //文件系统leix类型相关
c)device drivers //设备驱动相关
}
在.config文件中可以查看其支持的CPU类型;
4、编译 make uImage
注:若编译失败,有可能是交叉编译工具链arm-linux-gcc版本不匹配问题
在内核中修改分区:
arch/arm/mach-s3c24xx/common-smdk.c中:
smdk_default_nand_part[ ]
注:内核与uboot的分区大小必须一致。
bootloader 256k
params 128k
kernel 2m
rootfs -
6、在uboot中修改机器ID:
在arch/arm/mach-s3c24xx/mach-smdk2440.c:
修改s3c24xx_init_clock(16934400)为
s3c24xx_init_clock(12000000)
******************************************************************************************************************************************
*************************************************************************************************************************************