历史上的今天
返回首页

历史上的今天

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

正在发生

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

2021-11-12 来源: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引导内核了。哈哈


推荐阅读

史海拾趣

BAE Systems公司的发展小趣事

随着全球化的加速,BAE Systems公司积极寻求跨国合作与拓展机会。公司与多家国际知名企业建立了紧密的合作关系,共同开展研发项目和市场拓展。这些合作不仅帮助公司获取了更多的技术和市场资源,也提升了公司在全球电子行业的地位和影响力。通过跨国合作,BAE Systems公司的产品和服务逐渐进入全球市场,为公司的持续发展注入了新的活力。

振华(CEC)公司的发展小趣事

为了进一步提升企业的竞争力和市场份额,振华积极实施国际化战略。公司加强与国外企业的合作与交流,积极参与国际市场竞争,通过引进外资、设立海外研发机构等方式,不断拓展海外市场。同时,振华还注重提升产品的国际竞争力,加强与国际标准的对接和认证工作,确保产品能够满足不同国家和地区的市场需求。

Green Solution Technology Co Ltd公司的发展小趣事

为了进一步提升企业的竞争力和市场份额,振华积极实施国际化战略。公司加强与国外企业的合作与交流,积极参与国际市场竞争,通过引进外资、设立海外研发机构等方式,不断拓展海外市场。同时,振华还注重提升产品的国际竞争力,加强与国际标准的对接和认证工作,确保产品能够满足不同国家和地区的市场需求。

3D PLUS公司的发展小趣事

随着技术的不断发展和市场的不断扩大,3D PLUS公司开始将目光投向国际市场。公司积极参加国际电子行业的展会和交流活动,与国际同行进行技术合作和交流,不断提升自身的技术水平和国际影响力。同时,公司还积极拓展海外销售渠道,将3D技术和产品推向全球市场,为全球客户提供高效、便捷的3D解决方案。这些努力不仅提升了公司在国际市场的知名度,也为公司的长期发展奠定了坚实的基础。

以上五个故事均基于3D PLUS公司在电子行业中的实际发展情况编写,旨在客观描述公司在3D技术领域的成长与进步。

Holmes Co Inc公司的发展小趣事

面对日益增长的全球市场需求,Holmes Electronics决定实施全球化战略。他们首先在亚洲建立了生产基地,利用当地的成本优势和供应链资源,大幅提高生产效率并降低成本。随后,公司又在欧洲和美国设立了研发中心和销售网络,以更好地服务当地客户并捕捉市场机会。这一全球化战略不仅使Holmes Electronics的产品遍布全球,还增强了公司的市场响应能力和品牌影响力。

CP Technology Inc公司的发展小趣事

为了进一步扩大市场份额,CP Technology Inc积极寻求与行业内其他公司的战略合作。公司先后与多家知名企业签订了合作协议,共同开发新产品、拓展新市场。这些合作不仅为CP Technology Inc带来了更多的资源和机会,也提升了公司在行业内的地位和影响力。

问答坊 | AI 解惑

Freescale芯片的资料并不少

很多人一直以为Freescale芯片的资料太少,其实不然。相对其他一些公司Freescale的芯片只是在国内用的少些罢了,他的网站上有他所有芯片的详细资料,手册简洁易懂,整理的很好,还有大量的参考设计代码、开发包。 说资料少的人估计大都是没用过他的 ...…

查看全部问答>

招聘windows驱动开发

文思信息技术有限公司成立于1995年,是中国软件外包行业的先行者和领军企业。 我们为来自亚太、北美和欧洲的国际客户及其在中国的分支机构提供IT外包服务。 文思在高科技行业、金融服务业、制造业、零售与分销业、电信业等领域具备全面 的专业能 ...…

查看全部问答>

tornado2.2 (for poverPc) simulator 启动问题??

我在网上下了一个tornado 按说明安装后,运行没有问题,但是启动VX是, 报error : simulator failed to initialize before timeout 的错误。 大家看看这是什么问题啊? …

查看全部问答>

初学者,CCS2.2的程序加载和烧写有什么不同,各在什么时候用?

初学者,CCS2.2的程序加载和烧写有什么不同,各在什么时候用?先谢谢了!!…

查看全部问答>

外部干扰会不会使2812运行中进入非法中断?

我做了一个PWM整流器,直流电压在200V以下DSP运行正常,但电压加到250V时DSP就容易跑飞,多数是进入了非法中断(我在非法中断中设置了一个GPIO口,多数情况下会反转,以此判断多数情况下进入非法中断),我认为程序在低压下能跑,应该不是程序问题 ...…

查看全部问答>

【易电源试用】 之 --- LMZ12002

使用我的简易电子负载,作易电源的测试 ,效果基本满意,比找功率电阻要方便多了。 这次测试了LMZ12002的输出电流与电压、波纹的关系,在测量波纹时,加大负载时,怎么就看不到波纹了呢!示波器用的是0.010V档,开始时略显有纹波,加大负载后的纹 ...…

查看全部问答>

TI国赛细则!

马上就要开始到南京参见TI杯全国赛了,对于比赛的细则不是很了解,有参加过TI全国赛的大神们能否详解下竞赛规则。比如竞赛全封闭,到底怎么个全封闭的形式,    手机能带吗?    可以上网吗?    可以带书吗? & ...…

查看全部问答>

李想STM32视频教程下载地址

李想老师讲解的STM32单片机视频,讲的通俗易懂,上去看看吧。 https://download.eeworld.com.cn/detail/zhangdaijinqf/551611 …

查看全部问答>

神级DIY:智能灌溉器解决盆栽植物浇水难题

在TI,我们欢迎那些在业余时间享受发明与创新的创客和爱好者。在德州仪器持续推出的“神级DIY”系列博客中,我们将为大家分享他们通过TI的技术所创造的奇妙发明。摘要:精心培养的盆栽植物总是在炎炎的夏日因为忘记浇水而枯萎死去,虽然现在市场上 ...…

查看全部问答>