都是我自己遇到的,肯定不全,还望见谅。。。问题比较小白,怕以后会忘记,写在这里方便查找。
编译环境:linux2.6.36.2
文件系统:nfs
交叉编译器:gnu 4.4.1
开发板:ok6410
1、在编译内核的过程中,可能会出现"mkimage" command not found - U-Boot images will not be built"的语句,这时,去uboot目录下,有个tools目录,里面有个mkimage。将其放入/usr/bin目录下,设置权限全开。
编译内核的时候老出现这样的错误:
在 google 查到的都是说arch/arm/kernel/vmlinux.lds的最后两行(如下),给注释起来,但是没说为什么
ASSERT((__proc_info_end - __proc_info_begin), "missing CPU support")
ASSERT((__arch_info_end - __arch_info_begin), "no machine record defined"
后来自己到 arch/arm/kernel/vmlinux.lds 看注释才知道
These must never be empty
If you have to comment these two assert statements out, your
binutils is too old (for other reasons as well)
在编译通过。
2、编译内核的时候,如果要产生uImage文件,前提是编译的系统要有mkimage。这个工具在uboot主目录下的tools目录下。但是很多都是针对windows的。比较烦。我自己试着在linux下手动编译了半天都没成功。
但是在ubuntu下,可以用 sudo apt-get install mkimage解决问题。ubuntu好方便。。。
3、如果已经有了一个配置好的内核文件.config。现在你不想完全重头配置内核,只是做修改的话。可以用make menuconfig ARCH=arm进入后,选择最下面的Load an Alternate Configuration File选项,然后选择那个已经配置好的.config。
4、我编译内核的目的在于,飞凌给的那个linux内核编译进去了按键的驱动。卸载不掉。在编译内核里的device driver--->input driver--->keyboard driver--->gpio 路径大约是这个样子的。打开一看就知道了。把那个keyboard driver直接去掉。我是这么做的。编好后,cat /proc/interrupts就不再有键盘的中断显示出来了。
我用的make uImage ARCH=arm CROSS_COMPILE=arm-linux-命令编译的内核,编译完成后,在arch/arm/boot下不但有uImage 还有zImage。以前都没有人提到过,看网上都说的编译时候用make uImage,编译出来就只uImage,要zImage的话要通过转换得到。没想到自己实践一下还得到个小意外。
5、我全程在linux下烧录内核。用的网上的那个linux版本的dnw,针对2440的,自己按说明改动了一下,能给6410用了。挺好用的。烧录的时候要检查串口是否链接,USB是否链接。然后进入那个编译好的dnw的目录。sudo insmod secbulk.ko就是将那个编译好的module文件加载上。我在这里遇到的问题是:加载该文件后,一直无法在/proc/devices下看到secbulk。用dmesg可以看到secbulk loaded字样。但没有/dev/secbulk文件。当然无法使用./dnw传送文件。后来才发现,依然是自己问题。在传输文件前,首先将module加载上,然后把USB线插好,这时候是不会有设备文件的。要在uboot下输入dnw 50008000让uboot去连接主机,他会显示有字样。此时正常的话uboot会显示说什么已经链接上主机,等待下载东西。现在再去看设备文件,就有/dev/secbulk了。操作顺序一定要注意。
6、让uboot就绪后,在minicom下,输入./dnw filename 就是你想拷贝的那个文件名字,等待传输。
传输完成后,擦nandflash:nand erase 100000 500000把内核装载的地址位置那块擦出来。然后写刚才下好的那个内核映像文件(补充,我用的zImage,本来想试试uImage看看有什么不同的……以后再看)nand write.e 50008000 100000 500000。这俩500000都是size。100000是offset。
等待完成后就重启uboot下reset。就可以直接进入linux。