平台:jz2440
作者:莊澤彬(歡迎轉載,請注明作者)
說明:韋東山二期視訊學習筆記
交叉編譯工具:arm-linux-gcc (GCC)4.3.2
linux:linu3.4.2
PC環境:ubuntu18.04
一、kernel的編譯和燒錄:
下載下傳linux-3.4.2版本進行移植,下載下傳連結:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/
修改頂層Makefile,設定為arm架構,以及設定交叉工具鍊
1 zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$ git diff .
2 diff --git a/Makefile b/Makefile
3 index 901a9557..9cc1639a 100644
4 --- a/Makefile
5 +++ b/Makefile
6 @@ -192,8 +192,8 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
7 # Default value for CROSS_COMPILE is not to prefix executables
8 # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
9 export KBUILD_BUILDHOST := $(SUBARCH)
10 -ARCH ?= $(SUBARCH)
11 -CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
12 +ARCH ?= arm
13 +CROSS_COMPILE ?= arm-linux-
14
15 # Architecture as present in compile.h
16 UTS_MACHINE := $(ARCH)
編譯:
1 make s3c2410_defconfig
2
哎呀,竟然報了下面這個錯誤:
應該是高版本的make導緻這個錯誤出現的,按照錯誤的log修改檔案。
修改如下:
1 diff --git a/kernel/timeconst.pl b/kernel/timeconst.pl
2 index eb51d76e..04612394 100644
3 --- a/kernel/timeconst.pl
4 +++ b/kernel/timeconst.pl
5 @@ -370,7 +370,7 @@ if ($hz eq '--can') {
6 }
7
8 @val = @{$canned_values{$hz}};
9 - if (!defined(@val)) {
10 + if (!@val) {
11 @val = compute_values($hz);
12 }
13
生成對應的uImage :
上述編譯出來的核心燒錄到闆子加載核心卻出現亂碼,出現亂碼,有可能是我們的機器ID沒有設定好,導緻調用的初始化錯誤導緻的。:
二 、核心的啟動
uboot啟動核心主要的操作如下,從nandflash裡把核心讀入記憶體,設定TAG參數(記憶體的起始位址大小,指令行參數等等),R1存放機器ID,R2存放參數的存放位址,核心在啟動的時候會解析TAG參數,根據uboot傳遞過來的機器ID,判斷是否能夠支援該機器,進而調用對應闆子的初始化函數.
uboot設定機器ID的代碼主要流程如下:
Smdk2410.c (board\samsung\smdk2440)
board_init
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; //設定機器ID的預設值
Bootm.c (arch\arm\lib)
boot_jump_linux
unsigned long machid = gd->bd->bi_arch_number;
s = getenv("machid"); //可根據環境變量設定機器ID
我在cmdline随便設定一個machid,看看核心支援那些闆子
set machid 33333
啟動過程列印的log,根據log可以看出有比對對應的開發闆子的一個過程,最後由于比對失敗,卡在這裡。
OK
Using machid 0x33333 from environment
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x00033333).
Available machine support:
ID (hex) NAME
00000400 AML_M5900
0000014b Simtec-BAST
0000015b IPAQ-H1940
0000039f Acer-N35
00000290 Acer-N30
000002a8 Nex Vision - Otom 1.1
00000454 QT2410
000000c1 SMDK2410
000005b4 TCT_HAMMER
000001db Thorcom-VR1000
000005d2 JIVE
000003fe SMDK2413
000003f1 SMDK2412
00000377 S3C2413
00000474 VSTMS
00000695 SMDK2416
000002de Simtec-Anubis
00000707 AT2440EVB
000007cf MINI2440
000002a9 NexVision - Nexcoder 2440
0000034a Simtec-OSIRIS
00000250 IPAQ-RX3715
0000016a SMDK2440
00000518 GTA02
000003b8 HP iPAQ RX1950
0000043c SMDK2443
2.1 支援mini2440開發闆的machid 7cf
設定cmdline波特率為115200
1 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
nfs 32000000 192.168.1.100:/work/nfs_root/uImage //燒錄核心指令
設定machid為mini2440的開發闆7cf,啟動,序列槽不會有亂碼.
2.2支援smdk2440開發闆的machid 16a
設定machid為smdk2440開發闆16a,序列槽卻出現亂碼:
我們來看看核心smd2440開發闆初始化代碼,是不是跟jz2440有差異:
Mach-smdk2440.c (arch\arm\mach-s3c24xx)
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <[email protected]> */
.atag_offset = 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io, //這個函數的初始化化有點問題,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
.restart = s3c244x_restart,
MACHINE_END
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400); //jz2440開發闆是12M的晶振,使用使用smdk2440的machid,這裡要修改為12000000
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
代碼修改如下,支援smdk2440開發闆,序列槽輸出不會有亂碼:
zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$ git diff .
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2440.c b/arch/arm/mach-s3c24xx/mach-smdk2440.c
index 83a1036d..b92c2bd5 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2440.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2440.c
@@ -162,7 +162,7 @@ static struct platform_device *smdk2440_devices[] __initdata = {
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
- s3c24xx_init_clocks(16934400);
+ s3c24xx_init_clocks(12000000); //jz2440開發闆是12M的晶振,使用使用smdk2440的machid,這裡要修改為12000000
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
設定為smdk2440開發闆的machid 16a,啟動系統序列槽沒有輸出亂碼見下圖:
三、修改核心分區
核心将nandflash分區劃分如下:
1 0x00000000-0x00040000 : "bootloader"
2 0x00040000-0x00060000 : "params"
3 0x00060000-0x00260000 : "kernel"
4 0x00260000-0x10000000 : "root"
代碼修改如下:
smdk.c
2 index 084604be..f7dce9b9 100644
3 --- a/arch/arm/mach-s3c24xx/common-smdk.c
4 +++ b/arch/arm/mach-s3c24xx/common-smdk.c
5 @@ -110,43 +110,23 @@ static struct platform_device smdk_led7 =,
10 - .size =,
12 + .size =,
14 ,
17 - .offset = 0,
18 - .size =,
20 + .offset =,
25 - .offset =,
30 - .offset =,
32 + .offset =,
37 - .offset = SZ_1M * 10,
38 - .size =,
42 - .offset = SZ_1M * 14,
43 - .size = SZ_1M * 10,
44 -,
47 - .offset = SZ_1M * 24,
48 - .size = SZ_1M * 24,
49 -,
52 - .offset = SZ_1M * 48,
53 + [3] =,
55 + .offset = };
59 zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$
核心啟動将會把nandflash劃分為上述四個分區
四、制作新的檔案系統
3.1編譯busybox1.20.0
解壓busybox
tar -xvf busybox-1.20.0.tar.bz2
設定交叉工具鍊make menuconfig
編譯
1
安裝
1
從交叉工具鍊安裝glibc
1 cd /work/nfs_root/fs_mini_mdev_new
2 mkdir lib usr/lib
3 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d
4 cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib/ -d
建立etc目錄
1
在etc目錄下建立inittab檔案
1 vim inittab //内容從2-6行
2 # /etc/inittab
3 ::sysinit:/etc/init.d/rcS
4 console::askfirst:-/bin/sh
5 ::ctrlaltdel:/sbin/reboot
6
在etc目錄下穿件init.d/rcS檔案
1 mkdir init.d
2 vim init.d/rcS
chmod a+x init.d/rcS //設定為可執行檔案
3 rcS檔案内容如下:
4 #!/bin/sh
5
6 mount -a
7 mkdir /dev/pts
8 mount -t devpts devpts /dev/pts
9 echo /sbin/mdev > /proc/sys/kernel/hotplug
10 mdev -s
在etc目錄下建立fstab檔案:内容如下:
1 # device mount-point type options dump fsck order
2 proc /proc proc defaults 0 0
3 tmpfs /tmp tmpfs defaults 0 0
4 sysfs /sys sysfs defaults 0 0
5 tmpfs /dev tmpfs defaults 0 0
建立dev目錄:
1 mkdir dev
2 sudo mknod console c 5 1
3 sudo mknod null c 1 3
建立其他目錄
1
編譯制作jffs2映像檔案的工具
1 tar -xvf mtd-utils-05.07.23.tar.bz2
2 cd mtd-utils-05.07.23/util
3 make
4 sudo make install
//根據需要有可能要先編譯zlib庫
将fs_mini_mdev_new目錄制作成檔案系統鏡像指令:
1 mkfs.jffs2 -n -s 2048
在uboot中将檔案系統和核心燒錄進系統指令
1 nfs 30000000 192.168.1.100:/work/nfs_root/fs_mini_mdev_new.jffs2
2 nand erase.part rootfs
3 nand write.jffs2 30000000 260000 $filesize
4 set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
5 //燒錄核心
6 nfs 32000000 192.168.1.100:/work/nfs_root/uImage
7 bootm 32000000
啟動系統,卻報了如下的錯誤,這是由于我們的交叉工具連結在編譯的時候是使用eabi接口的,核心也要使用這種接口才行
進入核心make menuconfig,加上EABI接口
重新燒錄系統,成功進入系統沒有問題。
五、移植yaffs檔案系統
下載下傳yaffs檔案系統的連結:https://yaffs.net/get-yaffs
或者使用git下載下傳指令:
1 git clone git://www.aleph1.co.uk/yaffs2
将yaffs檔案系統源碼安裝到核心:
./patch-ker.sh c m /home/zhuang/project/3-jz2440/systems/linux-3.4.2
make menuconfig選中yaffs檔案系統
編譯卻報了如下的錯誤:
檢視核心struct mtd_info的定義,并沒有sync成員而是_sync,把報錯的地方都加上_即可。
将檔案系統制作成yaffs2檔案系統鏡像
1
燒錄啟動:
1 nfs 30000000 192.168.1.100:/work/nfs_root/fs_mini_mdev_new.yaffs2
2 nand erase.part rootfs
3 nand write.yaffs 30000000 260000