历史上的今天
返回首页

历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2021年10月21日 | mini2440 uboot的使用经历

2021-10-21 来源:eefocus

记录一下自己在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引导内核了。哈哈


推荐阅读

史海拾趣

Gustav Klauke GmbH公司的发展小趣事

Gustav Klauke GmbH在电子行业中的五个发展故事

故事一:创立与电气时代的崛起

1879年,Gustav Klauke GmbH在德国雷姆沙伊德成立,正值第二次工业革命带来的“电气时代”大爆发。创始人Gustav Klauke凭借其对精工品质的执着追求,将公司的业务聚焦于电气连接技术和电缆作业工具的研发。随着全球电气工业的迅速发展,Klauke迅速成为该领域的佼佼者,为供电系统的各个环节提供可靠且实用的解决方案,满足了社会对电气产品日益增长的多元化需求。

故事二:产品创新与多元化发展

历经百年开拓,Klauke的产品线不断丰富和完善。从最初的钟表维修钳子,到电缆接线端子的生产,再到电池驱动的液压工具的研发,Klauke始终走在行业前沿。特别是1994年推出的首款电池驱动液压工具,标志着公司在电气连接技术上的重大突破。至今,Klauke已拥有多达280种工具,2000多个型号,超过10000个优质部件,广泛应用于电力、铁路和工业等多个领域。

故事三:品质与认证的国际认可

Klauke深知电气连接作业对安全可靠性的极高要求,因此始终将产品质量放在首位。公司不仅拥有IEC(国际电工委员会)、UL(美国保险商试验所)、DNV(挪威船级社)和GL(德国劳氏船级社)等特殊行业的权威资质认证,还通过严格的产品测试报告,确保每一款产品都能达到国际最高标准。这种对品质的坚持,让Klauke在全球客户中赢得了极高的信誉和口碑。

故事四:全球化布局与业务拓展

随着全球市场的不断扩大,Klauke积极实施全球化战略。从德国本土出发,公司在全球范围内设立了多个分公司和销售办事处,如印度、奥地利、西班牙等。同时,公司还通过并购和合作等方式,不断拓展业务领域和市场份额。例如,2018年Gustav Klauke GmbH被艾默生收购,现隶属于“专业工具”部门,这一举措进一步提升了公司在全球电气工具市场的竞争力。

故事五:未来展望与技术创新

面对未来,Klauke继续秉承德国精工品质的优良传统,致力于技术创新和服务优化。公司正密切关注物联网和工业4.0等下一代趋势,并制定相应的战略计划。例如,新型电池供电液压工具配备了蓝牙接口,实现了移动数据读取和工具配置的便捷性。此外,Klauke还计划推出更多高适应性、精准性的电气连接解决方案,以更好地满足全球日益多元的施工作业需求。展望未来,Klauke将继续向下一个百年目标迈进,为电子行业的发展贡献更多力量。

Eurofarad公司的发展小趣事

Eurofarad,作为Exxelia Technologies旗下的知名品牌,自1965年成立以来,就专注于电子元件的设计和制造。在创立初期,Eurofarad凭借对电子技术的深入研究和对市场需求的敏锐洞察,迅速推出了多款高性能、高质量的电子元件产品。这些产品在市场上获得了广泛的认可,为Eurofarad的后续发展奠定了坚实的基础。

Aavid Niagra公司的发展小趣事

近年来,电子行业正经历着深刻的变革,新兴技术的不断涌现对传统散热技术提出了严峻挑战。Aavid Niagra公司面对这一变革,积极调整战略方向,加大在新兴技术领域的研究力度。通过与高校、研究机构的合作,公司成功研发出了一系列适应新兴技术需求的散热产品,成功应对了行业变革带来的挑战。

Conditioning Semiconductor Devices Corp公司的发展小趣事

为了进一步提升技术水平和扩大市场份额,CSDC积极寻求与国际半导体巨头的合作。通过与这些公司的技术交流和合作研发,CSDC不仅获得了先进的技术支持,还成功打入了国际市场。这一合作不仅提升了CSDC的品牌影响力,也为其带来了更多的商业机会。

Aborn Electronics Inc公司的发展小趣事

在激烈的市场竞争中,成本控制是企业生存和发展的重要因素之一。Aborn Electronics深知这一点,因此在供应链管理上下了大力气。公司与多家优质供应商建立了长期稳定的合作关系,确保了原材料的稳定供应和质量可靠。同时,通过对生产流程的不断优化和改进,降低了生产成本,提高了生产效率。这些措施使得Aborn Electronics的产品在市场上更具竞争力。

Gamma Microelectronics ( APM )公司的发展小趣事

G24i在发展过程中始终注重国际合作与市场拓展。公司董事长Mr. Edward J Stevenson及其团队多次访问国内外知名科研机构和企业,就DSSC技术的研发、产业化等方面进行深入交流。同时,G24i还积极参加国际太阳能展会和论坛,展示其最新的技术成果和产品应用。这些努力不仅提升了G24i在国际市场上的知名度和影响力,也为公司赢得了更多的合作机会和市场份额。通过国际合作与市场拓展,G24i正逐步成为全球DSSC领域的领军企业之一。

问答坊 | AI 解惑

单片机延时计算小程序

replyreload += \',\' + 228914; Timson,如果您要查看本帖隐藏内容请回复 是一个非常好的计算延时的软件! [ 本帖最后由 linx1988 于 2009-8-26 16:39 编辑 ]…

查看全部问答>

Q64 脚本开发

有用Q64或使用Wavecom OpenAT开发环境的高手进来交流一下,或可以联系我的QQ413744456. …

查看全部问答>

有用过 QAC 的吗?如何设置相对路径?

有用过 QAC 的吗?如何设置相对路径?…

查看全部问答>

CE5.0上,使用ALT类CComPtr,引用了atlbase.h,编译说__cxxFrameHandler3未定义

顺便问个问题: 安装了模拟器SDK后,VS2005\"选项\"-->\"项目和解决方案\"-->\"VC++目录\"中默认写入的alt库的路径是 \"VCInstallDir)ce\\atlmfc\\include\",不是模拟器支持的ATL的目录. 用PB Build SDK的时候能否把ATL的目录也设好,然后安装的时 ...…

查看全部问答>

有关工控芯片PCD4521的用法

我在做一个实验,是有关电机控制的,用的芯片是NPM的PCD4521,但是我搞了很久都没有进展,我想请教一下有谁有做过这个芯片的,可以传一份资料给我吗,最好是中文资料,我ENG太菜了…

查看全部问答>

硬件测试技术及信号完整性分析

        硬件测试技术及信号完整性分析 时间/地点:2008年4月5-6日  上海            2008年4月19-20日   深圳 参会费用:参加课程 2200元/人(含 ...…

查看全部问答>

Platfrom Builder 4.2 (WinCE.NET4.2)里面如何添加对波兰语和泰语的支持?

Platfrom Builder 4.2 (WinCE.NET4.2)里面如何添加对波兰语和泰语的支持? 已经添加了 Platfrom-?Settings->Loacle->波兰语 Platfrom-?Settings->Loacle->泰语 还需要添加什么吗? 谢谢…

查看全部问答>

请教:在中断里可以调用 原先定义的函数吗?为什么我 调用,就出现警告呢?

//功能: SD2,SD3,SD4  显示    //参数: LedNumber表示是数码管的个数 //参数: LedCoin 是显示的数码管内容 void SD234Display(int LedNumber ,uchar8 *LedCoin) //SD2,SD3,SD4 显示 {       int ...…

查看全部问答>

pb下无法增加 ActiveSync组件, ActiveSync的同步问题,请大家给点建议,有分

我想通过在evc下用 ActiveSync 进行调试,但发现内核没有 ActiveSync,于是去定制内核 在pb下定制nk的时候想增加ActiveSync组件,但是Catalog ->Core OS -> Display based devices -> application - End User下面的ActiveSync图标旁边有个红色的感 ...…

查看全部问答>

几年前做的MEGA32+VS1003 MP3

系统由M32+VS1003+MMC卡组成! 能正常播放MP3, WMA, WAV, MIDI  格式的文件!       原理图:   程序: [ 本帖最后由 jiaxinhui2011 于 2011-4-19 08:37 编辑 ]…

查看全部问答>