【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点亮,做如下修改:

  1. /* LED on only #8 */
  2. ldr r0, =ELFIN_GPIO_BASE
  3. ldr r1, =0x0001111
  4. str r1, [r0, #GPMCON_OFFSET]
  5.  
  6. ldr r1, =0x000aaa
  7. str r1, [r0, #GPMPUD_OFFSET]
  8.  
  9. ldr r1, =0x0000
  10. 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放在前面,经过修改如下:

  1. . = ALIGN(4);
  2. .text :
  3. {
  4. cpu/arm1176/start.o (.text)
  5. cpu/arm1176/s3c64xx/cpu_init.o (.text)
  6. ------------------add----------------------------
  7. board/samsung/smdk6410/lowlevel_init.o (.text)
  8. lib_arm/board.o (.text)
  9. ------------------end---------------------------
  10. *(.text)
  11. }

但是在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的分析过程了。

S3C6410嵌入式应用平台构建(一)的更多相关文章

  1. S3C6410嵌入式应用平台构建(六)——linux-3.14.4移植到OK6410-(Yaffs2文件制作)

    本文主要讲怎用利用yaffs2工具和busybox制作yaffs2文件系统镜像.大多数都是参照网上的,目的在于记录学习,不做任何用途. 一.制作mkyaffs2image工具 进入yaffs2源码目录 ...

  2. S3C6410嵌入式应用平台构建(三)

    构建了好久的系统,由于工作原因,没有及时写记录,目前我已经进展到构建yaffs2文件系统,启动Linux内核了.Uboot移植基本功能已经完成. 由于Uboot移植方法大致是一样的,我主要参考这位博友 ...

  3. S3C6410嵌入式应用平台构建(五)——linux-3.14.4移植到OK6410-(Nand分区问题)

    前一篇文章,我们的Linux能后启动了,只是在识别nand时候,没有获取到时钟源,导致后面的分区没哟进行. 我们从启动的log发现: [06/08-11:25:41:371]s3c24xx-nand ...

  4. S3C6410嵌入式应用平台构建(四)——linux-3.14.4移植到OK6410-(初步启动)

    这次,还是把基本的基于我目前最新的Linux源码进行移植到OK6410吧,同时也写下我移植过程中遇到的问题及解决方法,不过有些方法是借鉴网上的,有些是自己加的,会有一些小bug. 一.基本工作 1. ...

  5. S3C6410嵌入式应用平台构建(二)

    [2014-4/11~4/14]经过之前的实验,对Uboot已经有了大体的了解,前我们已经把led灯给点亮,但这不是我们的根本目的,我们是要进入boot启动,经过两天的分析代码和反复的实验,终于可以进 ...

  6. Unity跨平台C/CPP动态库编译---可靠UDP网络库kcp基于CMake的各平台构建实践

    1.为什么需要动态库 a)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. b)某 ...

  7. 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目

    大家好 , 我发起了一个 用 物理服务器 和 .Net 平台 构建云平台 的 .Net 开源项目 . 对 , 用 物理服务器 和 .Net 平台 构建 云平台 . 通过 .Net 构建 分布式 计算集 ...

  8. SharpGL学习笔记(一) 平台构建与Opengl的hello World

    (一)平台构建与Opengl的hello World OpenGL就是3d绘图的API,微软针和它竞争推出D3D,也就是玩游戏时最常见的DirectorX组件中的3d功能. 所以不要指望windows ...

  9. Unity3D跨平台动态库编译---记kcp基于CMake的各平台构建实践

    一 为什么需要动态库 1)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. 2)某 ...

随机推荐

  1. jsp 配置MySQL服务器 以及数据的插入和读取

    不多说,直接上代码.百度上面也是一大堆,大家多问百度就行. 在利用JDBC访问数据库过程中,主要涉及三种资源:对数据库的连接的连接对象Connection,SQL语句对象 Statement,访问结果 ...

  2. python3--(变量)

    变量: Python 是动态类型语言, 也就是说不需要预先声明变量的类型.变量是对象的引用,变量只是将指针指向了对象所在的内存地址.变量的类型和值在赋值那一刻被初始化. 变量起名: 1.显式--> ...

  3. Sencha Touch 之 Ext.fly方法的使用

    Ext.fly方法是Ext.js 4中的flyweight技术,该技术在浏览器中为使用Ext.fly方法的元素节点开辟一块内存,下一次使用Ext.fly方法的元素节点将占据同一块内存,即覆盖前一次的元 ...

  4. Oracle EBS-SQL (SYS-23):用户权限查询.sql

    select b.user_name, b.description, b.creation_date, d.responsibility_name   from fnd_user b, fnd_use ...

  5. WEB Application Development Integrator : 应用设置

    1.1.       系统安装 应用 Oracle EBS WEB Application Development Integrator WEB ADI在Oracle EBS 11.5.10.* 版本 ...

  6. leetcode_question_115 Distinct Subsequences

    Given a string S and a string T, count the number of distinct subsequences of T in S. A subsequence ...

  7. Android采用HttpClient下载图片

    在上一章中谈到Android采用HttpURLConnection下载图片,本章使用HttpClient下载图片 HttpURLConnection与HttpClient的差别: HttpClient ...

  8. Java SSH框架学习(入门)

    SSH就是 struts+spring+hibernate 的一个集成框架,是java中一种流行的JAVA WEB 应用程序开源框架.由于我最熟悉的还是ASP.NET的的MVC和Python的Djan ...

  9. hahahahah

    dsfsefesfsffsfsfsfsfesfsfsfsfsfsfspackage realm;   import java.util.ArrayList; import java.util.List ...

  10. 20141014C#面向对象抽象方法,抽象类,接口

    里氏代换原则.可以用子类的对象替代父类的对象. 抽象依赖原则.依赖——形参,关联 一.抽象方法: 在一些父类中,某些行为不是非常明确,因此无法用代码来具体实现,但是类必须具备此方法,因此把这样的方法定 ...