本文將介紹如何移植linux-3.4.2核心到jz2440開發板上的全過程,使用的交叉編譯工具版本為 arm-linux-gcc-4.3.2.tar.bz2
下面來一步一步介紹如何移植。
由於kernel的啟動引數是由uboot傳遞的,關鍵的引數有 r0=0 r1=mach-type r2=tag引數位址
其中,mach-type為核心支援板子的硬體型號,tag引數為uboot存放傳遞給kernel引數的記憶體位址。
核心啟動時,根據傳入的mach-type引數選擇對應的板級初始化函式來初始化,然後解析tag引數,設定相應系統狀態值,裝載驅動程式,最後掛載根檔案系統。
修改根目錄下面的makefile,該arch ?= arm ,cross_compile ?= arm-linux-
針對arm架構的板級配置檔案,位於 arch/arm/configs/mini2440_defconfig 和 s3c2410_defconfig 這兩個有參考意義的配置檔案。
配置核心 make s3c2410_defconfig
編譯核心 make uimage //最終生成的uimage位於 arch/arm/boot/uimage
測試新核心 開機進入boot命令列,tftp 0x32000000 uimage ; bootm 0x32000000;
問題解決:新核心啟動後,有可能串列埠列印出亂碼,原因可能是 uboot沒有傳遞 console 的正確引數,也有可能是核心對於串列埠時鐘頻率沒有初始化成功。
uboot啟動時傳遞的mach-type,如果有命令列指定的,則使用指定的,否則就使用環境變數中的machid值。
對於核心來說,每種硬體配置的板子都對於乙個固定的mach-type id,uboot傳遞的mach-typ必須與其一致,這樣,核心才能正確識別。
最少的核心啟動命令列: set bootargs console=ttysac0,115200 root=/dev/mtdblock3 ; set machid mach_id
核心支援的板級列表檔案為: include/generated/mach-types.h
這裡,我們使用的是smdk2440配置:
1://arch/arm/mach-s3c24xx/mach-smdk2440.c
2:static
void __init smdk2440_map_io(void)
3:然後,重新編譯,測試就可以。
預設核心啟動,對nand flash的分割槽如下:
這樣的分割槽,不是我們想要的,通過在核心**中搜尋 「s2c2410 flash partitions 1」可以找到位於 common-smdk.c中smdk_default_nand_part分割槽陣列。
我們期望的分割槽為:
8: [1] = ,
13: [2] = ,
18: [3] =
23: };3.4.2核心版本 預設支援 jaffs2 檔案系統,而且在掛載根檔案系統的過程中,嘗試能夠支援的檔案系統型別(ext2,3,cramfs,vfat,msdos romfs等)
如果檔案系統型別為 jffs2型別,需要重新設定bootargs,
set bootargs console=ttysac0,115200 root=/dev/mtdblock3 rootfstype=jffs2
如果是yaffs2型別,不需要重新設定
編譯根檔案系統的編譯器最好和編譯核心的編譯器保持一致。 先配置好交叉編譯工具鏈,然後編譯busybox後,執行 make install config_prefix=/home/hao/nfs/fs_mini_mdev_new/ , 這樣,基本的檔案系統框架出來了。
接著,安裝glibc庫, 拷貝交叉編譯工具鏈目錄下的
構建基本的linux目錄,etc目錄,這個目錄可以參考以前已經建立好的etc目錄
dev目錄,這個目錄下,需要事先建立兩個特殊裝置 console 和null ,具體資訊可以參考linux系統上的裝置
其他必須的目錄有,proc,tmp,mnt,sys,root等。
建立jffs2檔案型別的根檔案系統:
mkfs.jffs2 -n -s 2048 -e 128kib -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
-s 扇區大小
-e 可擦除塊
-d 源目錄
-o 輸出檔案
如果出現 :
說明,核心收到退出**為0x04的訊號,經過查閱得知為非法指令,可能是核心不支援由此編譯器編譯出的init的特殊指令,需要設定核心支援此指令。
kernel features –> use the arm eabi to compile the kernel 選中已支援 eabi特性。
為什麼核心不支援yaffs2檔案系統呢?因為核心**中不包含yaffs檔案系統原始碼,但是包含jffs2檔案系統原始碼。
切換到yaffs2目錄中,執行 ./patch-ker.sh c m /to/linux/dir ,然後去linux原始碼中,通過make menuconfig來配置yaffs2即可。
編譯yaffs2**現的錯誤,是yaffs中結構體函式引用不正確,加上下劃線就可以了。
另外,需要在 最新版本的uboot的** drivers/mtd/nand/nand_util.c 中 ,新增 with_yaffs_oob這一項,就可以正常啟動yaffs格式的uimage了。
// drivers/mtd/nand/nand_util.c
555 if (!need_skip && !(flags & with_drop_ffs) && !(with_yaffs_oob))現在 .config配置檔案中找支援的單板型別,然後在menuconfig中搜尋選項配置位置,按圖索驥,去掉對於支援型別選項。
去掉核心支援的其他單板型別,只保留指定單板**:
在嵌入式領域用不到的檔案系統,可以去掉,例如 ext2、ext3、ext4等。msdos要保留,應該以後可能會接u盤,而u盤一般為vfat檔案系統。
……..寫的不好,未完待續……………..
technorati 標籤:
kernel 移植
移植madplay到jz2440 學習筆記
平台 jz2440 交叉編譯工具 arm linux gcc gcc 3.4.5 pc環境 ubuntu16.04 一 移植madplay到jz2440需要的安裝包 libid3tag 0.15.1b.tar.gz libmad 0.15.1b.tar.gz madplay 0.15.2b.tar....
linux3 4 2核心 LCD驅動程式的移植
彙總點這 需要把頭檔案修改 關於設定 s3c2440 lcd控制器的設定 修改之後需要重新配置編譯核心,把原來的lcd驅動變成模組 s3c2410 lcd framebuffer support。silicon motion sm501 framebuffer support也需要配置成模組,因為有...
u boot到kernel的引數傳遞
在u boot 的最後提到傳遞引數給核心,呼叫如下 呼叫核心,暫存器 r0 0,r1 機器型別,r2 引數塊位址 thekernel 0,bd bi arch number,bd bi boot params 而這兩個引數是如何傳遞給 kernel 的分析如下 只涉及到非彙編部分 一 u boot ...