mini2440 uboot的使用经历

发布者:德州小孙最新更新时间:2021-10-21 来源: eefocus关键字:mini2440  uboot  编译 手机看文章 扫描二维码
随时随地手机看文章

记录一下自己在mini2440上面 使用uboot的曲折的经历。


首先是使用了买板子时自带的代码: u-boot-1.1.6。但是编译时,总是提示有错误。也不知道这个版本是不是tekk的那个版本,自己修改了一些地方,但是感觉uboot的编译体系与一般的开源软件不相同,编译时,总是提示 有函数的实现找不到,即undefined reference to _,,,,网上说需要在makefile中添加 nostdlib等选项,但依然无法编译通过。


后来下载了 tekk的版本,貌似大家用的都是他的版本。


先说一下supervivi和uboot的区别。


在mini2440在norflash中烧写的是supervivi,supervivi使用起来非常方便,但是supervivi有一个缺点是 不支持从nfs启动,虽然它支持将nfs的根文件系统启动,但是不支持nfs的内核启动。也就是说将根文件系统放在nfs服务器上是可以的,但是supervivi不支持将编译好的内核放在nfs服务器上。


通常来讲,我们在做驱动等开发时候,其实有很多时候是需要修改内核,然后重新编译的。因此,如果使用supervivi就需要 配合dnw烧写内核。这个其实不太方便。


个人觉得uboot比supervivi的优势就在这里,就是uboot支持加载nfs服务器上的内核,这样的话,每次我们修改内核之后,就不需要用dnw进行烧写了,uboot会自动帮我们完成这个工作。因此我决定 编译uboot,并烧写到nandflash,而在norflash中保留了 supervivi。


另外,supervivi和uboot支持的内核格式是不相同的。用supervivi烧写内核时,烧写的是zImage文件,而用uboot烧写时经过处理后的image文件:zImage.img,这个文件与zImage相比是多了一个文件头部,是zImage文件经过uboot的mkimage工具而生成的。所以,supervivi和uboot不能加载相同的内核文件。


我是从这个链接下载的uboot代码:https://github.com/tekkamanninja/U-boot-2009.11_tekkaman。 为此还研究了github的使用方法,现在依然没有弄清楚怎么样在github上面搜索开源的代码,搜索好像没有sourceforge作得那么直观。目前一直想找找内核方面的项目做,但是自己没有合适的项目。希望看到博客的盆友们可以给推荐几个。


下载之后,放在虚拟机中解压,并编译,代码需要放在linux自己的磁盘中,而不能是共享的windows的磁盘。编译前需要修改Makefile,将变量CrossCompile设置为arm-linux-。 编译uboot的指令如下:make distclean; make mini2440_config; make。 需要先修改crosscompile变量,然后在进行编译,否则会出错。


编译完成之后,就可以用supervivi进行烧写,然后测试了。


在用uboot的过程中,主要解决了两个问题:


1. uboot的环境变量不能保存的问题。在uboot的界面中用setenv 和saveenv可以修改环境变量。因为tekk将环境变量设置为从nfs启动,而且ip地址都是hardcode在代码中的,因此,需要在uboot中修改这些环境变量。结果每次修改完之后,发现在启动系统时,都会出现 bad CRC or NAND, using default environment 这样的提示,也就是说修改之后的环境变量并没有起作用。


经过认真分析 flash的分区,在mini2440的linux内核代码中,flash的分区表在文件mach-mini2440.c中,;


static struct mtd_partition mini2440_default_nand_part[] = {

        [0] = {

                .name   = "supervivi", ;这里是 bootloader 所在的分区,可以放置 u-boot, supervivi 等内容,对应

/dev/mtdblock0

                .size   = 0x00040000,

                .offset = 0,

        },

        [1] = {

                .name   = "param", ;这里是 supervivi 的参数区,其实也属于 bootloader 的一部分,如果 u-boot 比较

大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1

                .offset = 0x00040000,

                .size   = 0x00020000,

        },       [2] = {

                .name   = "Kernel",  ;内核所在的分区,大小为 5M,足够放下大部分自己定制的巨型内核了,比如内核

使用了更大的 Linux Logo 图片等,对应/dev/mtdblock2

                .offset = 0x00060000,

                .size   = 0x00500000,

        },

        [3] = {

                .name   = "root", ;文件系统分区,友善之臂主要用来存放 yaffs2 文件系统内容,对应/dev/mtdblock3

                .offset = 0x00560000,

                .size   = 1024 * 1024 * 1024, //

        },

        [4] = {

                .name   = "nand", ;此区域代表了整片的 nand flash,主要是预留使用,比如以后可以通过应用程序访

问读取/dev/mtdblock4 就能实现备份整片 nand flash 了。

                .offset = 0x00000000,

                .size   = 1024 * 1024 * 1024, //

        }


}  


显然,我们的uboot的环境变量应该放在param分区中,即从0x40000 到 0x60000的这个部分。然后我们去uboot的代码中,有保存环境变量的位置,在文件include/configs/mini2440.h中:#define CONFIG_ENV_OFFSET 0x60000。从这里我们可以看到环境变量与linuxkernel的位置重叠了,所以导致加载环境变量有错误。为此,我们需要修改这里:#define CONFIG_ENV_OFFSET 0x60000。修改之后,编译,并重新下载,我们发现环境变量可以保存了。


2. 下面列一下我的环境变量的设置:


如果从nandflash启动系统:


[u-boot@MINI2440]# printenv

bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

bootcmd=nboot 30008000 0 0x60000;bootm

bootdelay=1

baudrate=115200

ethaddr=08:08:11:18:12:27

ipaddr=192.168.17.135

serverip=192.168.17.1

gatewayip=192.168.17.1

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial

ethact=dm9000

tekkaman=hello wusq

 


如果是从nfs启动系统:


bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200

bootdelay=1

baudrate=115200

ethaddr=08:08:11:18:12:27

ipaddr=192.168.17.135

serverip=192.168.17.1

gatewayip=192.168.17.1

netmask=255.255.255.0

stdin=serial

stdout=serial

stderr=serial

ethact=dm9000

tekkaman=hello wusq

bootcmd=nfs 0x30008000 192.168.17.2:/opt/FriendlyARM/mini2440/linux-2.6.32.2/zImage.img; bootm

 

如果要加载nfs上面的root文件系统,那么还需要修改bootargs: 类似于下面这样

bootargs=noinitrd root=/dev/nfs rw nfsroot=192.168.0.1:/home/tekkaman/working/nfs/rootfs 

ip=192.168.0.2:192.168.0.1::255.255.255.0 console=ttySAC0,115200 init=/linuxrc mem=64M

 

3. 最后一个问题,是解决了怎么样关闭uboot启动时,蜂鸣器发出声音的问题,是参考的网上的办法: http://www.arm9home.net/read.php?tid-4735-fpage-6.html

 

在这个版本中有两处设定了U-boot启动的时候蜂鸣器响,

第一个地方是在:

boardmini2440mini2440.c这个文件,

#if defined(CONFIG_MINI2440_LED)

        gpio->GPBDAT = 0x00000181;

#endif


第二个地方是lib_armboard.c的display_banner 函数:

#if defined(CONFIG_MINI2440_LED)    

        S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

        gpio->GPBDAT = 0x101; //tekkamanninja

#endif


解决办法:

步骤一:修改第一个地方的boardmini2440mini2440.c文件:

改为:

#if defined(CONFIG_MINI2440_LED)

        gpio->GPBDAT = 0x00000180;

#endif


步骤二:再检查文件中的start_armboot函数,是否存在如下代码:

#if defined(CONFIG_MINI2440_LED)    

        gpio->GPBDAT = 0x0; //tekkamanninja

#endif


这样就是U-boot系统启动的时候蜂鸣器响一会,启动结束停止,就不会出现长鸣现象了。


如果不想蜂鸣器响,将lib_armboard.c的display_banner 函数中的:

#if defined(CONFIG_MINI2440_LED)    

        S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

        gpio->GPBDAT = 0x101; //tekkamanninja

#endif

改为:

#if defined(CONFIG_MINI2440_LED)    

        S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

        gpio->GPBDAT = 0x100; //tekkamanninja

#endif


这样,就可以用uboot引导内核了。哈哈


关键字:mini2440  uboot  编译 引用地址:mini2440 uboot的使用经历

上一篇:S3C2440上LCD驱动(FrameBuffer)开发(一)
下一篇:mini2440 I2C驱动的分析与学习(三)

推荐阅读最新更新时间:2024-11-12 10:20

PIC单片机 的编译环境MPLAB的配置
在讲基于MPLAB X IDE 配置位配置前我先讲讲如何配置配置位。 比如PICLF1823的数据手册 可以再器件配置中找到两个寄存器。一个是配置字1 ,一个是配置字2. 对于初学者来说如此多的配置选项,该如何配置呢?我们要抓主重点。 配置字中最重要的配置选项就是: 看门狗配置 如:WDTE 1;0 ; 一般选择关闭看门狗 MCLRE复位脚的配置 如:MCLRE;一般选择复位脚作I/O 震荡器的选择: 如:FOSC 2:0 ;根据实际情况配置,我这里一般选择用 INTOSC 内部振荡器. 因为如果这三个没有配置好的话程序根本无法运行。其他配置可以看数据手册此不赘述。 MPLAB X IDE和MPLAB IDE 8不同。
[单片机]
PIC单片机 的<font color='red'>编译</font>环境MPLAB的配置
STM32编译配置的相关错误
通常是USE_STDPERIPH_DRIVER 写错了导致的; 通常是STM32F10X_HD拼写错误导致的; 正确的写法应该是 全部为大写!!!大写!!!大写!!!
[单片机]
STM32<font color='red'>编译</font>配置的相关错误
mini2440 按键驱动添加输入子系统,让按键可以真正当做键盘一样用
这个实验没有添加太多的东西,就只是在原来的基础上添加了输入子系统的支持,按键的中断发生的时候,会向内核发送event,使得evinput.c和keboard.c等文件里面实现的handler可以对按键事件进行相应,六个按键分别向内核发送KEY_L, KEY_S, KEY_3,KEY_4,KEY_5,KEY_ENTER这六个event,加载驱动之后不需要运行任何自己写的用户层程序,只需要运行cat /dev/tty1(要先在/etc/init.d/rcS里面设置不启动Qt),就可以用按键输入上面的六种字符了,之后输入一次回车之后,缓存在tty1里面的输入数据才会一次全部显示出来。 驱动代码: #include linux/m
[单片机]
<font color='red'>mini2440</font> 按键驱动添加输入子系统,让按键可以真正当做键盘一样用
tiny4412学习笔记-将uboot、zImage、文件系统烧到emmc中
1、首先还是要将u-boot写入SD卡中从SD卡启动。 使用读卡器将SD插入电脑中,使用umount卸载u盘, fdisk -l显示其挂载点为 /dev/sdb1 切换到/home/bunfly/images/uboot_tiny4412/sd_fuse/tiny4412目录下,执行./sd_fusing.sh /dev/sdb 拨动最右边开关选择从SD卡启动。 附加编译过程:   1.进入开发板提供的源码文件包,解压uboot源码包。   cd /home/bunfly/source_code/   tar xf uboot_tiny4412-20130729.tgz   2.进入uboot文件夹,更改uboot中t
[单片机]
tiny4412学习笔记-将<font color='red'>uboot</font>、zImage、文件系统烧到emmc中
如何编译文件得到的bootloader的.hex文件(例如:atmega328p)
一、打开Arduino ide的文件存放位置,本人是将其放在D盘的Arduino中 在D:Arduinoarduinohardwarearduinoavrbootloadersoptiboot文件中 你会看到有omake,omake.bat,Makefile,以及.h,.c,.hex等文件。而其中的optiboot_atmega328.hex文件就是atmega328p的bootloader,其就是 arduino ide 中为arduino uno板子烧录的bootloader(如何烧录引导程序bootloader,请问度娘) 二、准备工作:移除optiboot_atmega328.hex文件(移除前做好备份)
[单片机]
如何<font color='red'>编译</font>文件得到的bootloader的.hex文件(例如:atmega328p)
02-编译 AT91Bootstrap
准备工作 首先在 Ubuntu 系统中安装好交叉编译器,具体方法可以查看交叉编译器的安装 获取 AT91Bootstrap 源码 下载 AT91Bootstrap 源码,选择 3.X 的源码,以适应比较老的 AT91SAM9X25 开发板,然后将下载好的文件放置到 Ubuntu 主机的工作目录下 在 Ubuntu 主机的工作目录下,使用 git clone https://github.com/linux4sam/at91bootstrap.git 直接拉取源码,拉取后,打开源码目录 cd at91bootstrap/ ,然后使用 git checkout origin/at91bootstrap-3.x -b at9
[单片机]
02-<font color='red'>编译</font> AT91Bootstrap
pcm编译码器电路图
脉冲编码调制(PCM)技术与增量调制(ΔM)技术已经在数字通信系统中得到广泛应用。当信道噪声比较小时一般用PCM,否则一般用ΔM。目前速率在155MB以下的准同步数字系列(PDH)中,国际上存在A解和μ律两种PCM编译码标准系列,在155MB以上的同步数字系列(SDH)中,将这两个系列统一起来,在同一个等级上两个系列的码速率相同。而ΔM在国际上无统一标准,但它在通信环境比较恶劣时显示了巨大的优越性。 点到点PCM多路电话通信原理可用图5-1表示。对于基带通信系统,广义信道包括传输媒质、收滤波器、发滤波器等。对于频带系统,广义信道包括传输媒质、调制器、解调器、发滤波器、收滤波器等
[模拟电子]
pcm<font color='red'>编译</font>码器电路图
uboot1.1.6顶层mkconfig详解
#!/bin/sh -e # Script to create header files and links to configure # U-Boot for a specific board. # # Parameters: Target Architecture CPU Board //将指定开发板的相关参数传进来(smdk6410,arch,CPU,Board,VENDOR,SOC),VENDOR,SOC应该是可选参数 # # (C) 2002-2006 DENX Software Engineering, Wolfgang Denk wd@denx.de # APPEND=no # Default: Create
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved