2011-02-24 23:14:57

我今天的移植将分如下3步。加上写记录文档,预计时间3小时。
一,不改变源码,完成编译。
二,修改源码,搭建一个U-boot的框架,完成编译。
三,修改源码,完成编译,下载到板上nandflash,驱动LED。

环境说明:主机win7,虚拟机WMware6.0.2( unt.10)+
unt.10默认配置的arm-linux-gcc.

烧录是在主机上完成,编译是在虚拟机完成。

实现第一步:(目标:对smdk2410的相关源码进行了验证可以通过编译,并且熟悉了编译过程。结果:成功。)
我的压缩包放在/linux/boot中,解压源码
#tar -jxvf u-boot-2010.06.tar.bz2
make smdk2410_config

接着就出现了问题一[已解决]

make: *** 没有规则可以创建目标“smdk2410_config”。 停止。

解决问题一:
自己感觉是没用arm-linux-gcc的问题,打开U-boot的README文件。
If you are not using a native environment, it is assumed that you
have GNU cross compiling tools available in your path. In this case,
you must set the environment variable CROSS_COMPILE in your shell.
Note that no changes to the Makefile or any other source files are
necessary. For example using the ELDK on a 4xx CPU, please enter:

$ CROSS_COMPILE=ppc_4xx-
 $ export CROSS_COMPILE

我需要先配置环境变量。

于是:
export CROSS_COMPILE=arm-linux-
make smdk2410_config
后还是出现如下问题?
make: *** 没有规则可以创建目标“smdk2410_config”。 停止。
又想了一下,突然想到我解压完后,应该要进入解压目录的。
于是:
cd u-boot-2010.06
make smdk2410_config
成功。然后再

make
就在u-boot-2010.06文件夹下生成了U-boot.bin文件。

实现第二步:(目标:完成U-boot框架搭建。结果:成功)
根据README文件的指导
1.  Add a new configuration option for your board to the toplevel
    "Makefile" and to the "MAKEALL" script,
using the existing
    entries as examples. Note that here and at many other places
    boards and other names are listed in alphabetical sort
order. Please
    keep this order.
2.  Create a new directory to hold your board specific code. Add any
    files you need. In your board directory, you will need at
least
    the "Makefile", a "<board>.c",
"flash.c" and "u-boot.lds".
3.  Create a new configuration file
"incl?/configs/<board>.h" for
    your board等等

我就不在虚拟机里完成了。我直接在主机改为后,去虚拟的 untu下编译。
1,在MAKEALL文件中的LIST_ARM9=,按字母排序添加apple2440 \并保存。

2,在Makefile文件中,找到
ap946es_config: unconfig
 @board/armltd/integrator/split_by_variant.sh ap $@
添加如下代码并保存:
apple2440_config : unconfig
 @$(MKCONFIG) $(@:_config=) arm arm920t apple2440 samsung s3c24x0

3,在\u-boot-2010.06\board\samsung文件夹下,创建一个新的文件夹名为 apple2440,并把smdk2410下的文件都copy到apple2440文件夹下,把smdk2410.c更名为apple2440.c。但是没找到u-boot.lds文件。奇怪了,readme中说要有的,为什么smdk2410中没有呢?后来想起来昨天分析源码的时候,u-boot.lds应该在\arm\cpu\arm920t里有。

4,编辑apple2440下的Makefile文件(参考网络上移植成功的教程,否则我不知该哪里,呵呵)
COBJS := smdk2410.o flash.o改为
COBJS := apple2440.o flash.o

5,在u-boot-2010.06\incl?\configs文件夹下复制一个smdk2410.h,更名为apple2440.h。

好了,激动人心的时候就要到了。
make apple2440_config

make

就和README文件说的,会产生3个文件。

Finally, type "make all", and you should get some working U-Boot
images ready for download to / installation on your system:

- "u-boot.bin" is a raw binary
image
- "u-boot" is an image in ELF binary format
- "u-boot.srec" is in Motorola S-Record format
不过这3个文件目前烧录到板子中也不能起作用。只是搭了一个框架,之后就是往里面增加内容或修改内容。

实现第三步(目标:修改源码,完成编译,下载到板上实现LED点亮。结果:成功。)

应该先修改什么呢?(按照先前裸奔代码的经验,应该确定先修改启动文件。但是保险起见,要在U-boot中寻找依据。)

先解释一下lds文件的作用:一般在嵌入式系统软件开发中,在所有源码文件编译完成之后,链接器要读取一个链接分配文件,在该文件中定义了程序的入口点,代码段、数据段等分配情况等。
是不是有答案了。打开arch\arm\cpu\arm920t下的u-boot.lds重点看如下:

ENTRY(_start)        
//说明程序的入口点是从_start函数。
    .text :
    {
       
cpu/arm920t/start.o    (.text)    //程序执行的第一个文件
        *(.text)
    }
    现在可以确定先修改的文件是arch\arm\cpu\arm920t下的start.S。打开此文件,自己看代码准备修改。
先看此段。
start_code:
 /*
  * set the cpu to SVC32 mode
  */
 mrs r0, cpsr         //读状态寄存器到r0
 bic r0, r0, #0x1f    //r0的低5位清0
 orr r0, r0, #0xd3    //或上110
10011,即禁止IRQ和FRQ,并且设置为超级用户模式。
 msr cpsr, r0         //r0写入状态寄存器
问题:干嘛要用SVC模式?
查了下。原理超级用户模式(SVC 模式),主要用于 SWI(软件中断)和 OS(操作系统)。这个模式有额外的特权,允许你进一步控制计算机。例如,你必须进入超级用户模式来读取一个插件(podule)。这不能在用户模式下完成。
我之前裸奔没操作系统所有不需要用SVC模式,但是U-boot需要加载OS,所以选SVC。

接着看到
 bl coloured_LED_init
 bl red_LED_on
找了led初始化和led on的函数觉得有点复杂。没找清楚。这个今后掌握了单步调试后研究一下。
于是把这两行注释掉。
在其下面加入
#if
defined(CONFIG_S3C2440)
#define GPBCON 0x56000010
#define GPBDAT 0x56000014
#define GPBUP  0x56000018

ldr r0, =GPBUP
    ldr r1, =0x7FF    /*关闭上拉*/
    str r1, [r0]

ldr r0,
=GPBCON   /*配置PB5、6、7、8为输出口,对应PBCON寄存器的第10-17位*/
    ldr r1, =0x015400 
    str r1, [r0]

ldr r0, =GPBDAT
    ldr r1, =0x79F    /*对应二进制11110011111,PB5,6设为低电平,点亮LED*/
    str r1, [r0]

#endif

接着在config/apple2440.h中加入一条宏定义。
#define
CONFIG_S3C2440 1 /* on a SAMSUNG apple2440 Board  */

make apple2440_config
make
下载到nandflash中,看看结果.
PB5和PB6点亮,PB7和PB8不点亮。
0x79F改成0x6BF看看灯的变化吧!是不是变成了PB8和PB6,PB7和PB5不亮啊!验证正确。

明天要配置clk等然后实现串口通信显示。另外,我需要补充一下makefile的知识以及学习linux下调试源码。

U-boot2010.06移植--阶段一的更多相关文章

  1. u-boot2010.06移植阶段三--norflash驱动

    2011-03-20 23:06:24 学习笔记: 效果图: 参考步骤: 一,把smdk2410 # 改成apple2440 #  1,在board/samsung/apple2440/apple24 ...

  2. uboot移植阶段二--3串口终结篇

    2011-03-20 23:00:37 前天U-boot移植串口后,能成功显示数据. 今天的主要目的是再次进行U-boot移植.看是否成功.花了40分钟,很顺利. 接着就是要把之前有问题的U-boot ...

  3. u-boot移植总结(二)LED点灯调试 和 u-boot加载地址

    (一)LED点灯调试 FL2440电路总共有4个LED0,LED1,LED2,LED3,分别接到板子GPB5,GPB6,GPB8,GPB10引脚.通过设置三个寄存器GPBCON(0x56000010) ...

  4. 【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)

    第10章     RL-TCPnet网络协议栈移植(FreeRTOS) 本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就 ...

  5. 【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)

    第9章        RL-TCPnet网络协议栈移植(uCOS-III) 本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移 ...

  6. 【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)

    第8章        RL-TCPnet网络协议栈移植(RTX) 本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要 ...

  7. 【安富莱】【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)

    第7章        RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...

  8. [学习资料] Tiny210(S5PV210) u-boot移植

    Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...

  9. 手把手教你丨小熊派移植华为 LiteOS-M

    摘要:本文详细讲解如何移植 LiteOS 到小熊派. 本文分享自华为云社区<小熊派移植华为 LiteOS-M(基于MDK)>,作者: JeckXu666. 前言 之前使用小熊派实现了鸿蒙动 ...

随机推荐

  1. 蜕变成蝶~Linux设备驱动之watchdog设备驱动

    看门狗(watchdog )分硬件看门狗和软件看门狗.硬件看门狗是利用一个定时器 电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零 (俗称 “喂狗”),如果程序出现故障,不在定时周 ...

  2. 蜕变成蝶~Linux设备驱动之异步通知和异步I/O

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似“中断”的异步通知所取代.异步通知类 ...

  3. Python学习笔记(三)

    组合数据类型 5种内置的序列类型:bytearray,bytes,list,str,tuple 元组 元组:固定,有序,索引从0开始,分片,步距语法支持 不能替换或者删除其中的任意数据项,使用list ...

  4. python 检测字符串编码类型是什么

    for index,value in enumerate(listvalue): adchar=chardet.detect(value) print adchar if adchar['encodi ...

  5. Sqlalchemy model 文件自动生成

    自动生成Sqlalchemy的models文件的包早用过了,有个字段类型做了改动,调了得10几分钟才搞定.记录下自动生成models文件的python包sqlacodegen sqlacodegen已 ...

  6. VS 错误: 未找到与约束contractname Microsoft.VisualStudio.Utilities.IContentTypeRegistryService

    今天突然停电,vs重启的时候就出现了问题,最开始是提示如图1所示的错误,开始觉得可能这提示不重要,也就关闭不在提醒了,结果,vs启动是启动了,项目也开启了,但是生成的时候,依旧就报了图1的错 图1 去 ...

  7. Oracle 11gR2(11.2.0.4)安装包(7个)作用说明

    在之前使用Oracle10G的时候,官网下载的数据库安装包只有两个文件,解压合并后为完整的安装包. 后来因为检查出多个Oracle漏洞,需要现场Oracle数据库版本需要升级到11.2.0.4,下载的 ...

  8. 【Java核心技术】类型信息(Class对象 反射 动态代理)

    1 Class对象 理解RTTI在Java中的工作原理,首先需要知道类型信息在运行时是如何表示的,这是由Class对象来完成的,它包含了与类有关的信息.Class对象就是用来创建所有“常规”对象的,J ...

  9. gitlab-ci + k8s 之k8s (二)

    k8s用自己话说,就是一种容器编排工具,部署好应用,再创建绑定应用的服务,就可以实现的服务访问了.这个理论还是得去看重点谈理论的文章,此处我们只记录本项目部署过程. 背景介绍 之前已实现gitlab- ...

  10. js模拟发送 FormData数据

    后台express需要connect-multiparty模块接收formData的数据类型 class ourFormData { constructor(data, rs) { return ne ...