【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放在前面,经过修改如下:

	. = 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的分析过程了。

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. CentOS(minimal)+Nginx+php+mysql实现宿主访问虚拟机

    /* 1.先解决上网 1-1.参照联网状态文件 # cd /etc/sysconfig/network-scripts # vi ifcfg-eth0 1-2.编辑联网状态文件 详见图1-2 1-3. ...

  2. Vnstat: 简单实用的网络流量统计工具

    官方主页: http://humdi.net/vnstat # Ubuntu 安装: (其本上其它发行版的包管理程序中也都包含了这款软件,请自行安装) sudo apt-get install vns ...

  3. php的系统常量

    认识一下系统常量 系统常量是PHP已经定义好的常量,我们可以直接拿来使用,常见的系统常量有: (1)__FILE__ :php程序文件名.它可以帮助我们获取当前文件在服务器的物理位置. (2)__LI ...

  4. linux LVM 逻辑卷

    fdisk pvcreate vgcreate lvcreate 查看显示 创建 删除 扩容 激活 扫描查找 LV lvdisplay lvcreate lvremove lvextend lvcha ...

  5. C语言Printf格式

    使用printf打印时发现,如果数据类型和打印使用的类型不一致,结果就是混乱的. 这是因为printf本身并不进行数据的类型转换,他只是把输入按照给定的数据格式输出,如果二者不匹配,那么由于不同数据类 ...

  6. 無塵室(Clean Room)的級數標準規格

    無塵室又稱潔淨室,是將一定空間範圍內空氣的微塵粒子.有害氣體.細菌等之污染物控制在一定的數量內.無塵室的等級是以一立方英呎含有多少大於0.5um的微塵粒子來定義的.下表是根據「美國聯邦標準209D規格 ...

  7. C++ string实现原理

    C++程序员编码过程中经常会使用string(wstring)类,你是否思考过它的内部实现细节.比如这个类的迭代器是如何实现的?对象占多少字节的内存空间?内部有没有虚函数?内存是如何分配的?构造和析构 ...

  8. 清风注解-Swift程序设计语言

    前言 Apple 发布了全新的 Swift 程序设计语言,用来开发 iOS 和 OS X 平台的应用程序.其目的不言而喻:就是为了给老迈的 Objective-C 一个合适接班人!因此,不难预见,未来 ...

  9. poj2583---Series Determination

    #include <stdio.h> #include <stdlib.h> int main() { int x,y,z,a,b,c; while(scanf("% ...

  10. openstack 的 policy 问题。

    想写nova的policy的实现, 但是发现网上,有人写的很不错了. ref: http://blog.csdn.net/hackerain/article/details/8241691 但是,po ...