mini2440使用uboot(详细)

发布者:心满愿望最新更新时间:2021-11-12 来源: eefocus关键字:mini2440  uboot  移植 手机看文章 扫描二维码
随时随地手机看文章

使用的mini2440开发板的详细信息:

kernel:linux-2.6.29-mini2440-20090708.tgz

gcc:arm-linux-gcc-4.3.2.tgz

uboot:bootloader.tgz(该压缩包内含有u-boot-1.1.6)

roots:root_qtopia-64M.img


问题源于:

(1)使用128M NAND Flash mini2440开发板的用户都知道,此时开发板附带的supervivi-64M和supervivi-128M都不再支持“空格”进入supervivi的menu菜单,而是改成了使用开发板上的k1~k6任何一个按键触发进入menu(而我需要空格键触发menu的方式);

(2)开发板附带的supervivi不支持网络下载kernel和root(文件系统)。


具体的修改步骤如下:

注1:arm-linux-gcc的安装方法见《mini2440-um-20090817.pdf》第5.3小节。

注2:mini2440开发板附带的uboot源码已经是经过移植的,适用s3c2440处理器,我们只需要修改一些uboot参数即可。


一、修改uboot源码

(1)解压出源码

创建工作目录

mkdir /tmp/workspace

cd /tmp/workspace

解压mini2440开发板光盘附带的uboot源码,bootloader.tgz同时包含了u-boot-1.1.6和vivi的源码

tar -xvf bootloader.tgz

cd u-boot-1.1.6

(2)修改u-boot-1.1.6/include/configs/open24x0.h文件


修改NAND FLASH MTD分区表:


56 /*

57 #define MTDPARTS_DEFAULT "mtdparts=nandflash0:2m@0(kernel)," /

58                             "8m(jffs2)," /

59                             "-(yaffs)"

60 */

61 #define MTDPARTS_DEFAULT "mtdparts=nandflash0:" / 

62                          "256k@0(boot)," /

63                          "64k(env)," /

64                          "2m(kernel)," /

65                          "-(yaffs)"

注:该分区表一定要与内核中的分区表一致,后面我会给出kernel中分区表的修改。


修改内核启动参数:

把“mtdblock2” 改为“ mtdblock3 ”


133 //#define CONFIG_BOOTARGS       "noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"

134 #define CONFIG_BOOTARGS         "noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"

注:此处一定要改,否则文件系统会加载失败(此处是让我最痛苦的地方,费了大量时间才找到这个症结所在)


修改env参数保存位置:


221 //#define       CFG_ENV_IS_IN_FLASH     1

222 #define CFG_ENV_IS_IN_NAND  1

223 #define CFG_ENV_OFFSET          0x40000

224 #define CFG_ENV_SIZE            0x10000 /* Total Size of Environment Sector */

注1:env是uboot引导系统时用到的一系列参数,是可修改的,如果不改动此处,env修改后,即使执行saveenv命令,断电后也会丢失。

注2:注意一下223和224行,这两行定义了env保存在nand flash的具体位置,与MTD分区表中的"64k(env)," 是对应的(64K=0x40000 - 0x10000)。



(3)修改u-boot-1.1.6/include/asm-arm/mach-types.h文件

修改machine ID


377 //#define MACH_TYPE_S3C2440              362

378 #define MACH_TYPE_S3C2440              1999


注1:查看linux-2.6.29/include/asm/mach-types.h会发现machine ID为1999

1985 #define MACH_TYPE_MINI2440             1999

注2:对于此处的修改Martin给出了他的经验:

“查看u-boot-1.1.6/board/open24×0/open24×0.c与linux-2.6.29/include/asm/mach-types.h,发现Machine ID果然设置的不对。mini2440的ID是1999,而u-boot中设置的是三星官方的362。改完,刷写,重启。

依然不灵。

这就有点土了。没有仿真器,没有打印信息,我和mini2440之间又不能通过脑电波交流…冥思苦想中,我进入了准无意识状态,大脑在迷惘,手指在不停地用NOR或者NAND启动mini2440。突然,我感到有什么东西不对。隐隐约约的,我似乎看到了什么东西,不应该出现的东西。定定神,一行一行地翻看串口console日志,貌似每一行都很正常,但最后我停在了SuperVIVI启动的一行语句上面:”Machine ID: 782″。

782?为什么会是782?我grep了一下linux-2.6.29/include/asm/mach-types.h,782是MACH_TYPE_PNX4008。先不想那么多,改成782试试。改完,刷写,重启。

Kernel成功启动了。

回过头研究782,不由哑然失笑。原来是这个linux-2.6.29移植的有点潦草,defconfig中的宏定义前后不一致,使得Machine ID没有设置为预想的值。好吧,这个问题就留在这里吧,也是一种不和谐美。”


注3:Martin用的可能是较老的mini2440开发板,我这一版已经解决了他提的这个问题,如果跟我的kernel一样,应该改为1999。


(4)修改uboot功能菜单,增加tftp下载功能选项

修改u-boot-1.1.6/common/cmd_menu.c文件,


在原文件中添加146~149行:


142 void main_menu_usage(void)

143 {

144     printf("/r/n##### uboot for mini2440 #####/r/n");

145 

146     printf("[1] TFTP Install U-boot/r/n");

147     printf("[2] TFTP Install Linux kernel/r/n");

148     printf("[3] TFTP Install JFFS2 root/r/n");

149     printf("[4] TFTP Install YAFFS root/r/n");

150     printf(" Download u-boot/r/n");

151 

152 #ifdef CONFIG_SURPORT_WINCE

153         printf("[e] Download Eboot/r/n");

154 #endif

155     printf("[k] Download Linux kernel/r/n");

156 #ifdef CONFIG_SURPORT_WINCE

157     printf("[w] Download WinCE NK.bin/r/n");

158 #endif

159     printf("[j] Download JFFS2 image/r/n");

160     printf("[y] Download YAFFS image/r/n");

161     printf("[d] Download to SDRAM & Run/r/n");

162     printf(" Boot the system/r/n");

163     printf("[f] Format the Nand Flash/r/n");

164     printf("[s] Set the boot parameters/r/n");

165     printf("[r] Reboot u-boot/r/n");

166     printf("[q] Quit from menu/r/n");

167     printf("Enter your selection: ");

168 }



在原文件menu_shell函数中添加200~235行



171 void menu_shell(void)

172 {

173     char c;

174     char cmd_buf[200];

175     char *p = NULL;

176     unsigned long size;

177     unsigned long offset;

178     struct mtd_info *mtd = &nand_info[nand_curr_device];

179 

180     while (1)

181     {

182         main_menu_usage();

183         c = awaitkey(-1, NULL);

184         printf("%c/n", c);

185         switch (c)

186         {

187             case 'u':

188             {

189                 if (bBootFrmNORFlash())

190                 {

191                     strcpy(cmd_buf, "usbslave 1 0x30000000; protect off all; erase 0 +$(filesize); cp.b 0x30000000 0 $(filesize)");

192                 }

193                 else

194                 {

195                     strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase bios; nand write.jffs2 0x30000000 bios $(filesize)");

196                 }

197                 run_command(cmd_buf, 0);

198                 break;

199             }

200             case '1':

201             {

202                 if (bBootFrmNORFlash())

203                 {

204                     strcpy(cmd_buf, "tftp 0x30000000 u-boot.bin; protect off all; erase 0 +$(filesize); cp.b 0x30000000 0 $(filesize)");

205                 }

206                 else

207                 {

208                     strcpy(cmd_buf, "tftp 0x30000000 u-boot.bin; nand erase boot; nand write.jffs2 0x30000000 boot $(filesize)");

209                 }

210                 run_command(cmd_buf, 0);

211                 break;

212             }


213             case '2':

214             {

215                 strcpy(cmd_buf, "tftp 0x30000000 uImage; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)");

216                 run_command(cmd_buf, 0);

217 #ifdef CONFIG_SURPORT_WINCE

218                 if (!TOC_Read())

219                     TOC_Erase();

220 #endif

221                 break;

222             }

223             case '3':

224             {

225                 strcpy(cmd_buf, "tftp 0x30000000 rootfs.jffs2; nand erase jffs2; nand write.jffs2 0x30000000 jffs2 $(filesize)");

226                 run_command(cmd_buf, 0);

227                 break;

228             }

229 

230             case '4':

231             {

232                 strcpy(cmd_buf, "tftp 0x30000000 rootfs.yaffs; nand erase yaffs; nand write.yaffs 0x30000000 yaffs $(filesize)");

233                 run_command(cmd_buf, 0);

234                 break;

235             }

236 

237 #ifdef CONFIG_SURPORT_WINCE

238             case 'e':

239             {

240                 offset = EBOOT_BLOCK * mtd->erasesize;

[1] [2]
关键字:mini2440  uboot  移植 引用地址:mini2440使用uboot(详细)

上一篇:mini2440开发板移植uboot后norflash环境变量保存
下一篇:mini2440使用jlink烧写superboot到norflash

推荐阅读最新更新时间:2024-11-04 12:35

移植ds18b20到stm32f103遇到的问题
之前在AVR单片机上用过DS18B20温度传感器,现在需要在STM32F103平台下使用,就直接在原先的代码基础上做了相应修改,调试时遇到的问题是测量值总是显示127.9375(读取的温度数据为0x7fff),用示波器看波形也没有发现问题,以为是18B20出问题了,又回到AVR下测试,结果正常。后来发现,不同之处在于供电:AVR用的5V,而STM32是3.3V。把18B20的供电电压换成5V就能正常工作了。又测试了18B20用3.3V供电,DQ脚5V上拉,测量数据还是不对,而且与上拉电阻值无关。数据手册上明明写的供电电压3~5.5V,难道是管子的问题? 总结一下STM32与AVR单片机在使用DS18B20的区别。 1
[单片机]
mini2440启动过程
ARM启动代码从系统上电开始接管CPU,依次需要负责初始化 CPU在各种模式下的堆栈空间、设定CPU的内存映射、对系统的各种控制寄存器做初始化、对CPU的外部存储器进行初始化、设定各外围设备的基地址、创建正确的中断向量表、为C代码执行创建ZI(零创建)区,然后进入到C代码。 在C代码中继续对时钟、RS232端口进行初始化,然后打开系统中断允许位。最后进入到应用代码中执行,执行期间响应各种不同的中断信号并调用预先设置好的中断服务程序处理这些中断。 初始化过程中模式变化过程为:管理模式-----各种特权模式(堆栈初始化阶段)----用户模式。若在系统初始化之前就触发了有效的中断,会导致系统的死机。 mini2440启动过程
[单片机]
Almalence将其图像处理软件移植到Tensilica新的IVP 图像/视频数字信号处理器上
美国加州SANTA CLARA和德州AUSTIN– 2013年2月18日-Tensilica与Almalence宣布合作,将Almalence的数字图像处理软件移植到Tensilica新的IVP图像/视频DSP(数字信号处理器)上。Almalence加入了Tensilica的Xensions合作伙伴计划,以其专业的图像处理背景为两家公司共同的新客户提供帮助。 Tensilica图像/视频产品总监Gary Brown表示:“Almalence是图像处理领域的专家,其算法弥补了手机摄像头与高端相机之间的差距,可以在光线不足,高倍变焦和高动态范围成像条件下提供清晰的高品质图像。该软件算法对采用了Tensilica的IVP图像/视频DS
[嵌入式]
uboot-2011.12移植到S3C2440(四)——SDRAM初始化之后,卡在board.c的memset不动
按照转载的(四序)中设置SDRAM,并且修改uboot.lds之后,程序走到memset不再运行,无法解决。暂停。这应该是NANDFLASH代码挪窝的问题,说是2410和2440不兼容。研究中。 uboot-2010.09和201112这两个版本的memset不同,在2011.12版本中,将memset写成汇编语言了,这个比较难整,等待N人解决吧。 这一部分,csdn有csuwzc进行了201103的版本的移植,简单看了下,发现做的很好,我出错的原因大致就在于栈设置不正确,以及其它的小细节,我不打算继续深究,我现在以uboot-2010.09为模板移植。
[单片机]
mini2440采用minitools工具烧写系统或裸机程序方法
(1)、先使用Jlink软件烧写Superboot2440.bin文件到NOR FLASH中,此时S2开关拨在NOR位置。 a、 加载工程:File - Open project - 选择s3c2440a_embedclub.jflash(类似的也行) b、加载文件:File - Open data File - 选择Superboot2440.bin - 地址为0 c、连接和下载:Target - Connect - (连接成功后) - Auto - (完成下载)- Disconnect (2)、拔掉Jlink线,然后接上USB,如果是第一次使用会提示安装USB驱动(如果没反应,就重启一下开发板),第二次之
[单片机]
<font color='red'>mini2440</font>采用minitools工具烧写系统或裸机程序方法
TMS320F28x上RTOS移植关键技术分析
  TMS320F28x(简称“F28x”)数字信号处理器是TI公司推出的32位定点DSP控制器,其频率高达150 MHz,大大提高了控制系统的精度和芯片的处理能力。在F28x系列DSP上移植实时操作系统,需要对编译器、系统启动过程、中断处理过程以及整体代码执行流程有一个全面的深入理解。对系统的整个运行过程有清晰的概念是移植实时操作系统的前提条件。本文将对从DSP上电复位到其系统功能实现的整个运行过程进行深入介绍,并在此基础上进一步分析在F28x系列DSP上移植实时操作系统一般原理,详细说明μC/OSⅡ的移植。 1 BootROM及其运行   在F281x、C281x、R281x器件中都有一块4K×16位的BootROM。当引
[单片机]
TMS320F28x上RTOS<font color='red'>移植</font>关键技术分析
NFC会是下一个被移植到汽车上的技术
当汽车成为电子行业最为重要的细分市场之后,很多技术都被慢慢移植到汽车之上,下一个会是谁? 在跟电子行业的朋友聊天时,车云菌常能听到这种论调:“俺这个行业都日薄西山了,也就是汽车拯救了俺们。”且不论电子行业是否真的日薄西山,但是汽车,确实已经成为它们一个相当重要的细分市场。很多企业都十分努力在汽车行业找到看家本领的第二春。 比如说HUD(抬头显示),虽说现在HUD在汽车上还并没有普及开来,只在一些中高端车型上才有搭载,但是在很多概念性技术和概念车上,HUD的存在已然让人习惯。那么,下一个会被移植到汽车上的技术会是什么呢? 美国工程师协会(SAE)最近的一篇文章中认为,NFC技术将会成为下一个被从移动端移植到汽车上的技术
[嵌入式]
Uboot makefile学习记录
U-BOOT顶层makefile与linux的顶层mkefile不同,每个板有一个配置定义,如下,需要先配置后,才能make forlinx_nand_ram256_config : unconfig @$(MKCONFIG) smdk6410 arm s3c64xx smdk6410 samsung s3c6410 NAND ram256 其通过./mkconfig脚本生成include/config.mk文件,include/config.h和/board/samsung/smdk6410/config.mk,以及一些链接文件 include/config.mk文件内容如下: ARCH = arm CPU = s3
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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