U-boot2010.06移植--阶段一
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移植--阶段一的更多相关文章
- u-boot2010.06移植阶段三--norflash驱动
2011-03-20 23:06:24 学习笔记: 效果图: 参考步骤: 一,把smdk2410 # 改成apple2440 # 1,在board/samsung/apple2440/apple24 ...
- uboot移植阶段二--3串口终结篇
2011-03-20 23:00:37 前天U-boot移植串口后,能成功显示数据. 今天的主要目的是再次进行U-boot移植.看是否成功.花了40分钟,很顺利. 接着就是要把之前有问题的U-boot ...
- u-boot移植总结(二)LED点灯调试 和 u-boot加载地址
(一)LED点灯调试 FL2440电路总共有4个LED0,LED1,LED2,LED3,分别接到板子GPB5,GPB6,GPB8,GPB10引脚.通过设置三个寄存器GPBCON(0x56000010) ...
- 【安富莱】【RL-TCPnet网络教程】第10章 RL-TCPnet网络协议栈移植(FreeRTOS)
第10章 RL-TCPnet网络协议栈移植(FreeRTOS) 本章教程为大家讲解RL-TCPnet网络协议栈的FreeRTOS操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就 ...
- 【RL-TCPnet网络教程】第9章 RL-TCPnet网络协议栈移植(uCOS-III)
第9章 RL-TCPnet网络协议栈移植(uCOS-III) 本章教程为大家讲解RL-TCPnet网络协议栈的uCOS-III操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移 ...
- 【安富莱】【RL-TCPnet网络教程】第8章 RL-TCPnet网络协议栈移植(RTX)
第8章 RL-TCPnet网络协议栈移植(RTX) 本章教程为大家讲解RL-TCPnet网络协议栈的RTX操作系统移植方式,学习了第6章讲解的底层驱动接口函数之后,移植就比较容易了,主要 ...
- 【安富莱】【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)
第7章 RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...
- [学习资料] Tiny210(S5PV210) u-boot移植
Tiny210(S5PV210) u-boot移植http://www.microoh.com/bbs/forum.php?mod=viewthread&tid=254&fromuid ...
- 手把手教你丨小熊派移植华为 LiteOS-M
摘要:本文详细讲解如何移植 LiteOS 到小熊派. 本文分享自华为云社区<小熊派移植华为 LiteOS-M(基于MDK)>,作者: JeckXu666. 前言 之前使用小熊派实现了鸿蒙动 ...
随机推荐
- ajax方法如何给全局变量赋值
在调用一个jquery的ajax方法时我们有时会需要该方法返回一个值或者给某个全局变量赋值,可是我们发现程序执行完后并没有获取到我们想要的值,这时很有可能是因为你用的是ajax的异步调用async:t ...
- 告别GOPATH,快速使用 go mod(Golang包管理工具)
https://studygolang.com/articles/17508?fr=sidebar 文中的wserver为module名,route为本地的包名,go.mod所在的目录名不一定非要和m ...
- Python学习笔记(二)
标识符和关键字 1,邮箱的Python标识符是任意长度的非空字符序列(引导字符+后续字符.) python标识符必须符合两条规则--标识符区分大小写 (1)只要是unicode编码字母都可以充当引导字 ...
- Docker-堆栈stack(6)
堆栈(Stack)的概念: 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起.单个堆栈能够定义和协调整个应用程序的功能,但是非常复杂的应用程序可能希望使用多个堆栈. 下面我们就开始 ...
- 【分布式系列】session跨域及单点登录解决方案
Cookie机制 Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息. ...
- Codeforces Round 504
(交互题真神奇,,,我自己瞎写了一发目测样例都没过去就AC了...) (只出了两题的竟然没掉下蓝名真是可怕) A:我的代码太不美观了,放个同学的(因为我是c++63分的蒟蒻所以根本不知道那些函数怎么用 ...
- Java课程寒假之开发记账本软件(网页版)之三
一.实现基础功能之一(查询)(补) 在上一篇中解释的不够详细,在本篇中补充一下指定日期查询,其实和查询没有什么区别,就是设置select下拉框来对于日期的起始与结束日期,然后就是一个简单的mysql语 ...
- mybatis08--关联查询多对一
根据省会的id查询出省会和对应国家的信息 01.多表的连接查询 修改对应的实体类信息 /** *国家的实体类 */ public class Country { private Integer cId ...
- vue的单向数据流
父级向子组件传递的值, 子组件不能直接修改这个穿过来的值,否则会曝出警告,这就是单项数据流. 如果是引用值,传递的是引用值得地址,而不是值本身,也就是说,子组件里修改这个传过来的值,通常的做法是放到它 ...
- vue中mint-ui的index-list 在手机端滑动问题
官方的demo这里滑动很流畅,按着官网demo复制的在手机上必须手指拖着才能动,不能滑动: 加入 这段代码就行 -webkit-overflow-scrolling: touch; overflow- ...