这是第一篇正式的内容。
在第一期中,使用的是韦老师的uboot,内核,文件系统,于是我遇到的第一个问题就是如何烧写。韦老师的视频是基于jz2440讲解的,同时提供了mini2440和tq2440的代码,最后我在淘宝买了mini2440。买的时候想的很简单,觉得随便在网下就可以下载到mini2440的相关资料,也正是因为这个想法,使我浪费了大概一个星期的时间。
韦老师的视频时间很早,大概是09年吧,那个时候烧写工具还比较单一,也比较麻烦。我只凭着韦老师的视频,和我在网上随便下载的光盘资料,发现怎么都没有办法完成烧写。首先是mini2440里nor flash里烧写的程序有点怪,没有办法通过dnw进行交互。于是我想到可能是有人修改了nor flash里的bootloader(准确来说是supervivi)。所以面临的一个问题就是使用jtag重新烧写uboot。可配套的jtag是并口,我使用的笔记本并没有并口,于是我把我家的老电脑搬了出来,结果却无法识别出cpu,就这样,我又换了好几个同学家的电脑,均以失败告终。后来在网上查了很多资料,又问了淘宝卖家,抱着试一试的态度下载了他给的最新版开发光盘。里面的使用手册很清楚的告诉我,他们已经淘汰了dnw,开发板里的bootloader有配套的最新烧写工具,傻瓜式操作。。。不管怎么说吧,烧写uboot终于成功了。可接下来又遇到了一个问题,就是烧写内核。每次显示烧写内核成功但是读取的时候总是读取不到内核,提示nand坏块太多。我也是各种查资料未果,后来自己猜测,可能是烧写的位置不对:原版的bootloader是supervivi,而韦老师的bootloader是uboot,但我使用的是原厂的烧写软件,可能是分区不匹配导致内核无法读取!于是我在uboot源码中找到了分区:
static structmtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 0x00020000,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 0x00200000,
},
[3] = {
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
在supervivi中找到分区:
static structmtd_partition friendly_arm_default_nand_part[] = {
[0] = {
.name = "supervivi",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param",
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Kernel",
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root",
.offset = 0x00560000,
.size = 1024 * 1024 * 1024, //
},
[4] = {
.name = "nand",
.offset = 0x00000000,
.size = 1024 * 1024 * 1024, //
}
};
果然不匹配!想来一定是烧写内核都是从0地址开始的,所以uboot才烧写成功了,而内核就不行了。
搞定好内核之后,又设置了网络文件系统,算是全都解决了。
再补充一个,由于笔记本没有串口,所以没办法直接和板子相连打印调试信息。我这里有以前学习uboot使用的imx280时买的usb转ttl和串口转ttl,所以我想着这样连接usbàttlà串口àmini2440可惜想法很丰满,最后却没有实现功能,也不知道是什么原因。所以我单独在网上买了一条usb转串口线,才解决问题。