linux-2.6.32.2内核在mini2440上的移植,Linux2.6.32.2移植到Mini2440
1.移植內核的準備工作
(1)使用的環境
操作系統:Fedora 10
交叉編譯工具使用:arm-linux-gcc-4.3.2
(2)獲取內核
有很多方式可以獲取 Linux 內核源代碼,如果你的 Fedora10 平臺可以上互聯網,可以直
接在命令行輸入以下命令獲取到最原汁原味的 Linux-2.6.32.2:
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz
當然你也可以先在 Windows 系統下使用迅雷等工具下載完,再復制到 Fedora10 中。
(3)交叉編譯工具
交叉編譯工具使用友善之臂的arm-linux-gcc-4.3.2,他們提供的編譯器是符合EABI標準的編譯器。其中關于EABI的介紹可以參看下面:
1。什么是ABI
ABI,application binary interface (ABI),應用程序二進制接口。
既然是 接口,那就是某兩種東西之間的溝通橋梁,此處有這些種情況:
A。應用程序 操作系統;
B。應用程序 (應用程序所用到的)庫
C 。應用程序各個組件之間
類似于API的作用是使得程序的代碼間的兼容,ABI目的是使得程序的二進制(級別)的兼容。
2。什么是OABI 和 EABI
OABI中的O,表示“Old”,“Lagacy”,舊的,過時的,OABI就是舊的/老的ABI。
EABI中的E,表示“Embedded”,是一種新的ABI。
EABI有時候也叫做GNU EABI。
OABI和EABI都是專門針對ARM的CPU來說的。
3。EABI的好處 / 為何要用EABI
A。支持軟件浮點和硬件實現浮點功能混用
B。系統調用的效率更高
C。后今后的工具更兼容
D。軟件浮點的情況下,EABI的軟件浮點的效率要比OABI高很多。
4。OABI和EABI的區別
兩種ABI在如下方面有區別:
A。調用規則(包括參數如何傳遞及如何獲得返回值)
B。系統調用的數目以及應用程序應該如何去做系統調用
C。目標文件的二進制格式,程序庫等
D。結構體中的 填充(padding/packing)和對齊。
E。
OABI:
* ABI flags passed to binutils: -mabi=apcs-gnu -mfpu=fpa
* gcc -dumpmachine: arm-unknown-linux
* objdump -x for compiled binary:private flags = 2: [APCS-32] [FPA float format] [has entry point]
* "file" on compiled Debian binary:
ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped
* "readelf -h | grep Flags""
Flags: 0x0
EABI:
* ABI flags passed by gcc to binutils: -mabi=aapcs-linux -mfloat-abi=soft -meabi=4
* gcc -dumpmachine: arm-unknown-linux-gnueabi
* objdump -x for compiled binary:
private flags = 4000002: [Version4 EABI] [has entry point]
* "file" on compiled binary (under Debian):
ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped
* "readelf -h | grep Flags""
Flags: 0x4000002, has entry point, Version4 EABI
(4)硬件平臺
友善之臂的Mini2440,NandFlash64M,NorFlash2M的。NandFlash容量的不同,在后邊制作根文件系統的時候會有所不同。
2.修改內核以適應本開發板
(1)假設我們把內核文件下載到了opt/mini2440/目錄下,進行解壓操作。
#cd opt/mini2440
#tar -zxvf linux-2.6.32.2.tar.gz
得到Linux-2.6.33.3文件夾
(2)修改Makefile文件
首先,我們要使Linux的默認的平臺是arm平臺,進入Linux-2.6.32.2文件夾中,修改此目錄下的Makefile文件。修改成下面的代碼,使其平臺是ARM平臺,交叉編譯是arm-linux-
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm //使用的目標平臺
CROSS_COMPILE ?= arm-linux- //使用的交叉編譯器,這里使用的系統默認的
接下來,測試一下Linux內核是否可以順利的編譯通過。
#make s3c2410_defconfig //使用缺省的配置文件,也就是SMDK2440的缺省配置文件
# make //編譯時間大約在20分鐘左右
(3)關于機器碼
很關鍵的一點是,在啟動內核時,是根據bootloader傳入的機器碼(MACH_TYPE),來決定應啟動哪種目標平臺,在這一版本中,友善之臂申請了字節的機器碼1999,在文件opt/mini2440/linux-2.6.32.2/arch/arm/tools/mach-types中。
exeda MACH_EXEDA EXEDA 1994
mx31sf005 MACH_MX31SF005 MX31SF005 1995
f5d8231_4_v2 MACH_F5D8231_4_V2 F5D8231_4_V2 1996
q2440 MACH_Q2440 Q2440 1997
qq2440 MACH_QQ2440 QQ2440 1998
mini2440 MACH_MINI2440 MINI2440 1999//機器碼
colibri300 MACH_COLIBRI300 COLIBRI300 2000
jades MACH_JADES JADES 2001
spark MACH_SPARK SPARK 2002
如果傳入的機器碼和目標板的機器碼不同時,經常出現下面的錯誤:
Uncompressing Linux.................................................................................................................................. done, booting
the kernel.
運行到這就停止了。
在U-Boot2010.03版本中也加入了mini2440機器碼,在下面的文件中u-boot-2010.03/include/asm-arm/mach-typs.h,大約在1985行。
#define MACH_TYPE_ARMATA 1993
#define MACH_TYPE_EXEDA 1994
#define MACH_TYPE_MX31SF005 1995
#define MACH_TYPE_F5D8231_4_V2 1996
#define MACH_TYPE_Q2440 1997
#define MACH_TYPE_QQ2440 1998
#define MACH_TYPE_MINI2440 1999
#define MACH_TYPE_COLIBRI300 2000
#define MACH_TYPE_JADES 2001
#define MACH_TYPE_SPARK 2002
在/opt/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440目錄下有一個mach-mini2440.c這個就是該版本自帶的一個mini2440的文件。不過我們不使用它,直接將其刪除。
將/opt/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440目錄下的mach-smdk2440.c復制一份,命名為mach-mini2440.c文件,因為,Mini2440和smdk2440的結構最為相似,上面的外圍的電路也很相似,所以在其基礎上進行修改移植。打開剛剛改名的mach-mini2440.c,找到MACHINE_START(S3C2440, "SMDK2440")
修改為下面的內容
MACHINE_START(MINI2440, "FriendlyARM MINI2440 development board")
(4)修改時鐘源
在mach-mini2440.c的第160行static void __init smdk2440_map_io(void)函數中,把其中的16934400(代表原SMDK2440目標板上的晶振是 16.9344MHz)改為mini2440開發板上實際使用的12000000(代表 mini2440 開發板上的晶振12MHz,元器件標號為X2)
static void __init mini2440_map_io(void)
{
s3c24xx_init_io(mini2440_iodesc, ARRAY_SIZE(mini2440_iodesc));
s3c24xx_init_clocks(12000000); //修改為 12000000
s3c24xx_init_uarts(mini2440_uartcfgs, ARRAY_SIZE(mini2440_uartcfgs));
}
用gedit打開剛才復制得到的mach-mini2440.c文件,原來是smdk2440,所以將該文件中的所有的smdk2440替換成mini2440。
除此之外,還要在mini2440_machine_init(void)函數中,把smdk_machine_init()函數調用注釋掉,因為我們后面會編寫自己的初始化函數,不需要調用smdk2440原來的。
static void __init mini2440_machine_init(void)
{
s3c24xx_fb_set_platdata(&mini2440_fb_info);
s3c_i2c0_set_platdata(NULL);
s3c_device_nand.dev.platform_data = &mini2440_nand_info; //添加沒在官網提供的linux移植手冊上看到有加這一句,剛開始沒加編譯正確,但是最后無法讀出內核分區。
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
//smdk_machine_init();
}
編譯測試,
#make mini2440_defconfig //使用mini2440官方自帶的配置文件
#make zImage //編譯內核,時間較長,最后會生成 zImage
重新編譯并把生成的內核文件 zImage(位于 arch/arm/boot 目錄)下到板子中,可以看
到內核已經可以正常啟動了,如下圖,但此時大部分硬件驅動還沒加,并且也沒有文件系統,
因此還無法登陸。
總結
以上是生活随笔為你收集整理的linux-2.6.32.2内核在mini2440上的移植,Linux2.6.32.2移植到Mini2440的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 明晚发布 两款苹果Mac mni新品被经
- 下一篇: linux+qt+定时精度,Qt QTi