AM3358内核移植与根文件系统的制作

时间:2022-05-04 00:32:51

唉....当了太久的咸鱼了...遇到各种坑,翻了好多资料....杂七杂八的乱成一团。。现在抽空整理一下,以便日后可以参考。

这段时间,零零碎碎地做了不少东西,先是移植了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。

<Linux>AM3358内核移植与根文件系统的制作

很不错,能启动了,只是后面提示说:Unable to mount root fs on unknown-block,不能挂接到根文件系统下。

<Linux>AM3358内核移植与根文件系统的制作

<Linux>AM3358内核移植与根文件系统的制作

那么我们的第一步就算完成了,接下来制作文件系统ramdisk...

需要注意的是,在第一步中,如果遇到启动是出现 starting  kernel.....然后就卡死不动的情况,可能是machID不相同,也可能是其他原因,这个时候,可以尝试在内核目录下make menuconfig   ——>kernel hacking——>选kernel low-level dabug function,和early printk...在编译一次uImage  看看能不能打印出错误的消息。

<Linux>AM3358内核移植与根文件系统的制作

继续说构建根文件系统。

这部分我也是看某位博主的博客来做的,亲测有效,我就不折腾了,我把链接贴出来,跟着做就行了

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也要对应着改。 想具体了解,可以参考这篇博客: <Linux>AM3358内核移植与根文件系统的制作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<Linux>AM3358内核移植与根文件系统的制作
<Linux>AM3358内核移植与根文件系统的制作
于是乎,内核成功挂载到文件系统上了。。。然后可以做进一步的裁剪,优化之类的,放到SD卡就可以了。。