01
主要的平台环境
虚拟机环境 : 百问网的ubuntu16.04 x 64位
硬件平台 : JZ2440平台-采用的s3c2440,ARM9
uboot:2012-04-01
交叉编译工具链 : arm-linux-gcc-4.4.3
Kernel :Linux-3.4.2
文件系统 : yaffs2文件系统+busybox-1.22.1+tslib-1.4
QT版本 : qt-everywhere-opensource-src-5.6.0
02
uboot编译器前准备
首先我们可以到uboot官网下载其源码
然后获得百问网的补丁patch。
从uboot官网获得的是压缩包,需要进行解压获得uboot源文件:
tar jxvf u-boot-2012.04.01.tar.bz2
补丁就是对uboot源文件进行文件内容的修改等,以便适配硬件平台。
cd ./u-boot-2012.04.01
patch -p1 <../u-boot-2012.04.01_100ask.patch
由于我的硬件上NandFlash有几个区有坏块,所以我把内核分区加大,不然文件系统落在坏块处,无法被挂载,于是进行了uboot的分区修改,对u-boot-2012.04.01/include/configs/smdk2440.h下内核分区修改为了36M,如下图所示:
上面的"食材"准备好了,我们还需要"厨具"来进行做饭,编译器代码的编译器,由于最终编译出来的文件需要在S3C2440平台上执行,所以肯定就需要使用对应的编译器,不能使用ubuntu虚拟机自带的编译器。
编译器本质上就是一个软件,跟Keil或者IAR中的集成开发环境里的编译器是类似的,只是在linux里面一般不再通过图形化界面操作,而是通过命令行操作。
小哥已经把相应的arm-linux-gcc-4.4.3.tar压缩文件解压,相关的工具链就只在如下目录下:
/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/
也可以看到该目录下的工具,编译就靠他们了:
03
uboot编译
编译还是不难的,因为uboot支持非常多的单板,所以我们首先要配置编译选项,选择2440平台,命令如下:
make CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- smdk2440_config
因为小哥不想改变系统的环境变量,所以通过make指定了交叉编译工具的绝对路径来进行编译。
得到如下编译结果:
配置OK以后,我们就可以开始正式的源码编译,类似于我们IDE环境中的锤子,执行编译命令:
make CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux- -j8
这里原本可以不需要-j8选项就可以进行uboot源码的编译,而-j8表示并行编译,也就是最多进行8个编译指令同时执行,从而编译速度更快,同样-j4表示4条编译指令同时执行,一般都是在多核处理器下进行使用会有明显的加快效果。
最终我们可以得到u-boot.bin烧录文件。
最终我们可以得到u-boot.bin烧录文件。
bin文件对于玩单片机的朋友再熟悉不过了,其就是一个裸机程序,单任务顺序执行的程序。
有了一个烧录文件我们就可以烧录到开发板中运行测试了。
04
NorFlash烧录与启动
在开发板中没有其他程序的时候,对于JZ2440我们可以选择使用jlink烧录器把uboot.bin文件烧录到开发板的NorFlash中运行,其实与使用keil通过jlink烧录到单片机是类似的。
通过Jlink驱动中的jFlash软件工具,配置好芯片类型为ARM9,然后把前面编译好的uboot.bin文件加载到jFlash中,如上图所示。
然后点击菜单汇总的connect连接芯片。
如上图所示连接OK,可以首先全部擦除Flash(如果直接写入,可能存在写入失败的情况),然后再进行program,把bin文件烧写到NorFlash上,直到完成~
然后使用MobaXterm终端软件,使用Serial串口中断连接,确定拨码为NorFlash启动以后重启开发板,其开发板便会顺利打印相关信息。
在倒数未结束之前按回车即可进入uboot的命令行,跟我们的windows启动中的bios是类似的。
上图使用mtdparts命令行来查看目前uboot里面所配置的系统分区,其中uboot中的内核分区大小与我们前面的修改是一致。
05
NandFlash的启动原理
前面我们把uboot.bin文件烧录到NorFlash上,能够正确的启动,因为NorFlash能够支持代码运行的,CPU可以直接进行总线的读取,但是无法直接写入NorFlash,这点与单片机是类似的。
我们在进行stm32开发中程序一般都是在Flash上运行的,说明CPU可以直接读取指令进行运算,而单片机中的Flash写数据,一般都需要经过解锁,擦除,编程写入这三大步骤,而对于NandFlash是一种串行的数据读取方式,CPU无法直接通过总线进行读写工作。
那既然读写都不行,NandFlash该如何启动程序呢?
对于S3c2440有一个机制,当上电启动拨码选择的是NorFlash启动,则NorFlash地址映射在0x00000000处,并且CPU直接从NorFlash上启动程序。
当上电启动拨码选择的是NandFlash启动时,其芯片会把内部的SRAM地址映射在0x00000000处,同时其芯片内部会将NandFlash的前4K代码数据拷贝到SRAM进行执行,所以当uboot程序小于4K能够直接运行uboot,而当程序大于4K,那么超出4K部分的程序将无法直接得到运行。
出于这样的原因我们需要在程序运行超过4K之前把超出代码拷贝到可以运行的介质中进行运行,一般会选择SDRAM来运行,那么 制作一个既可以在NandFlash上运行又可以在NorFlash中运行的uboot ,主要把握两点:
1)如何判断启动的类型,是NorFlash还是NandFlash,由于NorFlash启动只能读不能写,而NandFlash启动会拷贝到SRAM中运行,所以其可读可写,这样就可以把两种启动方式区分开来。
2)NorFlash可以直接运行,而NandFlash上启动需要进行重定位,其实就是为了保证运行地址与拷贝以后的地址保持一致,这样代码才能够执行。
06
NandFlash启动
由于百问网的补丁已经做好了NandFlash启动的代码处理,这里我们只是操作一下如何把uboot.bin烧录到NandFlash并启动即可,细节暂时不详细过问。
1、首先还是要从NorFlash启动,进入uboot的命令行,输出printenv命令查看环境变量设置。
2、因为我们准备使用TFTP服务把uboot.bin文件拷贝到SDRAM中,然后再把SDRAM中的uboot.bin文件写入NandFlash上即可, 所以要设置好uboot的IP地址ipaddr与电脑的IP地址处于同一网段、服务器的IP地址serverip为电脑的IP ,如下是我们的电脑IP地址,所以通过使用setserverip 192.168.1.200来改变服务器IP地址,否则后面无法使用TFTP服务。
3、可能你会发现虽然开发板与电脑进行了连接,但是电脑上的网络标识仍然没有网络连接,因为uboot与主机只在uboot执行网络命令才会交互数据,所以电脑上看起来是没有网络连接的,不过当我们进行TFTP服务请求就会有网络连接状态显示了。
4、然后在电脑上打开TFTP服务软件,并且设置好所要传输的uboot.bin的路径。
5、回到uboot命令行,执行命令:tftp 0x30000000 u-boot.bin,从而从电脑中获得编译好的uboot放到SDRAM中的0x30000000开始的位置,传输过程如下图所示:
6、然后我们把准备写入NandFlash的Flash位置进行擦除和写入,如果你不太记得uboot所分区域,可以使用mtdparts命令进行查询分区,如下图所示,然后使用命令:nand erase 起始地址 擦除长度,来对uboot放置区域进行擦除。
6、最后将之前下载到SDRAM中的u-boot.bin文件进行烧录到NandFlash中,采用命令:nand write 源地址 目的地址 长度,如下图所示写入NandFlashOK。
7、然后通过把开发板的启动拨码拨到NandFlash启动,可以观察到终端有输出,这样开发板便从NandFlash启动成功了。
评论
查看更多