详细讲解 移植Uboot到ARM9开发系统上

详细讲解 移植Uboot到ARM9开发系统上首先了解ARMer9开发系统硬件设计上和三星原装SMDK2410之间的区别。让uboot在ARMer9开发系统上跑起来,目前只需要关注如下的硬件区别,解决了下面这个问题,uboot就可以在ARMer9开发系统上正常地从串口输出,进入提示符。很多命令都可以使用,当然有些命令需要做修改。 SMDK2410:norFlash是AMD的1M的;ARMer9:是IntelE28F

大家好,又见面了,我是你们的朋友全栈君。

首先了解ARMer9开发系统硬件设计上和三星原装SMDK2410之间的区别。让uboot在ARMer9开发系统上跑起来,目前只需要关注如下的硬件区别,解决了下面这个问题,uboot就可以在ARMer9开发系统上正常地从串口输出,进入提示符。很多命令都可以使用,当然有些命令需要做修改。

 

SMDK2410 : nor Flash 是AMD的1M的;

ARMer9: 是Intel E28F128J3A, 两片并联,一共32M Bytes.

 

下载一个uboot-1.1.1.tar.bz2.;

 

tar jxvf uboot-1.1.1.tar.bz2;

 

在uboot 目录board/smdk2410 下的flash.c需要修改。这个是Flash的驱动,如何写,需要参考E28F128J3A的Datasheet. 这里我们提供一个我们修改好的flash.c文件,您只需要将这个文件覆盖掉board/smdk2410 下的文件即可。

 

(注意:你要安装了交叉编译器才行哦)

 

修改uboot目录下的Makefile,将

ifeq ($(ARCH),arm)

CROSS_COMPILE = arm-Linux-

endif

 

修改成

 

ifeq ($(ARCH),arm)

CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-unknown-linux-

endif

 

修改processor.h中:

union debug_insn

{

u32 arm;

u16 thumb;

}

修改成:

union debug_insn

{

u32 arm_mode;

u16 thumb_mode;

}

 

然后配置板子

make smdk2410_config

 

然后

make

 

在uboot目录生成uboot.bin;

 

通过sjf2410w程序将uboot.bin下载到nor flash中, 地址为0的地方;

 

串口接在UART0上,uboot的启动信息将输出。

 

你将发现很多命令都可以使用了。uboot果然强大。

 

关于网络部分,因为ARMer9开发系统使用也是CS8900A,所以代码部分几乎不用做改动,只需要在 include/configs/smdk2410.h中看看,有没有定义CONFIG_ETHADDR,CONFIG_IPADDR, CONFIG_SERVERIP这些宏没有,如果没有,请定义好。

 

 

 

#define CONFIG_ETHADDR 00:00:e0:ff:cd:15

 

#define CONFIG_IPADDR 192.168.0.5

 

#define CONFIG_SERVERIP 192.168.0.100

 

就这样修改一下,网络部分功能就通了,哈哈。

 

可以使用tftpboot命令从tftp服务器下载程序到系统内存中。

 

#tftpboot 0x33000000 zImage

 

#bootm 0x33000000

 

 

利用uboot引导可执行映象的通用方法

 

 

 

uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。

 

mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么

 

root@Glym:/tftpboot# ./mkimage

Usage: ./mkimage -l image

-l ==> list image header information

./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file…] image

-A ==> set architecture to ‘arch’

-O ==> set operating system to ‘os’

-T ==> set image type to ‘type’

-C ==> set compression type ‘comp’

-a ==> set load address to ‘addr’ (hex)

-e ==> set entry point to ‘ep’ (hex)

-n ==> set image name to ‘name’

-d ==> use image data from ‘datafile’

-x ==> set XIP (execute in place)

参数说明:

 

-A 指定CPU的体系结构:

 

取值 表示的体系结构

alpha Alpha

arm A RM

x86 Intel x86

ia64 IA64

mips MIPS

mips64 MIPS 64 Bit

ppc PowerPC

s390 IBM S390

sh SuperH

sparc SPARC

sparc64 SPARC 64 Bit

m68k MC68000

 

-O 指定操作系统类型,可以取以下值:

openbsd、netbsd、FreeBSD、4_4bsd、linux、svr4、esix、Solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos

 

-T 指定映象类型,可以取以下值:

standalone、kernel、ramdisk、multi、firmware、script、filesystem

 

-C 指定映象压缩方式,可以取以下值:

none 不压缩

gzip 用gzip的压缩方式

bzip2 用bzip2的压缩方式

 

-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载

 

-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)

 

-n 指定映象名

 

-d 指定制作映象的源文件

 

常用U-BOOT命令介绍

1. ?或者help,得到所有命令列表;

2. help: help usb, 列出USB功能的使用说明

3. ping:注:通常只能运行uboot的系统PING别的机器

4. setenv: 设置环境变量

setenv serverip 10.36.20.49,设置TFTP Server的IP地址;

setenv ipaddr 10.36.20.200,设置IP地址;

setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’,设置启动命令(实际上就是一个脚本);

5. saveenv:在设置好环境变量以后, 保存环境变量值到flash中间;

6. tftpboot:tftpboot 0x800000 vmlinux, 将TFTP Server(IP = 环境变量中设置的serverip)中/tftpdroot目录 下的vmlinux通过TFTP协议下载到物理内存0x800000开始的地方。

7. kgo:启动没有压缩的linux内核,kgo 0x800000

8. bootm:启动通过UBOOT TOOLS—— mkimage制作的压缩LINUX内核, bootm 3200000;

9 flinfo:列出flash的信息

10. protect: 对FLASH进行写保护或取消写保护, protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect off 1:0-3取消写保护

11. erase: 删除FLASH的扇区, erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)

12. cp: 将内存中数据烧写到Flash, cp 0x800000 0xc0000 0x40000(把内存中0x800000开始的0x40000字节复制到0xc0000处);

13. mw: 对RAM中的内容进行写操作, mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF);

14. md: 显示RAM中的内容, md 0x800000;

15. loadb: 准备用 KERMIT协议接收来自kermit或超级终端传送的文件。

16. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。

17. fatls:列出Dos FAT文件系统, 如:fatls usb 0列出第一块U盘中的文件

18. fatload: 读入FAT中的一个文件,如:fatload usb 0:0 32000000 aa.txt

19. usb相关的命令:

usb start: 起动usb 功能

usb info: 列出设备

usb scan: 扫描usb storage(u 盘)设备

 

Uboot对SMDK2410板的NAND Flash初始化部分没有写,

 

 

 

即lib_arm/board.c中的start_armboot函数中有这么一句:

#if (CONFIG_COMMANDS 

 

linux内核编译问题

1 内核编译命令

 

编译非压缩内核: make Image  

编译压缩内核:   make zImage  

编译可被u-boot支持的内核: make uImage
最后生成的内核都在 $(src_tree)/arch/arm/boot目录下

 

2 make uImage

 

需要使用u-boot提供的mkimage工具,把这个文件拷贝到/usr/bin或/bin目录下

,否则会有“mkimage找不到”的错误。

 

makeimage软件内部使用了mmap()函数,这个函数对NTFS文件系统中的文件操作时会失败(使用的是Fedora Core 7,不知道别的linux版本是否也一样),显示“不能映射文件”错误。所以最好不要在NTFS文件系统上构建内核,或者把内核编译过程中生成的zImage拷贝到非NTFS文件系统上,再调用mkimage处理。

 

一个比较好的解决方案是修改$(src_tree)/arch/arm/boot/Makefile中产生uImage的部分:

 

$(obj)/uImage: $(obj)/zImage FORCE

    $(call if_changed,uimage)

    @echo ‘  Image $@ is ready’

 

方法一:使用Image

# Method 1 : Image->gzip->add  u-boot header

$(obj)/uImage: /tftpboot/u9260.img

/tftpboot/u9260.img:    $(obj)/Image FORCE

    cat  $<  | gzip -9  > $(obj)/Image.gz

    mkimage  -A arm  -O linux  -T kernel  -C gzip -a $(LOADADDR) -e $(LOADADDR) /

             -n ‘Linux-$(KERNELRELEASE)’ -d $(obj)/Image.gz  $@

    rm -f  $(obj)/Image.gz

    @echo ‘  Image $@ is ready’

 

方法二:使用zImage  

# Method 2 : zImage->add u-boot header

$(obj)/uImage:  /tftpboot/u9260.img

/tftpboot/u9260.img:    $(obj)/zImage FORCE

    $(call if_changed,uimage)

    @echo ‘  Image $@ is ready’

 

3  EABI

使用AT91SAM9260EK的缺省配置编译内核,制作根文件系统,下载到AT9260单板,启动过程中出现“kernel panic: not syncing attempted to kill init”信息,然后死机。

经检查发现,ramdisk挂载正常,很可能是busybox执行失败。

 

怀疑是共享库的问题,将busybox静态编译链接,故障依旧。

换用一个老版本的根文件系统映象,可以正常启动。

 

后来上网搜索了一些相关信息,找到了解决问题的途径。 原因在于:编译内核和busybox使用的编译器是arm-linux-gcc 4.3.2,而这个编译器默认是打开“EABI选项”的,这样编译出来的busybox就是EABI的。但是内核编译的时候,默认是把“EABI选项”关掉的。所以busybox和内核无法正常配合。把“EABI选项”打开,重新编译内核后,一切正常。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132649.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [栈] 表达式求值 – C语言(多位数求值,2位数以上)

    [栈] 表达式求值 – C语言(多位数求值,2位数以上)【理论】https://blog.csdn.net/summer_dew/article/details/82048387【代码说明】支持:2位以上的数字,四则运算和幂运算使用的栈,是自己实现,封装在2SqStack.h文件中的,可自己实现,也可以参照:https://blog.csdn.net/summer_dew/article/details/82051767【结果】测试:…

    2022年6月22日
    29
  • phpmyadmin端口多少(iis配置改端口号)

    当前使用phpmyadmin版本号为phpMyAdmin-4.7.5mysql默认端口3306,如果你当前mysql不是3306,则如何通过phpmyadmin连接呢?网上文章都是要修改phpmyadmin目录下libraries下配置文件config.default.php文件的$cfg[‘Servers’][$i][‘port’]=”参数,…

    2022年4月10日
    46
  • 在linux上安装pear

    在linux上安装pear

    2021年10月18日
    65
  • 【运筹学】整数规划、分支定界法总结 ( 整数规划 | 分支定界法 | 整数规划问题 | 松弛问题 | 分支定界法 | 分支定界法概念 | 分支定界法步骤 ) ★★

    【运筹学】整数规划、分支定界法总结 ( 整数规划 | 分支定界法 | 整数规划问题 | 松弛问题 | 分支定界法 | 分支定界法概念 | 分支定界法步骤 ) ★★一、整数规划、1、整数规划概念、2、整数规划分类、二、整数规划示例、三、整数规划解决的核心问题、四、整数规划问题解的特征、五、整数规划问题与松弛问题示例、六、分支定界法、1、整数规划概念、2、分支定界法求解整数规划步骤、3、分支定界理论分析、七、分支过程示例、八、分支定界法求整数规划示例、1、分支定界法求整数规划示例、2、求整数规划的松弛问题及最优解、3、第一次分支操作、4、第二次分支操作、5、第三次分支操作、6、整数规划最优解

    2022年7月12日
    12
  • scratch编程小游戏——黄金矿工

    黄金矿工的玩法就是操控一个不断摆来摆去的钩子去挖出黄金,现在我们就来用scratch编一个黄金矿工首先新建好变量:矿车要画出许多的造型:代码:钩爪的绳索是这个游戏最为复制的一点,方法是移动后画出一条线,返回时用背景一样的颜色来覆盖,我们首先来画出造型:红色的是中心位置代码如下:(此代码需要用到一部分自定义,不懂的见文章末尾链接)自定义部分是这个代码的核心:接下来是黄金,造型的话要画出三个:大、中、小各一个代码如下:黄金代码是程序中非常重要的一环,一定不要有差错现

    2022年4月4日
    2.3K
  • 如何将本地文件通过终端上传到linux服务器 /服务器/阿里云「建议收藏」

    如何将本地文件通过终端上传到linux服务器 /服务器/阿里云「建议收藏」scp-P端口c://xxxx.txtuser@ip:/home/root注意:-P大写-i公钥(我是将文件上传到阿里云)(1)在本地的终端下,而不是在服务器上。在本地的终端上才能将本地的文件拷入服务器。(2)scp-rlocalfile.txtusername@192.168.0.1:/home/username/其中,1)scp是命令,-r是参…

    2022年4月30日
    401

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号