linux-2.6.32.2内核在mini2440上的移植,Linux2.6.32.2移植到Mini2440
1.移植內(nèi)核的準(zhǔn)備工作
(1)使用的環(huán)境
操作系統(tǒng):Fedora 10
交叉編譯工具使用:arm-linux-gcc-4.3.2
(2)獲取內(nèi)核
有很多方式可以獲取 Linux 內(nèi)核源代碼,如果你的 Fedora10 平臺(tái)可以上互聯(lián)網(wǎng),可以直
接在命令行輸入以下命令獲取到最原汁原味的 Linux-2.6.32.2:
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz
當(dāng)然你也可以先在 Windows 系統(tǒng)下使用迅雷等工具下載完,再?gòu)?fù)制到 Fedora10 中。
(3)交叉編譯工具
交叉編譯工具使用友善之臂的arm-linux-gcc-4.3.2,他們提供的編譯器是符合EABI標(biāo)準(zhǔn)的編譯器。其中關(guān)于EABI的介紹可以參看下面:
1。什么是ABI
ABI,application binary interface (ABI),應(yīng)用程序二進(jìn)制接口。
既然是 接口,那就是某兩種東西之間的溝通橋梁,此處有這些種情況:
A。應(yīng)用程序 操作系統(tǒng);
B。應(yīng)用程序 (應(yīng)用程序所用到的)庫(kù)
C 。應(yīng)用程序各個(gè)組件之間
類似于API的作用是使得程序的代碼間的兼容,ABI目的是使得程序的二進(jìn)制(級(jí)別)的兼容。
2。什么是OABI 和 EABI
OABI中的O,表示“Old”,“Lagacy”,舊的,過(guò)時(shí)的,OABI就是舊的/老的ABI。
EABI中的E,表示“Embedded”,是一種新的ABI。
EABI有時(shí)候也叫做GNU EABI。
OABI和EABI都是專門(mén)針對(duì)ARM的CPU來(lái)說(shuō)的。
3。EABI的好處 / 為何要用EABI
A。支持軟件浮點(diǎn)和硬件實(shí)現(xiàn)浮點(diǎn)功能混用
B。系統(tǒng)調(diào)用的效率更高
C。后今后的工具更兼容
D。軟件浮點(diǎn)的情況下,EABI的軟件浮點(diǎn)的效率要比OABI高很多。
4。OABI和EABI的區(qū)別
兩種ABI在如下方面有區(qū)別:
A。調(diào)用規(guī)則(包括參數(shù)如何傳遞及如何獲得返回值)
B。系統(tǒng)調(diào)用的數(shù)目以及應(yīng)用程序應(yīng)該如何去做系統(tǒng)調(diào)用
C。目標(biāo)文件的二進(jìn)制格式,程序庫(kù)等
D。結(jié)構(gòu)體中的 填充(padding/packing)和對(duì)齊。
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)硬件平臺(tái)
友善之臂的Mini2440,NandFlash64M,NorFlash2M的。NandFlash容量的不同,在后邊制作根文件系統(tǒng)的時(shí)候會(huì)有所不同。
2.修改內(nèi)核以適應(yīng)本開(kāi)發(fā)板
(1)假設(shè)我們把內(nèi)核文件下載到了opt/mini2440/目錄下,進(jìn)行解壓操作。
#cd opt/mini2440
#tar -zxvf linux-2.6.32.2.tar.gz
得到Linux-2.6.33.3文件夾
(2)修改Makefile文件
首先,我們要使Linux的默認(rèn)的平臺(tái)是arm平臺(tái),進(jìn)入Linux-2.6.32.2文件夾中,修改此目錄下的Makefile文件。修改成下面的代碼,使其平臺(tái)是ARM平臺(tái),交叉編譯是arm-linux-
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm //使用的目標(biāo)平臺(tái)
CROSS_COMPILE ?= arm-linux- //使用的交叉編譯器,這里使用的系統(tǒng)默認(rèn)的
接下來(lái),測(cè)試一下Linux內(nèi)核是否可以順利的編譯通過(guò)。
#make s3c2410_defconfig //使用缺省的配置文件,也就是SMDK2440的缺省配置文件
# make //編譯時(shí)間大約在20分鐘左右
(3)關(guān)于機(jī)器碼
很關(guān)鍵的一點(diǎn)是,在啟動(dòng)內(nèi)核時(shí),是根據(jù)bootloader傳入的機(jī)器碼(MACH_TYPE),來(lái)決定應(yīng)啟動(dòng)哪種目標(biāo)平臺(tái),在這一版本中,友善之臂申請(qǐng)了字節(jié)的機(jī)器碼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//機(jī)器碼
colibri300 MACH_COLIBRI300 COLIBRI300 2000
jades MACH_JADES JADES 2001
spark MACH_SPARK SPARK 2002
如果傳入的機(jī)器碼和目標(biāo)板的機(jī)器碼不同時(shí),經(jīng)常出現(xiàn)下面的錯(cuò)誤:
Uncompressing Linux.................................................................................................................................. done, booting
the kernel.
運(yùn)行到這就停止了。
在U-Boot2010.03版本中也加入了mini2440機(jī)器碼,在下面的文件中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目錄下有一個(gè)mach-mini2440.c這個(gè)就是該版本自帶的一個(gè)mini2440的文件。不過(guò)我們不使用它,直接將其刪除。
將/opt/mini2440/linux-2.6.32.2/arch/arm/mach-s3c2440目錄下的mach-smdk2440.c復(fù)制一份,命名為mach-mini2440.c文件,因?yàn)?#xff0c;Mini2440和smdk2440的結(jié)構(gòu)最為相似,上面的外圍的電路也很相似,所以在其基礎(chǔ)上進(jìn)行修改移植。打開(kāi)剛剛改名的mach-mini2440.c,找到MACHINE_START(S3C2440, "SMDK2440")
修改為下面的內(nèi)容
MACHINE_START(MINI2440, "FriendlyARM MINI2440 development board")
(4)修改時(shí)鐘源
在mach-mini2440.c的第160行static void __init smdk2440_map_io(void)函數(shù)中,把其中的16934400(代表原SMDK2440目標(biāo)板上的晶振是 16.9344MHz)改為mini2440開(kāi)發(fā)板上實(shí)際使用的12000000(代表 mini2440 開(kāi)發(fā)板上的晶振12MHz,元器件標(biāo)號(hào)為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打開(kāi)剛才復(fù)制得到的mach-mini2440.c文件,原來(lái)是smdk2440,所以將該文件中的所有的smdk2440替換成mini2440。
除此之外,還要在mini2440_machine_init(void)函數(shù)中,把smdk_machine_init()函數(shù)調(diào)用注釋掉,因?yàn)槲覀兒竺鏁?huì)編寫(xiě)自己的初始化函數(shù),不需要調(diào)用smdk2440原來(lái)的。
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; //添加沒(méi)在官網(wǎng)提供的linux移植手冊(cè)上看到有加這一句,剛開(kāi)始沒(méi)加編譯正確,但是最后無(wú)法讀出內(nèi)核分區(qū)。
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
//smdk_machine_init();
}
編譯測(cè)試,
#make mini2440_defconfig //使用mini2440官方自帶的配置文件
#make zImage //編譯內(nèi)核,時(shí)間較長(zhǎng),最后會(huì)生成 zImage
重新編譯并把生成的內(nèi)核文件 zImage(位于 arch/arm/boot 目錄)下到板子中,可以看
到內(nèi)核已經(jīng)可以正常啟動(dòng)了,如下圖,但此時(shí)大部分硬件驅(qū)動(dòng)還沒(méi)加,并且也沒(méi)有文件系統(tǒng),
因此還無(wú)法登陸。
總結(jié)
以上是生活随笔為你收集整理的linux-2.6.32.2内核在mini2440上的移植,Linux2.6.32.2移植到Mini2440的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 明晚发布 两款苹果Mac mni新品被经
- 下一篇: WinCE 字体平滑 ClearType