唉....当了太久的咸鱼了...遇到各种坑,翻了好多资料....杂七杂八的乱成一团。。现在抽空整理一下,以便日后可以参考。
这段时间,零零碎碎地做了不少东西,先是移植了2440的uboot,内核以及根文件系统的制作,这部分有一些参考的视频,2440板子玩的人也比较多,所以参考资料相对较多。。对这一部分就不整理了。之后主要是对一块am3358的板子进行移植,这块板子的uboot我就不碰了,主要是对内核和根文件系统开刀。
首先应该吐槽的是,在移植2440板子的内核时,压根就没有用到设备树这个概念。后面我师父和我说了要去了解dtb我才知道有这么个回事(我也是新手,求别喷哈)。然后就各种找资料呗。真的是看了好多大牛写的博客,反正刚接触,看得也是一知半解吧,大概大概能知道他说的是怎么一回事。然后干嘛,剁咦啊(我家乡话,是做它的意思)!废话不多说,直接来。
首先,你得下载一个新版本的内核,我用的是Linux 3.8.4 反正各种版本地址都在下面了,自己下吧:
https://www.kernel.org/pub/linux/kernel
然后解压 tar xjf linux3.8.4.tar.bz2
cd linux 3.8.4 进入内核目录
一、编译内核和dtb
1、首先修改Makefile
vi Makefile 把它打开,找到ARCH那两行修改为:
ARCH=arm
CROSS_COMPILE=arm-linux- (注意,这个是根据你的编译工具来改的,我的是arm-linux-gcc, 其他的话,对应着该,比如arm-none-linux-gnueabi-之类的 )
2、然后 make XX_defconfig
由于am335x属于omap2plus_defconfig系列(在arch/arm/configs目录下有很多配置文件)
所以直接 make omap2plus_defconfig
3、有必要的话,可以在这一步就make menuconfig ARCH=arm 做进一步修改 (也可以后面调试的时候,看出了什么问题再修改)
4、编译uImage 直接 make uImage (生成的文件在arch/arm/boot目录下)
5、编译dtb (在arch/arm/boot/dts目录下) 我师父在制作这块板子的时候说可以参考beaglebone的板子来移植,于是乎 我就编译了am335x-bone.dtb
make ARCH=arm am335x-bone.dtb
注意,一定要找到自己板子对应的dts文件,不然的话,启动不了,我就被这个坑过。
生成的文件在(arch/arm/boot/dts目录下)。
二、测试启动
经过上面的编译,我们已经有了uImage 和am335x-bone.dtb这两个文件了。咱们先来启动一下,看能不能启动得了,至于内核裁剪,后面再说吧。
首先在uboot命令界面下,用TFTP命令把uImage和am335x-bone.dtb 下载到内存,并且bootm启动,需要注意的是,由于我们还没有制作ramdisk的映像文件,所以启动参数的第二项用-代替,格式为bootm [uImage] [ramdisk] [xx.dtb]对应我们下载的地址就是bootm 80200000 - 81280000。
很不错,能启动了,只是后面提示说:Unable to mount root fs on unknown-block,不能挂接到根文件系统下。
那么我们的第一步就算完成了,接下来制作文件系统ramdisk...
需要注意的是,在第一步中,如果遇到启动是出现 starting kernel.....然后就卡死不动的情况,可能是machID不相同,也可能是其他原因,这个时候,可以尝试在内核目录下make menuconfig ——>kernel hacking——>选kernel low-level dabug function,和early printk...在编译一次uImage 看看能不能打印出错误的消息。
继续说构建根文件系统。
这部分我也是看某位博主的博客来做的,亲测有效,我就不折腾了,我把链接贴出来,跟着做就行了
http://blog.csdn.net/girlkoo/article/details/8719828
http://blog.csdn.net/girlkoo/article/details/41258583
如果看这两篇博客还觉得有问题的话,可以找一下韦东山老师讲解的视频参考。
反正经过这两篇博客,我就认为你制作好了ramdisk.img
这里我遇到一个坑是:使用genext2fs 命令的时候,提示
genext2fs: couldn't allocate a block (no free space)
解决的办法是 genext2fs -b 4096 -d .....中的4096改大,我一直改到65536才通过。后面uImage也要对应着改。 想具体了解,可以参考这篇博客: http://blog.csdn.net/u014213012/article/details/51582826里面讲得非常详细,就按照他说的,在make menuconfig 里面改。如下: Device Drivers-->Block devices-->选择 RAM block device support 项
c) :选上Default RAM disk size kbytes选项为(65536)Default RAM disk size kbytes
然后,继续按照制作ramdisk.img的博客来制作。。最后我们得到uImage ramdisk.img am335x-bone.dtb这三个文件。在boot界面下,对bootargs参数进行修改。如下:setenv bootargs console=ttyO0,115200n8 root=/dev/ram0
然后用tftp分别把上面三个文件下载到内核,并且启动:bootm 80200000 82000000 81280000
于是乎,内核成功挂载到文件系统上了。。。然后可以做进一步的裁剪,优化之类的,放到SD卡就可以了。。