根據網友們遇到的這個共同問題,總結一下各種解決的辦法。
遇到這樣問題的網友可以根據下面的建議逐個檢查。
1. bin/busybox文件是可以執行的。
2. 在配置busybox的時候要選中shell選項中的一個選項
3. linuxrc 是可執行的。4. 制作文件系統的時候利用的工具也要留意區分:
mkcramfs 制作cramfs鏡像的工具
mkimage 制作jffs2鏡像的工具
mkyaffs2image 制作2.6的yaffs2的鏡像工具(針對Nand Flash是128MB到1GB的)
mkyaffsimage 制作2.6.13的yaffs2的鏡像工具
mkyaffsimage_2 制作2.6.25.8或2.6.30.4或更高版本內核的yaffs2的鏡像工具(針對Nand Flash是 64MB的)
4. 你使用的是256MB的Nand Flash,而在配置內核的nand時選擇ecc校驗???(在選擇了出現問題,注銷了就不出問題了)
在移植linux2.6.38過程中,遇見了很多的問題,通過在網上查閱相關信息和在圖書館不停的查閱資料,終於成功了。下面將移植過程中產生的問題及其解放方法與大家共享一下。
1、編譯內核時yaffs2出現unknown field 'clear_inode' specified in initializer的
錯誤,原因是所下載的yaffs2不支持linux2.6.38.
解決方法:最新的yaffs2采用git發布,所以采用git工具下載最新的yaffs2源代碼。
具體為在終端輸入git clone git://www.aleph1.co.uk/yaffs2下載最新的yaffs2,下
載完成給內核打補丁,進入yaffs目錄,執行
./patch-ker.sh c m opt/Andy/linux-2.6.38(以自己的內核目錄為准),其中的c代表復制,m代表復合類型。
2、移植linux內核到開發板後,出現data abort的錯誤,錯誤原因為內核大小超過了2M,
天嵌的Uboot只分配給內核2M的空間,所以報錯。
解決方法:精簡內核,使其小於2M。或者修改Uboot,是內核大小大於2M。
所以個人認為天嵌的Uboot值得改進,下一步我將移植Uboot,用自己的Uboot就不存在這個問題了。嘿嘿
3.移植內核時,出現Uncompressing Linux... done, booting the kernel後,系統不能啟動,網上好多人說是因為在menuconfig選項中的Boot options中的Default kernel command string中沒有設置noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 rootfs=yaffs2 rw。其實不用設置這個參數也可以,我采用在內核配置文件中將Kernel Feature/Provide
old way to pass kernel parameters選上就行了,因為天嵌用的bootloader太老了,從打印的內核信息中就可以看出。(ATAG_INITRD is deprecated; please update your bootloader.)
4.內核啟動時,出現Failed to execute /linuxrc的錯誤,原因是:
(1)文件系統中沒有包含linuxrc的可執行文件。在文件系統中添加linuxrc就可完成linux的啟動。
(2)在/driver/mtd/nand/s3c2410.c中將chip->ecc.mode = NAND_ECC_SOFT;改為chip->ecc.mode = NAND_ECC_NONE;並在配置內核中將Samsung S3C NAND Hardware ECC選項刪掉。
這個問題糾結了我好久,我遇見這個問題後,先嘗試用nfs掛載,能夠掛載上,所以我確定肯定是nandflash出了問題了,以為nandflash壞了(因為被我不停的擦寫,嘿嘿),後來用天嵌自帶的鏡像試了是好的,我就明白了,估計是我的nand驅動有問題了,仔細檢查驅動,發現內核配置中的Samsung S3C NAND Hardware ECC沒有去掉,
,一個小小的問題折磨了我這麼久。所以一定一定要仔細啊。
5.編譯串口驅動是出現error: implicit declaration of function 's3c2410_gpio_cfgpin'的錯誤,是因為內核版本2.6.38的內核定義s3c2410_gpio_cfgpin是在linux/gpio.h中,所以添加#include <linux/gpio.h>後即可。
6.編譯串口驅動是出現error: 'S3C2410_GPH6' undeclared (first use in this function)是因為在內核版本2.6.38的內核定義s3c2410_gpio_cfgpin的函數變量采用的是S3C2410_GPH(6),而非S3C2410_GPH6,將其改為S3C2410_GPH(6)即可解決問題。
7.linux內核2.6.38的串口程序samsung.c在/driver/tty/serial中。這裡與原來的內核版本不一致。這個要注意,內核版本改了,接口也改了,我當時找不到samsung.c,然後通過find命令一看,暈,原來在這裡面。
8.在添加yaffs2內核支持時,找不到Kconfig,復制Yaffs2文件夾中的Kconfig_muti到linux內核的fs/yaffs2中,並將Kconfig_muti修改為Kconfig。