尽管三星的s3c2440是一款非常老的芯片,但是它使用的uboot和linux kernel这两个软件却一直在迭代,当我搞韦东山jz2440这个开发板时,我决定自己搞一套高版本的uboot来并且在mac上移植和编译,增加一些挑战的趣味性,所以我下载的u-boot版本是u-boot-2016.07-rc2。对照韦东山的嵌入式Linux完全开发手册来进行移植,当然,因为版本不同,很多地方有区别甚至是冲突,这些需要自己辨别了。
开发环境 系统:MacOSX EI captain开发板:韦东山jz2440
下载工具:jlink
uboot版本:u-boot-2016.07-rc2 移植过程
顾名思义,uboot是一段引导代码,这段代码启动了存储在nand flash里的linux内核,所以它是我们要解决的第一部分代码。这部分代码更接近于底层,幸运的是u-boot这个开源框架给我们已经提供了大量范例和支持,稍加修改就可以应用在自己的开发板里了。一个。
观察下结构新的版本u-boot风格明显向linux内核看齐了:

.
├── Kbuild
├── Kconfig
├── Licenses
├── MAINTAINERS
├── MAKEALL
├── Makefile
├── README
├── api
├── arch 架构文件夹
│ ├── arc
│ ├── arm
│ │ ├── cpu
│ │ ├── dts
│ │ ├── imx-common
│ │ ├── include
│ │ ├── lib
│ │ ├── mach-at91
│ │ ├── mach-bcm283x
│ │ ├── mach-davinci
│ │ ├── mach-exynos
│ │ ...
│ │ ├── mach-smdk2410 三星的开发板,我们的主要修改目标
│ │ └── mach-integrator
│ ├── avr32
│ ...
│ ├── mips
│ ├── openrisc
│ ├── powerpc
│ └── x86
├── board 我们要在这个文件夹下加入自己的板子的支持
├── cmd
├── common
├── config.mk
├── configs 这里面要加入自己的编译选项
├── disk
├── doc
├── drivers
├── dts
├── examples
├── fs
├── include 头文件文件夹也是要增加内容
├── lib
├── net
├── post
├── scripts
├── snapshot.commit
├── test
└── tools 尝试编译
当选定我们需要的配置文件以后,就可以参考编译Linux内核的方法make xxx_defconfig 来生成我们需要的.config文件,这个命令会使用工具从顶层的Kconfig开始往下读取对应的Kconfig配置选项,生成.config文件。当然,生产.config文件以后,我们也可以使用make menuconfig来根据需要对配置文件进行修改。下面演示一下smdk2410的编译过程:
make smdk2410_defconfigmake
不过会出错的,因为这是使用默认的gcc编译而不是交叉编译工具链,应该传入编译链的参数,我的是arm-linux-gnueabihf-
make arch=arm CROSS_COMPILE=arm-linux-gnueabihf-
这样就编译成功了,我们开始在smdk2410(三星公版)针对自己的开发板进行修改,要改的不多。
清理一下前面的编译
make distclean
拷贝
cp configs/smdk2410_defconfig configs/arm2440_defconfig
修改编译目标这里拷贝一份smdk2410的配置文件,并将CONFIG_TARGET_SMDK2410=y 修改为 CONFIG_TARGET_MY2440=y, 这个值会指明编译的是哪个开发板
拷贝开发板配置及并进行修改,注意新版本uboot把smdk2410放到了samsung文件夹下
cp -r board/samsung/smdk2410/ board/homemade/my2440
我们知道,board目录下放的是已经支持的开发板相关的文件,其中包含SDRAM初始化代码(lowerlevel_init.S),板级初 始化文件(smdk2410.c)等,由于这个版本的uboot不支持我们的arm2440,所以需要自己创建一个,然而arm2440和smdk2410很相似,差异只是下面一些,所以只要以smdk2410作为副本来修改就好了,然后调整一下差异的代码。
s3c2440和s3c2410的主要区别是2440主频更高,其他的模块变化对我们移植uboot影响不大,值得注意的的是flash控制器改动比较大,芯片时钟寄存器有些变化
这一步拷贝了一份smdk2410文件夹,homemade是vendor(厂商)的名称,my2440是板子的名称,这两个值指明了开发板相关的文件路径,所以要修改board/homemade/Kconfig,使make my2440_defconfig 时能够获取正确的路径,修改如下:

line1:configs/arm2440_defconfig中定义的目标
line6:发行商的名称
line3:板子的名称
line9:芯片的名称
line12:配置文件名称
这几个值务必要正确,不然会直接影响到编译时能不能找到正确的目标文件路径,同时也可以查看.config文件是否有这些值.一定要记得修改第一行的if target_smdk2410啊!makefile会根据这个规则去自动生成头文件。
mv board/friendly/smdk2410.c borad/friendly/my2440.c这里不用修改值,下一篇文章中会介绍如何修改,主要还是时钟设置要改,因为从s3c2410换到2440
打开board/friendly/下的makefile obj-y := smdk2410.o改成my2440.o
cp include/configs/smdk2410.h include/configs/arm2440.h这里把第21行#define CONFIG_S3C2410换成#define CONFIG_S3C2440这个在下一篇文章时会遇到,我们定义一下就行。22行#define CONFIG_SMDK2410改成#define CONFIG_MY2440

修改arch/arm/Kconfig, 找到smdk2440的配置,复制并改成my2440的配置项

之后找到另一处含有smdk2410的地方source "board/samsung/smdk2410/Kconfig"下面加入一行
source "board/homemade/my2440/Kconfig"
再次编译
make arm2440_deconfigmake arch=arm CROSS_COMPILE=arm-linux-gnueabihf-
以上修改的是arch、board、configs、include/configs 下面的文件,多与平台相关
到这里,就能够编译出以arm2440为样本的u-boot.bin了,但是代码里面的内容都还是属于smdk2410的主要是时钟和flash,串口部分是兼容的,接下来需要修改一些参数,让image能够在arm2440板子上正常的运行。