S3C6410嵌入式应用平台构建(一)

时间:2023-03-08 17:06:32

【2014-4/8~4/10】目前我们已经积累一定的嵌入式相关知识,对嵌入式的架构及开发过程有了大体了解,唯一缺的就是实践,通过自己的分析搭建自己的嵌入式系统。下面,我将从此处开始记录我和我同学一起分析和实践的过程,我们利用下班回来的2~3个小时来一起分析及讨论,实践,对嵌入式的搭建过程中的细节进行分析,有些地方是借鉴别人,但我们肯定是先消化在去使用及优化。

之前我已经写了一篇博客关于Uboot移植到OK6410,但那是参照网上牛人移植的,说实话,当时并没有理解他为什么要那么修改,只是盲目的修改、修改,虽然移植的Uboot启动起来了,但是我对里面的细节并没有深入的去分析,这是我在大学时的失误,如今,借用工作之余的时间来详细分析分析,同时在后面也将借用搭建好的平台做小开发,希望我们能成功!

在我看来,基本的嵌入式平台除了硬件之外,系统方面的分为以下几个部分:

1. Bootloader----这个我们选择uboot,从网上下载通过修改相应代码适应我们的开发板

2. Linux Kernel----这就是Linux的移植了

3. 文件系统构建----这项涉及到Busybox,构建基本的Linux文件系统,Yaffs2文件系统较好

4. Qt界面----这上上层的了,后面应用程序基于此开发

5. 各种外设驱动

以上也是我们所要做的内容,看起来事情比较多,不过我们先一步一步来,先从Bootloader开始。

一、Uboot移植

基本的就不说了,可以先看下我之前写的那篇,有大概架构后,现在我们从零开始。

1. 准备工作。准备好源码,从官方FTP上下载的,把代码里面与arm无关的代码删掉,也就是说把以下代码路径,这样方便分析及减少代码量。

u-boot-2010.03\下lib_xxx只保留lib_arm 和 lib_genic

u-boot-2010.03\board下面只保留SAMSUNG

u-boot-2010.03\cpu下只保留arm开头的目录

u-boot-2010.03\include下asm_xxx只保留asm_arm 和 asm_genic

u-boot-2010.03\include\configs下只保留smdk开头的文件

在board\samsung、include\asm-arm\arch-s3c64xx、include\configs、nand_spl\board\samsung各目录下分别拷贝一份6400的并命名为6410,然后在进去修改后的文件中将其中的6400替换为6410,注意这里需要自己掂量了,需要保证替换后能编译过,没编译过说明就是没有替换正确。

修改根目录下的Makefile,仿照6400的配置,添加6410。详细的可以在前篇文章看看。

后面执行:make smdk6410_config;make

编译成功后,在根目录下会生成uboot.bin

-------------------------------------------------------------------------------------------------------

在此顺便带下:OK6410烧写uboot的方法:

(1)准备好已经按飞凌要求刻写的sd卡,其实就是把飞凌自己的uboot刻写到sd卡,调整开关使从sd卡启动

(2)连接好串口和usb,我们通过usb进行数据传输,打开dnw并配置好,开发板上电,按下空格键停在uboot命令状态下,进行下面操作:

smdk6410# dnw 50008000   (利用dnw下载到SDRAM内存当中),如果USB驱动装好后提示可以传输了,点菜单栏中找trasmit传输

smdk6410# nand erase 0 100000 (传输完成后,利用飞凌uboot命令,将nand flash的 0~1M空间擦除)

smdk6410# nand write.uboot 50008000 0 100000 (用write.uboot命令 将下载到内存中的uboot.bin写到nandflash 0~1M空间)

断点再上电,就可以了。

-------------------------------------------------------------------------------------------------------

2. 第一步修改:

为了验证自己的uboot是否能启动,因此修改lowlevel.S中初始化LED操作,对应OK6410,将所有的LED点亮,做如下修改:

	/* LED on only #8 */
ldr r0, =ELFIN_GPIO_BASE
ldr r1, =0x0001111
str r1, [r0, #GPMCON_OFFSET] ldr r1, =0x000aaa
str r1, [r0, #GPMPUD_OFFSET] ldr r1, =0x0000
str r1, [r0, #GPMDAT_OFFSET]

就这样,编译后烧写,发现上电启动,灯居然没有点亮!!!!!!!!!!!此时已经晚上1点了,算了,太晚,明天继续。

按理说,s3c6410在上电后,利用8K stepstone,会自动的将nandflash中的前8K,复制到内部SDRAM中去执行,也就是说至少等应该会点亮吧。

第一步猜想:

将lowlevel.S中的led操作复制到start.S的reset后面,这样应该会点亮吧,start都是第一个执行的,后面在烧写验证,依然是不亮。奇怪了!!!!!!

第二版猜想:

第二天,同学突然提醒说,字链接脚本当中,要把lowlevel.o放在cpu_init.o后面,我回去查看了下根目录下的u-boot.lds,果然没有将lowlevel.o放在前面,经过修改如下:

S3C6410嵌入式应用平台构建(一)S3C6410嵌入式应用平台构建(一)	. = ALIGN(4);
.text :
{
cpu/arm1176/start.o (.text)
cpu/arm1176/s3c64xx/cpu_init.o (.text)
------------------add----------------------------
board/samsung/smdk6410/lowlevel_init.o (.text)
lib_arm/board.o (.text)
------------------end---------------------------
*(.text)
}

但是在source_insight下搜索u-boot.lds,发现有三个,不清楚要修改哪个?后面经过多次实验,终于弄懂了。

原来,/根目录下的u-boot.lds是编译的时候链接生成的,依赖的是\board\samsung\smdk6410下面的u-boot.lds,因此我们只需要改这个文件就可以了,那么根据以上的链接脚本,我们也弄清为什么之前直接把led操作放在start.S中依然不亮了。。。。因为在start.S时,cpu还没有开始初始化,led当然不会亮了,如果我们放在cpu_init.o后面,点灯当然会亮了。

总结:

通过以上的实验及分析,理解了2点:

(1)s3c6410上电后,利用8K stepstone,会把nandflash前8K 复制到内部的8K sdram中,并跳到此位置去执行,如果想看点灯效果,需要在链接脚本当中去设置代码的存放位置,在8K以内;

(2)根目录下的u-boot.lds链接脚本是通过 \board\samsung\smdk6410下的脚本生成的,如果要修改链接脚本,我们要修改该目录下的才会有作用。

今天就写这点吧,目前才刚开始,点灯是我们的第一步,相当于开始学编程的写hello world一样,虽然这是小问题,但然我们懂了很多。下一篇,我要记录下对u-boot的分析过程了。