历史上的今天
返回首页

历史上的今天

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

正在发生

2021年11月12日 | mini2440使用uboot(详细)

2021-11-12 来源:eefocus

使用的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;

推荐阅读

史海拾趣

Echelon公司的发展小趣事

随着公司业务的不断发展,Echelon开始积极拓展全球市场。公司通过在海外设立分支机构、与当地企业合作等方式,将LonWorks技术和能源管理服务方案推广至全球各地。同时,Echelon还积极参与国际能源管理标准的制定和推广工作,提升了公司在国际市场的知名度和影响力。

GE Solid State公司的发展小趣事
在嘈杂的环境中,声音信号可能受到干扰,影响用户的判断。
雅特力(Artery)公司的发展小趣事

雅特力深知人才是企业发展的核心力量。因此,公司始终重视人才培养和团队建设。雅特力通过招聘优秀的专业人才、开展内部培训、设立激励机制等方式,打造了一支高素质、高效率的团队。这支团队不仅具备丰富的技术知识和实践经验,还具备高度的创新意识和团队协作能力。正是有了这样一支优秀的团队,雅特力才能够在激烈的市场竞争中脱颖而出,实现持续稳健的发展。

Hirschmann公司的发展小趣事
在定时电路中,电阻和电容是决定延时时间的关键因素。通过更换不同阻值和容值的电阻和电容,可以直接调整电路的延时时间。这种方法简单直接,但需要实际测量和调试以确保延时时间的准确性。
Hind Rectifiers Ltd公司的发展小趣事
TC4013作为定时器的核心,通过接收外部触发信号(如时钟信号的上升沿)来控制定时器的置位和复位。它内部的JK触发器可以根据输入的信号状态(J、K、时钟信号等)来设置或重置其输出状态。
东通电子公司的发展小趣事

东通电子深知人才是企业发展的关键因素。因此,公司一直致力于引进和培养人才,建立了一支高素质、专业化的团队。公司现有员工550人,其中技术人员31人,质量管理人员27人,研发团队12人。这些人才为公司的发展提供了有力的支持,也为公司的技术创新和品质提升奠定了基础。

以上是关于东通电子在电子行业中发展起来的相关故事概述。这些故事展示了东通电子在品质、技术创新、生产规模、环保和人才建设等方面的努力和成就。

问答坊 | AI 解惑

今年的大学生电子竞赛题目,大学生做的出来???

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 我看了半天,要我在3天3夜做出来,不可想象。 我都3年研发经验了,而且参加过05年的电子竞赛,是天津市2等奖。 可是,看到现在的题目,我怀疑是大学生能做出来的吗??? 如果真能大学生自己做出 ...…

查看全部问答>

盘点2009:中国光伏十大年度关键词

这个世界已经越来越有方向感,一群远见的精英思想正在汇聚成一张清晰的低碳线路图,供人类未来抵达。拯救地球环境,不能或缺中国力量。2009年度,中国光伏正在赶往一条叫做社会责任的低碳大道上。…

查看全部问答>

Camera 应用开发

平台:6410+WINCE6.0 新开一个贴,再讨论一下这个CAMERA应用开发,因为本人一直是做驱动的,现在要写应用,而且是COM接口的directshow,所以有很多东西要向大家请教,    用640X480分辩进行preview 和 拍照都没有问题,但是,我驱动给di ...…

查看全部问答>

讨论 WINCE5 2440 中堆和栈的分配问题

在一个线程中定义一个数组, 大小为320*240*8 定义1:U8 cData[320*240*8];   这个应该存在系统的stack里面,结果data abort失败了,提示就是stack的问题,于是重新 定义2:U8 *cData = new U8[320*240*8]  ,这个没有问题 ...…

查看全部问答>

无线遥控控制直流电机

按键控制无线遥控发送是脉冲 现在我想对接收板接收到无线模块发送的信号进行分析 1.如果只是单个脉冲电机就微动一下 2.如果是连续的脉冲,电机就保持转动状态,再发一个脉冲,电机才停止 现在不知道如何判断发送的是单个脉冲还是连续脉冲 请高 ...…

查看全部问答>

楼主,我能不能用DMA实现这个功能

我用双路AD同步采集,采集后的数据通过DMA传送的一个32位数组空间内,采集100次,100次后AD采样自动从从数组的开始位置存放。是不数不能实现这个功能啊?我怎么做不出来啊,我的数据只能采集16个,而且数据好像不是按我的要求去转换不同的通道…

查看全部问答>

TI 原厂LM3S8962板上调试部分的 CPLD 起到什么样的作用呢

TI  原厂LM3S8962板上调试部分的 CPLD 起到什么样的作用呢? 设计调试仿真器的时候,是否可以不用它?…

查看全部问答>

F2812断货原因

请问F2812为什么出现断货,什么时候恢复正常…

查看全部问答>

Unix环境高级编程 习题

附录A   函数原型 497附录B   其他源代码 512附录C   习题答案 518…

查看全部问答>