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


    【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.03oard下面只保留SAMSUNG

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

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

        u-boot-2010.03includeconfigs下只保留smdk开头的文件

        在boardsamsung、includeasm-armarch-s3c64xx、includeconfigs、nand_sploardsamsung各目录下分别拷贝一份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点了,算了,太晚,明天继续。

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

      第一步猜想:

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

      第二版猜想:

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

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

           原来,/根目录下的u-boot.lds是编译的时候链接生成的,依赖的是oardsamsungsmdk6410下面的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链接脚本是通过 oardsamsungsmdk6410下的脚本生成的,如果要修改链接脚本,我们要修改该目录下的才会有作用。

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

  • 相关阅读:
    Java类变量和成员变量初始化过程
    Linux命令学习笔记
    gitlab本地部署方法(ubuntu16.04+gitlab9.5.5)
    Hanoi塔
    求递归算法时间复杂度:递归树
    最大堆/最小堆
    Matlab中plot基本用法
    这是一篇叼炸天的博客
    c++ static理解
    经典排序算法+文件操作~c语言实现
  • 原文地址:https://www.cnblogs.com/lixiaoming90/p/3657933.html
Copyright © 2020-2023  润新知