历史上的今天

今天是:2024年11月12日(星期二)

2021年11月12日 | 记录一下自己在mini2440上面 使用uboot的曲折的经历

发布者:星光闪耀 来源: 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的曲折的经历

上一篇:mini2440 uboot使用nfs方式引导内核,文件系统
下一篇:mini2440开发板移植uboot后norflash环境变量保存

推荐阅读

《日经》亚洲科技业最值得关注的女性,唯一入榜台湾人!全球硅晶圆第3大供应商、台积电关键上游,环球晶圆营收六年间暴增95倍,连11季成长。但今年股价大起大落,在半导体景气反转、市场质疑供过于求之际,董事长徐秀兰为何敢于逆势扩厂,让竞业赞赏「这就是徐秀兰厉害的地方」? 环球晶圆董事长徐秀兰接受《天下》专访这天,一见到去年曾访问过她的记者,...
在项目中需要低功耗处理,而使用看门狗可以保证程序不会跑死。但使用看门狗有一个问题,打开看门狗以后关闭不了,必须一直喂狗进行操作,那有啥好的办法呢?狗是必须养的,养这条狗花费了我半天时间,在此记录。我能想到的有两种方案:一、 使用独立看门狗,在低功耗下唤醒进行喂狗操作后继续休眠。该方法可以通过增大看门狗的时钟分频,最大256分频,即...
近日,宜普电源转换公司(EPC)宣布推出170 V、6.8 mΩ的EPC2059氮化镓场效应晶体管(eGaN®FET),与目前用于高性能48 V同步整流的器件相比,EPC为设计工程师提供更小型化、更高效、更可靠且成本更低的器件。宜普电源转换公司是增强型硅基氮化镓(eGaN)功率场效应晶体管和集成电路的全球领先供应商,致力提高产品性能且降低可发货的氮化镓晶体管的成本...
本文和大家介绍测试阻抗的方法是反射法,适用于经典的低阻抗到中阻抗范围,通过S参数测量端口测试。现在和大家分享一下操作步骤:1)先按下[Preset]选择OK先复位。2)准备需要调试的环境:a.先确定要调试的频段,选择Start和Stop要调试的频段。b.设置[Display]选择trace的个数,这里拿调试双工器的TXloadpull举例,建议选择两个。c.设置[Mearsure]按钮,一...

史海拾趣

问答坊 | AI 解惑

【藏书阁】 数字电路(正田英介)——21世纪电子电气工程师系列

目录: 第一章 逻辑代数 1.1逻辑运算的基本要素 1.2逻辑运算符号与基本定律 1.3基本准则 1.3.1异或逻辑 1.3.2同或逻辑 1.4逻辑代数的公式 1.4.1德·摩根定理 1.4.2对偶原理 1.5逻辑式的标准形与变换形 1.5.1逻辑式的形式 1.5.2逻辑式 ...…

查看全部问答∨

怎样在一开机就运行我的程序,而不进入winCE桌面界面?

如题:   我想在一打开PDA后,就进入我程序,而不显示winCE桌面,PDA系统是winCE5.0,开发工具是EVC4.0,请高手指教!!!…

查看全部问答∨

用PB5.0编的Emulator:X86的SDK问什么无法正常使用

就是想用Emulator:X86编一个SDK及模拟器,比如这套SDK叫"PhocusEmulator",编好SDK,安装完SDK后。打开VS2008,新建SmarkDevice的项目,总是提示说PhocusEmulator has no devices,总是无法新建SmartDevice的工程。有哪位大仙知道为什么? 其 ...…

查看全部问答∨

用友善之臂mini2440的朋友请进

不知道这里有没有用mini2440的朋友,不过还怀着希望来到这里问一下。小弟要写一个应用中断来进行触发的串口通信程序,可是怎么都进不了中断,所以小弟改写一个应用定时器与中断来定时,用于验证是不是我的中断函数有误。可是怎么也进入不了中断,不 ...…

查看全部问答∨

在ST和NXP间犹豫!!

                                 之前项目一直使用NXP的LPC系列ARM7.一些新项目计划使用M3的片子,一直在ST和NXP之间犹豫.ST目前的使用人好象多一点 ...…

查看全部问答∨

求推荐信誉好实惠的PCB制版厂家

小弟第一次画PCB,谢谢各位了。…

查看全部问答∨

只为uC而生,uS成长历程 7

新的一周开始了。 随着我们的 uS v0.1释出,接下来,我们要实现的是 我计划中的 通信控制台 部件。 这里简单解释一下。 控制台,这个名字 模仿 电脑上的 终端,也就是windows下的cmd,linux下的 bash shell. 如果接触过linux,那么,你最先敲的 ...…

查看全部问答∨

晒晒俺的 中国版BeagleBone-Black

爱板网上买的,379包邮, 先搞了一块玩玩~~~ 想玩的盆友,建议在18日这天,集中在EE上抢货,超级便宜哦,只要288~~~ 连接地址: https://www.eeworld.com.cn/eetuan/BB_Black2013/index.php…

查看全部问答∨

AD7682问题

请问一下我用的STM32,3.3V供电,AD7682的供电是5V。那VIO这个脚是接5V还是3.3V呢? …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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