使用的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;
上一篇:mini2440开发板移植uboot后norflash环境变量保存
下一篇:mini2440使用jlink烧写superboot到norflash
推荐阅读最新更新时间:2024-11-04 12:35
设计资源 培训 开发板 精华推荐
- LT4275CIMS IEEE 802.3af(类型 1)13W 受电设备的典型应用电路
- AD8177-EVALZ,基于 AD8177 三路视频交叉点开关的评估板
- 用于微处理器复位电路的 NCP300LSN25T1 2.5V 电压检测器的典型应用
- AD9517-3A/PCBZ,AD9517-3A 评估板,2000 MHz 极低噪声 PLL 时钟合成器
- 用于低待机功耗离线 SMPS 的自供电单片开关 NCP1010 的典型应用
- RT9166A 300/600mA、超快速瞬态响应LDO稳压器的典型应用
- MP1584EN(DC-DC可调降压模块)
- 正负电源——TPS5430
- EVAL-AD7634EDZ,用于 AD7634 PulSAR 48 引线 ADC 的评估板
- LTC2862AHS8-2 PROFIBUS 兼容线路接口的典型应用