移植3 4 2的Kernel到JZ2440

2021-09-08 10:52:40 字數 3592 閱讀 1726

本文將介紹如何移植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 ...