| 最近這幾天的晚上我在移植2.6的kernel。因為水平很菜,所以不太順利。 我用的是kernel是2.6.14.2, 這個(gè)內核直接支持S3C2410的板子,不必打任何補丁。從www.kernel.org下載了內核。然后找來(lái)了3.4.1的GCC交叉編譯器(經(jīng)典的2.95.3編譯2.6內核會(huì )出錯)。解開(kāi)內核開(kāi)始修改。 (該部分轉貼自:http://superlp.blogchina.com/blog/1391393.html 感謝superlp) 1. 增加nand分區信息 打開(kāi)arch/arm/mach-s3c2410/devs.c 增加頭文件 #include <linux/mtd/partitions.h> #include <asm/arch/nand.h> #include <linux/mtd/nand.h> 增加分區數據 /*****************************add here***************************/ static struct mtd_partition partition_info[] ={ { name: "loader", size: 0x00020000, offset: 0, }, { name: "param", size: 0x00010000, offset: 0x00020000, }, { name: "kernel", size: 0x001c0000, offset: 0x00030000, }, { name: "root", size: 0x00200000, offset: 0x00200000, mask_flags: MTD_WRITEABLE, }, { name: "user", size: 0x03af8000, offset: 0x00400000, } }; struct s3c2410_nand_set nandset ={ nr_partitions: 5 , partitions: partition_info , }; struct s3c2410_platform_nand superlpplatform={ tacls:0, twrph0:30, twrph1:0, sets: &nandset, nr_sets: 1, }; /********************************end add****************************/ struct platform_device s3c_device_nand = { .name = "s3c2410-nand", .id = 0xec, .num_resources = ARRAY_SIZE(s3c_nand_resource), .resource = s3c_nand_resource, .dev = { .platform_data = &superlpplatform //***********add here***** } }; (分區部分根據實(shí)際情況修改) 2. 打開(kāi)arch/arm/mach-s3c2410/mach-smdk2410.c 把"&s3c_device_nand"添加到__initdata 3. 打開(kāi)drivers/mtd/nand/s3c2410.c 把chip->eccmode = NAND_ECC_SOFT;改成chip->eccmode = NAND_ECC_NONE; 4. 修改Makefile, 把設定SUBARCH := arm CROSS_COMPILE ?= arm-linux-(事先得安裝交叉 編譯器) 接著(zhù)開(kāi)始make menuconfig,并且載入arch/arm/configs/def_s3c2410config,保存后就make,如果編譯器沒(méi)有問(wèn)題得話(huà),應該一次就能編譯成功。 接下來(lái)編譯bootload, 我用vivi, 從www.mizi.com下 載vivi的源代碼包,解開(kāi)后make menuconfig, 載入arch/def-configs/smdk2410, 保存退出后修改arch/s3c2410/smdk.c,修改里面的分區信息和啟動(dòng)參數。分區信息根據實(shí)際情況設置,啟動(dòng)參數設置成“noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mac=00:0e:3a:aa:bb:cc”. 保存退出后make, 得到vivi的BIN. 把vivi和kernel的BIN文件燒錄到FLASH后給板子上電,發(fā)現一個(gè)問(wèn)題,vivi并沒(méi)有使用我設置好的分區信息和啟動(dòng)參數,而是使用一個(gè)默認 的值,要使用命令param reset和part reset才可以重置我設置的值。vivi默認的kernel分區大小是1M,而我的kernel的BIN文件有1.2M,開(kāi)始嘗試了好多次都失敗。重置 了參數以后kernel可以執行起來(lái), 但是找不到根文件系統,那是當然的,因為我還沒(méi)有燒錄文件系統。 一. 準備必要的文件 我們首先去官方網(wǎng)站下載最新的 llinux 內核 http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.bz2 因為 linux ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2 注:這個(gè)編譯器已經(jīng)包含在光盤(pán)的 \DISK4\linux 相關(guān) \linuxtool 目錄下面。 二. 安裝文件 我們把 gcc 安裝在 /usr/local/arm/ cd / tar jxvf arm-linux-gcc-3.4.1.tar.bz2 vi ~/.bash_profile 把arm-linux-gcc的路徑/usr/local/arm/3.4.1/bin添加到PATH中) 接下來(lái)需要解壓 linux 內核,輸入命令: [root · localhost hfrk]# tar jxvf linux- 內核被解壓到 linux- 三. 修改 makefile 文件 內核的編譯是根據 makefile 文件的指示進(jìn)行的, Makefile 文件來(lái)組織內核的各模塊之間的關(guān)系,記錄了各個(gè)模塊之間的相互聯(lián)系和依賴(lài)關(guān)系。 我們首先修改 linux- 我們注釋掉以下內容: #ARCH ?= $(SUBARCH) #CROSS_COMPILE ?= 增加如下內容: ARCH : = arm CROSS_COMPILE =/usr/local/arm/ 四. 修改相關(guān)的文件。 1. 修改 arch\arm\mach-s 增加頭文件定義 /***********add here***********/
#include <linux/mtd/partitions.h> #include <asm/arch/nand.h> #include <linux/mtd/nand.h> /**************end add********/
增加 nand flash 分區信息 /***********add here***********/ static struct mtd_partition partition_info[] ={ { name: "loader", size: 0x00020000, offset: 0, }, { name: "param", size: 0x00010000, offset: 0x00020000, }, { name: "kernel", size: 0x offset: 0x00030000, }, { name: "root", size: 0x00200000, offset: 0x00200000, mask_flags: MTD_WRITEABLE, }, { name: "user", size: 0x03af8000, offset: 0x00400000, } };
struct s nr_partitions: 5 , partitions: partition_info , };
struct s tacls:0, twrph0:30, twrph1:0, sets: &nandset, nr_sets: 1, }; /**************end add********/
struct platform_device s .name = "s .id = -1, .num_resources = ARRAY_SIZE(s .resource = s
/***********add here****************/ .dev = { .platform_data = &superlpplatform } /**************end here************/ }; 2. 修改 arch\arm\mach-s Startic struct platform_device *smdk2410_devices[] __initdata={ &s &s &s &s &s &s }; 五. 我們做完以上修改以后,內核編譯以后就可以在 hfrk2410 開(kāi)發(fā)板上運行了。 打開(kāi)終端窗口,切換到 linux- # make smdk2410_defconfig #make menuconfig /*選擇nand flash模塊*/ # make 等編譯完成以后,會(huì )生成鏡像文件 arch/arm/boot/zImage ,把這個(gè)文件下載到開(kāi)發(fā)板上,就會(huì )看到 linux2.6 的內核啟動(dòng)信息,我們邁出了 linux2.6 內核移植的第一步!
如果出現field `list‘ has incomplete type 那是因為partitions.h中沒(méi)有定義head_list,在partitions.h的頭加上#include <linux/list.h> 就ok了,哈哈 Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1529788 在華恒2410平臺上移植2.6內核allbone 發(fā)表于 2006-4-7 16:57:00 第一次做linux的移植,走了很多彎路,也學(xué)到很多知識,僅把過(guò)程記錄下來(lái),以備日后之用。 手里這塊板是華恒的一個(gè)學(xué)習平臺,配置比較低: s3c2410, 8M Nor Flash(Intel 28F640), 16M SDRAM 配套安裝的是2.4的內核,根文件系統安裝在ramdisk上。我的想 法很簡(jiǎn)單,就是將2.6的內核跑起來(lái),掛上原來(lái)的文件系統。就是說(shuō) 只要系統啟動(dòng)到shell提示符,我的目的就達到了,至于周邊設備的 驅動(dòng)移植則不在此行計劃內。很自然的,整個(gè)過(guò)程大致分為兩個(gè)階段。 一、內核移植 由于2.6內核已經(jīng)正式支持2410這款cpu以及smdk2410這塊公板, 只要配置得當,在不修改一行內核代碼的情況下,內核就可以運行起來(lái)。 所以我覺(jué)得這里再提移植就不恰當了,而僅僅是個(gè)配置、交叉編譯內 核的過(guò)程。 make ARCH=arm CROSS_COMPILE=arm-linux- smdk2410_defconfig make ARCH=arm CROSS_COMPILE=arm-linux- zImage 為了接下來(lái)方便,可以直接在top level的Makefile中設置ARCH 和CROSS_COMPILE變量。在2.6內核中,console的名稱(chēng)發(fā)生了變化, 需要在bootloader或者內核的配置中修改啟動(dòng)參數,例如 2.4中啟動(dòng)參數為 …… console=ttyS0,115200, 在2.6中則應改為 …… console=ttySAC0,115200 現在用新內核啟動(dòng),可以在串口接收到啟動(dòng)信息,但由于還沒(méi)有 安裝根文件系統,所以中途會(huì )panic,這是我們在下一階段需要解決 的問(wèn)題,而第一階段工作結束。 非常簡(jiǎn)單的過(guò)程,我卻沒(méi)那么幸運。開(kāi)始用的是最新的2.6.16的 kernel,經(jīng)過(guò)上述配置,啟動(dòng)后收不到任何消息。折騰無(wú)數次后,抱 著(zhù)有病亂投醫的想法,嘗試了一下2.6.14,竟然順利啟動(dòng)。翻了一遍 2.6.16的changelog,也沒(méi)發(fā)現個(gè)所以然,等待高手解惑…… 二、安裝根文件系統 首先對flash進(jìn)行分區。網(wǎng)上的經(jīng)典文章《Linux 2.6.10 以后版 本對S3C2410的支持》僅提到了對Nand flash分區的方法,對Nor flash不適用。對Nor flash的分區,是通過(guò)在 linux/drivers/mtd/maps下增加特定mapping驅動(dòng)程序來(lái)實(shí)現。該目 錄下的驅動(dòng)程序結構相似,可以找一個(gè)來(lái)修改成自己的。我用的是 cfi_flagadm.c這個(gè)。 cp cfi_flagadm.c s3c2410.c 將FLASH_PHYS_ADDR和FLASH_SIZE這兩個(gè)宏分別修改成自己板子 的flash起始地址和大小。然后修改結構體數組flagadm_parts添加自 己的分區信息。 接下來(lái)告訴內核使用該驅動(dòng)程序。修改maps目錄下的Kconfig文 件,該文件決定出現在menuconfig中的項目,在config MTD_CDB89712之后添加 config MTD_S3C2410 tristate "HuaHeng 2410 board" 修改該目錄下的Makefile,添加如下內容: obj-$(CONFIG_MTD_S3C2410) += s3c2410.o 現在make menuconfig時(shí),在MTD項目中將出現HuaHneng 2410 board選項,選中它并重新編譯內核就完成了分區工作,啟動(dòng)時(shí)將看 到分區信息。 現在,內核可以檢測到分區,并找到了壓縮的RAMDISK,并試圖 解壓縮。如果你使用smdk2410的默認配置,這時(shí)會(huì )報錯,類(lèi)似 RAMDISK:incomplete 云云。解決辦法很簡(jiǎn)單,將內核配置中的 BLK_DEV_RAM_SIZE的值從默認的4096改為8192即可。 原2.4內核中對設備文件的管理是通過(guò)devfs完成的,所有設備文 件均在啟動(dòng)后檢測到設備時(shí)動(dòng)態(tài)建立,所以我的RAMDISK中/dev目錄 是空的。而2.6內核從某個(gè)版本號后移除了devfs,取而代之的是udev。 我一沒(méi)有啟用udev,二沒(méi)有手動(dòng)建立任何設備文件,所以?xún)群司鏌o(wú) 法初始化控制臺。手工添加設備文件即可: mknod /dev/console c 5 1 為了避免再出現類(lèi)似錯誤,我用原2.4內核啟動(dòng),把devfs建立好 的設備文件全部拷了出來(lái),添加到RAMDISK當中。 到此為止內核已經(jīng)啟動(dòng)到VFS:freeing xxxK memory。但出現一 行reboot(magic=000000)的信息,就沒(méi)有下文了。搜了一下,發(fā)現在 配置內核時(shí)必須選中Floating Point Emulator,否則就會(huì )導致這個(gè) 錯誤。再次重新編譯內核,重啟,終于出現了期待已久的#提示符。 寫(xiě)的比較亂,大家去粗取精的看吧 :) 主要參考資料為L(cháng)inux Forum嵌入式版對2.6內核移植的專(zhuān)題討論帖。 移植2.6.17.13到s3c2410 前一陣子移植了u-boot1.1.4之后,移植2.6.17.13走了一些彎路,采用了別人移植的2.6.14或2.6.11等方法都不成功,后來(lái)發(fā)現2.6.17比前幾個(gè)版本的內核更容易。 從www.kernel.org下載2.6.17.13.tar.bz2,解壓: #tar jxvf 2.6.17.13.tar.bz2 1、重新編譯和修改u-boot 以前移植u-boot用的是arm-linux-gcc 2.95.3,到移植2.6內核的時(shí)候發(fā)現必須用gcc3.0以上的編譯器,沒(méi)辦法只好下載了個(gè)arm-linux-gcc3.4.4 +glibc2.3.5,怕由于編譯器不一致引起問(wèn)題,重新編譯了一次u-boot,沒(méi)遇到任何錯誤。 2、修改內核頂層目錄的Makefile,找到ARCH和CROSS_COMPILE的地方,修改為 ARCH ?= arm CROSS_COMPILE ?= arm-linux- 保存。 3、 修改arch/arm/mach-s3c2410/common-smdk.c 設置Nand Flash的分區和信息,下面是我的分區結構: static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "bootloader", .size = SZ_1M, .offset = 0, }, [1] = { .name = "kernel", .offset = SZ_1M, .size = SZ_2M, },如果您是在公共場(chǎng)合使用計算機,離開(kāi)時(shí) [2] = { .name = "root", .offset = SZ_1M*3, .size = SZ_8M*5, }, [3] = { .name = "user", .offset = SZ_1M*43, .size = SZ_1M*21, }, }; static struct s3c2410_platform_nand smdk_nand_info = { .tacls = 0, .twrph0 = 30, .twrph1 = 0, .nr_sets = ARRAY_SIZE(smdk_nand_sets), .sets = smdk_nand_sets, }; 說(shuō)明:這里2.6.17的設置分區與其他版本如2.6.14或2.6.11有點(diǎn)區別,其他版本是修改 arch/arm/machs3c2410/devs.c 和 arch/arm/machs3c2410/machsmdk2410. 2.6.17.13設置這些文件無(wú)效。 4、禁止Flash ECC校驗 內核都是通過(guò)u-boot寫(xiě)數據到Nand Flash的, u-boot通過(guò)的軟件ECC算法產(chǎn)生ECC校驗碼, 這與內核校驗的ECC碼不一樣, 內核中的ECC碼是由S3C2410中Nand Flash控制器產(chǎn)生的. 所以, 我們在這里選擇禁止內核ECC校驗。 修改drivers/mtd/nand/s3c2410.c 文件,找到s3c2410_nand_init_chip()函數,在該函數體最后加上一條語(yǔ)句: chip->eccmode = NAND_ECC_NONE; 保存,退出。 5、支持啟動(dòng)時(shí)掛載devfs 為了我們的內核支持devfs以及在啟動(dòng)時(shí)并在/sbin/init運行之前能自動(dòng)掛載/dev為devfs文件系統,修改fs/Kconfig文件,找到 menu "Pseudo filesystems" 添加如下語(yǔ)句: config DEVFS_FS bool "/dev file system support (OBSOLETE)" default y config DEVFS_MOUNT bool "Automatically mount at boot" default y depends on DEVFS_FS 6、使用SMDK板子的config配置內核 #cp arch/arm/configs/smdk2410_defconfig .config #make menuconfig 在smdk2410_defconfig的基礎上,增加了下面選項: Loadable module support > [*] Enable loadable module support [*] Automatic kernel module loading System Type --> [*] S3C2410 DMA support Boot options --> Default kernel command string: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 mem=32M #說(shuō)明:mtdblock2代表第3個(gè)flash分區,用來(lái)作根文件系統rootfs; # console=ttySAC0,115200使kernel啟動(dòng)期間的信息全部輸出到串口0上,波特率為115200; # 2.6內核對于串口的命名改為ttySAC0,但這不影響用戶(hù)空間的串口編程。 # 用戶(hù)空間的串口編程針對的仍是/dev/ttyS0等 # mem=32M表示內存是32M,如果是64則設為64M Floating point emulation --> [*] NWFPE math emulation #This is necessary to run most binaries!!! #接下來(lái)要做的是對內核MTD子系統的設置 Device Drivers --> Memory Technology Devices (MTD) --> [*] MTD partitioning support #支持MTD分區,這樣我們在前面設置的分區才有意義 [*] Command line partition table parsing #支持從命令行設置flash分區信息,靈活 RAM/ROM/Flash chip drivers --> <*> Detect flash chips by Common Flash Interface (CFI) probe <*> Detect nonCFI AMD/JEDECcompatible flash chips <*> Support for Intel/Sharp flash chips <*> Support for AMD/Fujitsu flash chips <*> Support for ROM chips in bus mapping NAND Flash Device Drivers --> <*> NAND Device Support <*> NAND Flash support for S3C2410/S3C2440 SoC Character devices --> [*] Nonstandard serial port support [*] S3C2410 RTC Driver USB Support --> <*> Support for Host-side USB MMC/SD Card Support --> <*> MMC Support <*> MMC block device driver #接下來(lái)做的是針對文件系統的設置,本人實(shí)驗時(shí)目標板上要上的文件系統是cramfs,故做如下配置 File systems --> <> Second extended fs support #去除對ext2的支持 Pseudo filesystems --> [*] /proc file system support [*] Virtual memory file system support (former shm fs) [*] /dev file system support (OBSOLETE) [*] Automatically mount at boot (NEW) #這里會(huì )看到我們前先修改fs/Kconfig的成果,devfs已經(jīng)被支持上了 Miscellaneous filesystems > <*> Compressed ROM file system support (cramfs) #支持cramfs Network File Systems > <*> NFS file system support 保存退出,產(chǎn)生.config文件。 7、編譯內核,下載到板子上 #make zImage 生成zImage在arch/arm/boot/目錄下 zImage下載到板子上之后可以直接用go來(lái)執行,但是go啟動(dòng)內核的話(huà)會(huì )出現下面錯誤: random2410 # tftp 30008000 2.6.17.13 TFTP from server 192.168.1.10; our IP address is 192.168.1.110 Filename ‘2.6.17.13‘. Load address: 0x30008000 Loading: ################################################################# ################################################################# ################################################################# ######################## done Bytes transferred = 1118644 (1111b4 hex) random2410 # go 30008000 ## Starting application at 0x30008000 ... Uncompressing Linux............................................................. Error: unrecognized/unsupported machine ID (r1 = 0x31f07d30). Available machine support: ID (hex) NAME 000000c1 SMDK2410 Please check your kernel config and/or bootloader. 產(chǎn)生的原因是go啟動(dòng)內核的話(huà),u-boot不會(huì )傳machiine ID給內核,因為go只是執行普通的應用程序,不考慮到傳遞參數給內核的問(wèn)題,沒(méi)有必要在乎它。如果只是想看看go能不能啟動(dòng)內核的話(huà),修改方法有兩個(gè): a、修改u-boot的common/cmd_boot.c的do_go()函數: /*#if defined(CONFIG_I386)*/ <==注釋掉 DECLARE_GLOBAL_DATA_PTR; /*#endif*/ <==注釋掉 .... #if !defined(CONFIG_NIOS) /*******************add here*******************************/ if(argc==2) rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number); else /*********************add end *****************************/ rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); b、修改內核的arch/arm/kernel/head.S,直接將s3c2410的參數賦給內核 __INIT .type stext, %function ENTRY(stext) /****************add here*****************/ mov r0, #0 mov r1, #0xc1 ldr r2, =0x30000100 /***************end add******************/ msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode @ and irqs disabled 8、用bootm啟動(dòng)內核 這個(gè)方法u-boot可以將machine ID傳給內核,正常啟動(dòng),不過(guò)用u-boot的mkimage工具(在u-boot1.1.4/tools/目錄下)將前面生成的zImage加上一個(gè)信息頭(有關(guān)如何添加頭的命令和使用tftp在后面講述),之后下載到板子上,啟動(dòng)控制臺信息如下: U-Boot 1.1.4 (Sep 20 2006 - 00:34:30) U-Boot code: 31F80000 -> 31F9628C BSS: -> 31F9A578 RAM Configuration: Bank #0: 30000000 32 MB Flash: 512 kB *** Warning - bad CRC, using default environment In: serial Out: serial Err: serial random2410 # tftp 30008000 uImage2.6.17.13 TFTP from server 192.168.1.10; our IP address is 192.168.1.110 Filename ‘uImage2.6.17.13‘. Load address: 0x30008000 Loading: ################################################################# ################################################################# ################################################################# ######################## done Bytes transferred = 1116720 (110a30 hex) random2410 # bootm 30008000 ## Booting image at 30008000 ... Image Name: linux-2.6.17.13 Created: 2006-09-19 17:25:57 UTC Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 1116656 Bytes = 1.1 MB Load Address: 30008000 Entry Point: 30008040 Verifying Checksum ... OK XIP Kernel Image ... OK Starting kernel ... cleanup before linux... enter the Kerne....address is 30008040 transfer params to linux kernel: machine ID: r1=c1, boot params addr: r2=30000100 enter decompress_kernel... finished to arch_decomp_setup Uncompressing Linux......................................................................... done, booting the kernel. Linux version 2.6.17.13 (xzs@xzs-pc) (gcc version 3.4.4) #7 Wed Sep 20 01:23:13 CST 2006 CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T) Machine: SMDK2410 Warning: bad configuration page, trying to continue Memory policy: ECC disabled, Data cache writeback CPU S3C2410A (id 0x32410002) S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz S3C2410 Clocks, (c) 2004 Simtec Electronics CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on CPU0: D VIVT write-back cache CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets Built 1 zonelists Kernel command line: noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200 mem=32M irq: clearing pending ext status 00000200 irq: clearing subpending status 00000002 PID hash table entries: 256 (order: 8, 1024 bytes) timer tcon=00500000, tcnt a509, tcfg 00000200,00000000, usec 00001e4c Console: colour dummy device 80x30 Dentry cache hash table entries: 4096 (order: 2, 16384 bytes) Inode-cache hash table entries: 2048 (order: 1, 8192 bytes) Memory: 32MB = 32MB total Memory: 30080KB available (1856K code, 404K data, 92K init) Mount-cache hash table entries: 512 CPU: Testing write buffer coherency: ok NET: Registered protocol family 16 S3C2410: Initialising architecture usbcore: registered new driver usbfs usbcore: registered new driver hub NET: Registered protocol family 2 IP route cache hash table entries: 256 (order: -2, 1024 bytes) TCP established hash table entries: 1024 (order: 0, 4096 bytes) TCP bind hash table entries: 512 (order: -1, 2048 bytes) TCP: Hash tables configured (established 1024 bind 512) TCP reno registered S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics DMA channel 0 at c2800000, irq 33 DMA channel 1 at c2800040, irq 34 DMA channel 2 at c2800080, irq 35 DMA channel 3 at c28000c0, irq 36 NetWinder Floating Point Emulator V0.97 (double precision) JFFS2 version 2.2. (NAND) (C) 2001-2003 Red Hat, Inc. io scheduler noop registered io scheduler anticipatory registered (default) io scheduler deadline registered io scheduler cfq registered Console: switching to colour frame buffer device 80x25 fb0: Virtual frame buffer device, using 1024K of video memory S3C2410 RTC, (c) 2004 Simtec Electronics s3c2410-uart.0: s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2410 s3c2410-uart.1: s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2410 s3c2410-uart.2: s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2410 RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize S3C24XX NAND Driver, (c) 2004 Simtec Electronics s3c2410-nand: Tacls=1, 9ns Twrph0=4 39ns, Twrph1=1 9ns NAND device: Manufacturer ID: 0xec, Chip ID: 0x76 (Samsung NAND 64MiB 3,3V 8-bit) NAND_ECC_NONE selected by board driver. This is not recommended !! Scanning device for bad blocks Bad eraseblock 629 at 0x009d4000 Creating 4 MTD partitions on "NAND 64MiB 3,3V 8-bit": 0x00000000-0x00100000 : "bootloader" mtd: Giving out device 0 to bootloader 0x00100000-0x00300000 : "kernel" mtd: Giving out device 1 to kernel 0x00300000-0x02b00000 : "root" mtd: Giving out device 2 to root 0x02b00000-0x04000000 : "user" mtd: Giving out device 3 to user usbmon: debugfs is not available mice: PS/2 mouse device common for all mice ts: Compaq touchscreen protocol output TCP bic registered NET: Registered protocol family 1 Reading data from NAND FLASH without ECC is not recommended No filesystem could mount root, tried: cramfs romfs Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2) 這里因為我沒(méi)有添加任何應用程序和文件系統,所以出錯,不影響內核已經(jīng)成功移植。 9、使用mkimage給zImage添加信息頭 mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.17.13 -d zImage uImage2.6.17.13 -A arm -------- 架構是arm -O linux -------- 操作系統是linux -T kernel -------- 類(lèi)型是kernel -C none -------- 壓縮類(lèi)型為無(wú)壓縮 -a 30008000 ---- image的載入地址(hex) -e 30008040 ---- 內核的入口地址(hex),因為信息頭的大小是0x40 -n linux-2.6.17.13 --- image的名字 -d zImage ---- 無(wú)頭信息的image文件名 uImage2.6.17.13 ---- 加了頭信息之后的image文件名 10、使用tftp下載內核 a、安裝atftpd 我現在用的linux是ubuntu6.06,安裝了atftpd,沒(méi)安裝的話(huà)使用 #sudo apt-get install atftpd 安裝。 b、接著(zhù)建立/tftp目錄,并設置所有人都有讀寫(xiě)運行權限: #sudo mkdir /tftp #sudo chmod 777 tftp c、啟動(dòng)tftp服務(wù): #sudo atftpd --daemon --user xzs --group root /tftp d、將zImage和uImage2.6.17.13復制到/tftp目錄下 e、啟動(dòng)minicom,復位板子,在minicom下輸入 tftp 30008000 uImage2.6.17.13 如果已經(jīng)板子和PC機已經(jīng)通過(guò)網(wǎng)線(xiàn)連接,IP也正確,則會(huì )出現一下信息: TFTP from server 192.168.1.10; our IP address is 192.168.1.110 Filename ‘uImage2.6.17.13‘. Load address: 0x30008000 Loading: ################################################################# ################################################################# ################################################################# ######################## done Bytes transferred = 1116720 (110a30 hex) linux 2.6.22.1 的在s3c2410板子上的移植 -------------------作者:無(wú)貓 ++++++++++++++++++++++++++++++++++++++++++++++ ---------------------------------------------- bootloader編譯環(huán)境: vivi版本:0.1.4 交叉編譯器(CROSS-COMPILE)版本:2.95.3 (下載地址略:網(wǎng)上很多搜下。) 操作系統:Fedora 7 ====================================== linux內核編譯環(huán)境: 內核版本:linux2.6.22.1 交叉編譯器(CROSS-COMPILE)版本: 4.2.0 (下載地址: http://www.codesourcery.com/gnu_toolchains/arm/download.html) 注意:下載選項,要選 ARM EABI 的選項,和 IA32 GNU/linux 操作系統: Fedora 7 ====================================== 文件系統編譯環(huán)境: busybox1.5.1,或1.4.2 交叉編譯器(CROSS-COMPILE)版本: 3.3.2 (下載地址:http://linux.omap.com/pub/toolchain/ ) 操作系統: Fedora 7 ---------------------------------------------- 硬件: 板子是北京恒頤高科技術(shù)有限公司的H2410EB 內存: 64MB SDRAM(2×16M×16位); CPU: S3C2410 ARM處理器, Nor Flash:2MB的Nor Flash,用于固化測試程序(用來(lái)下載bootloader,內核,或文件系統); NANDflash: 64MB的Nand Flash,用于存儲Bootloader、Linux內核及文件系統、應用程序和數據; ++++++++++++++++++++++++++++++++++++++++++++++ ================================================================================================== 一: 編譯環(huán)境搭建 ================================================================================================== 一:搭建交叉編譯環(huán)境 說(shuō)明:由于編譯交叉編譯環(huán)境比較繁瑣,建議大家用已經(jīng)編譯好的交叉編譯環(huán)境。 下面以3.3.2的交叉編譯環(huán)境的搭建為例,其他的兩個(gè)的編譯器環(huán)境搭建一樣。 1. 解壓文件命令: tar jxvf obsolete-gcc-3.3.2.tar.bz2 (obsolete-gcc-3.3.2.tar.bz2下載地址:http://linux.omap.com/pub/toolchain/ ) 2. 把解壓的文件夾中的 “3.3.2”文件夾拷貝到 /usr/local/arm目錄下 (如果沒(méi)有arm目錄就新建arm目錄,但是一定要是拷貝到這個(gè)目錄,不然不能運行)。 3. 在命令窗口輸入 export PATH=/usr/local/arm/3.3.2/bin:$PATH 4. 如果輸入 arm- 然后按下tab鍵能自動(dòng)補全命令 arm-linux- 說(shuō)明搭建成功。 =================================================================================================== 二: bootloader 編譯 =================================================================================================== 二: bootloader的修改 主要修改分區信息,如果要能下載yaffs文件系統還得另外打補丁,最近我會(huì )寫(xiě)編這樣的文章。 具體修改: 1. 解壓vivi(具體命令略,如果你解壓都不會(huì ),移植可能對你來(lái)說(shuō)有點(diǎn)困難) [root@localhost vivi]# ls arch CVS drivers init Makefile Rules.make test vivi vivi.map COPYING Documentation include lib Makefile.newSDK scrīpts util vivi-elf 2. [root@localhost vivi]# vim ./arch/s3c2410/smdk.c 修改 NAND flash 分區如下: ---------------------------------------------------------------------- mtd_partition_t default_mtd_partitions[] = { { name: "bootloader", offset: 0, size: 0x00020000, flag: 0 }, { name: "param", offset: 0x00020000, size: 0x000E0000, flag: 0 }, { name: "kernel", offset: 0x00100000, size: 0x00300000, flag: 0 }, { name: "root", offset: 0x00400000, size: 0x01400000, flag: MF_BONFS }, { name: "user", offset: 0x01800000, size: 0x02C00000, flag: MF_BONFS } }; ------------------------------------------------------------------------- 3. 修改Makefile [root@localhost vivi]# vim Makefile 修改 ARCH LINUX_INCLUDE_DIR CROSS_COMPILE 如下: ------------------------------------------------------------------------ ARCH := arm LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include/ CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux- 3. 編譯 [root@localhost vivi]# make ------------------------------------------------------------------------ 會(huì )在 vivi目錄生成你要的 vivi 程序(bootloader) ------------------------------------------------------------------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 說(shuō)明:我的nand falsh的一塊為16k, 所以上面的分區: ************************************** 分區信息 ************************************** bootloader: 128k param : 896k kernel : 3M root : 20M user : 40M ************************************** bon 操作 ************************************** bon part 0 1M 4M:m 24M:m 解釋一下上面的命令: 第1個(gè)分區從0開(kāi)始; 第2個(gè)分區從0x30000(即192K)開(kāi)始; 第3個(gè)分區從0x200000(即2M)開(kāi)始; 第4個(gè)分區從0x400000(即4M)開(kāi)始. *********************************** bon part info *********************************** bon part info BON info. (4 partitions) No: offset size flags bad --------------------------------------------- 0: 0x00000000 0x00100000 00000000 0 1M 1: 0x00100000 0x00300000 00000000 0 3M 2: 0x00400000 0x01400000 00000001 0 20M 3: 0x01800000 0x027fc000 00000001 0 39M+1008k *********************************** part show *********************************** mtdpart info. (5 partitions) name offset size flag ------------------------------------------------ bootloader : 0x00000000 0x00020000 0 128k param : 0x00020000 0x000e0000 0 896k kernel : 0x00100000 0x00300000 0 3M root : 0x00400000 0x01400000 4 20M user : 0x01800000 0x02c00000 4 44M ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ =================================================================================================== 三: 內核 編譯 =================================================================================================== 三: 內核 編譯 注意:用的編譯器是4.2.0的交叉編譯器 1. 修改 Makefile [root@localhost porting]# cd linux-2.6.22 [root@localhost linux-2.6.22]# vim Makefile 修改 ARCH 和 CROSS_COMPILE -------------------------------------------------------------- ARCH ?= arm CROSS_COMPILE ?=/usr/local/arm/4.2.0/bin/arm-none-eabi- 2. 修改common-smdk.c文件 [root@localhost linux-2.6.22]# vim arch/arm/plat-s3c24xx/common-smdk.c ------------------------------------------------------------------------------ static struct mtd_partition smdk_default_nand_part[] = { [0] = { .name = "Boot", .size = SZ_128K, .offset = 0, }, [1] = { .name = "param", .offset = MTDPART_OFS_APPEND, .size = SZ_1M - SZ_128K, }, [2] = { .name = "kernel", .offset = SZ_1M, .size = SZ_1M * 3, }, [3] = { .name = "root", .offset = MTDPART_OFS_APPEND, .size = SZ_2M * 10, }, /* , [5] = { .name = "S3C2410 flash partition 5", .offset = SZ_1M * 14, .size = SZ_1M * 10, }, [6] = { .name = "S3C2410 flash partition 6", .offset = SZ_1M * 24, .size = SZ_1M * 24, }, [7] = { .name = "S3C2410 flash partition 7", .offset = SZ_1M * 48, .size = SZ_16M, } */ }; --------------------------------------------------------------------------------- 3. 去掉nand flash 的ECC [root@localhost linux-2.6.22]# vim drivers/mtd/nand/s3c2410.c --------------------------------------------------------------------------------- 1、打開(kāi)drivers/mtd/nand/s3c2410.c 2、搜索關(guān)鍵字NAND_ECC_SOFT,在s3c2410_nand_init_chip函數里 3、修改NAND_ECC_SOFT為NAND_ECC_NONE --------------------------------------------------------------------------------- 4. 支持啟動(dòng)時(shí)掛載devfs 為了我們的內核支持devfs以及在啟動(dòng)時(shí)并在/sbin/init運行之前能自動(dòng)掛載/dev為devfs文件系統。 [root@localhost linux-2.6.22]# vi fs/Kconfig ----------------------------------------------------------------------------------- 找到menu "Pseudo filesystems" 添加如下語(yǔ)句: config DEVFS_FS bool "/dev file system support (OBSOLETE)" default y config DEVFS_MOUNT bool "Automatically mount at boot" default y depends on DEVFS_FS ---------------------------------------------------------------------------------- 5. 編譯內核 [root@localhost linux-2.6.22]# cp ./arch/arm/configs/s3c2410_defconfig .config [root@localhost linux-2.6.21.5]# make xconfig ---------------------------------------------------------------------------------- Userspace binary formats [ ]Kernel support for a.out and ECOFF binaries (BINFMT_AOUT) (去除該選項) Boot options Default kernel command string 改成: noinitrd root=/dev/mtdblock3 console=ttySAC0,115200 init=/linuxrc +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 再選上你想選的選項,如果編譯通不過(guò),對照著(zhù)錯誤,看下把哪些選項去除,或添加哪些選項。 ----------------------------------------------------------------------------------- 6. 編譯 [root@localhost linux-2.6.22]# make zImage =================================================================================================== 四: 文件系統的制作 =================================================================================================== 四: 文件系統的制作 注意:交叉編譯器 3.3.2, busybox1.5.1, 靜態(tài)編譯 編譯更詳細的內容:http://bbs.ss.pku.edu.cn/ss/index.php/5836/action_viewspace_itemid_11825.html 1. busybox的編譯 ----------------------------------------------------------------------------- 一 修改busybox中的 Makefile文件 找到 ARCH 和 CROSS_COMPILE 修改成如下 ARCH ?= arm CROSS_COMPILE ?= /usr/local/arm/3.3.2/bin/arm-linux- 二 配置 [root@localhost busybox-1.4.2]# make defconfig [root@localhost busybox-1.4.2]# make xconfig ============================================= 修改配置 主要修改如下 ============================================= Busybox Settings Build Options [*]Build BusyBox as a static binary //選此項靜態(tài)編譯。 Miscellaneous Utilities []taskset //選了就會(huì )出錯 ------------------------------------------------- 三 編譯 [root@localhost busybox-1.5.1]# make all install ----------------------------------------------------------------- 最后會(huì )在 busybox-1.5.1/_install/目錄生成你要的 bin sbin usr 目錄 ------------------------------------------------------------------ 2. 編寫(xiě)linuxrc 文件 ----------------------------------------------------------------- #!/bin/sh #echo "mount /etc as ramfs" /bin/mount -n -t ramfs ramfs /etc /bin/cp -a /mnt/etc/* /etc echo "re-create the /etc/mtab entries" # re-create the /etc/mtab entries /bin/mount -f -t cramfs -o remount,ro /dev/mtdblock/3 / #mount some file system echo "mount /dev/shm as tmpfs" /bin/mount -n -t tmpfs tmpfs /dev/shm #掛載/proc為proc文件系統 echo "mount /proc as proc" /bin/mount -n -t proc none /proc #掛載/sys為sysfs文件系統 echo "mount /sys as sysfs" /bin/mount -n -t sysfs none /sys /bin/mount -f -t ramfs ramfs /etc echo "yaffs is mounted" /bin/mount -t yaffs /dev/mtdblock/1 /mnt/yaffs exec /sbin/init --------------------------------------------------------------------- 3. 權限修改 chmod chmod 775 linuxrc 4. 編寫(xiě) inittab文件 --------------------------------------------------------------------- ::sysinit:/etc/init.d/rc ::askfirst:-/bin/sh tty2::askfirst:-/bin/sh tty3::askfirst:-/bin/sh tty4::askfirst:-/bin/sh tty0::askfirst:-/bin/sh ::restart:/sbin/init ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r ::shutdown:/sbin/swapoff -a ---------------------------------------------------------------------- 5. rc文件 ---------------------------------------------------------------------- #!/bin/sh /bin/mount -a ----------------------------------------------------------------------- 6. fastab 文件 ---------------------------------------------------------------------- none /proc proc defaults 0 0 none /dev/pts devpts mode=0622 0 0 tmpfs /dev/shm tmpfs defaults 0 0 ---------------------------------------------------------------------- 7. 各文件的關(guān)系 ---------------------------------------------------------------------- 7.1 建立一個(gè)目標板的空根目錄 我們將在這里構建構建根文件系統,創(chuàng )建基礎目錄結構. 存放交叉編譯后生成的目標應用程序 (BUSYBOX,TINYLOGIN),存放庫文件等。 [root@localhost rootfs]# mkdir my_rootfs [root@localhost rootfs]# pwd /home/arm/dev_home/rootfs/my_rootfs [root@localhost rootfs]# cd my_rootfs [root@localhost my_rootfs]# 7.2 在my_rootfs中建立Linux目錄樹(shù) [root@localhost my_rootfs]#mkdir bin dev etc home lib mnt proc sbin sys tmp root usr [root@localhost my_rootfs]#mkdir mnt/etc [root@localhost my_rootfs]#mkdir usr/bin usr/lib usr/sbin [root@localhost my_rootfs]#touch linuxrc [root@localhost my_rootfs]#tree |bin |dev |etc |home |lib |linuxrc /* 此文件為啟動(dòng)腳本,是一shell腳本文件。本文后面有專(zhuān)門(mén)介紹 */ |mnt | `etc |proc |sbin |sys |tmp |root `usr |bin |lib `sbin 8. 把上面編譯出來(lái)的 busybox文件拷貝到 my_rootfs 文件系統 --------------------------------------------------------------- 把 busybox1.5.1/_install/目錄下的 bin sbin usr 覆蓋 my_rootfs 文件夾里的空文件夾。 -------------------------------------------------------------- 9. 把 5 生成的文件(rc)拷貝到 /mnt/etc/init.d/目錄(先在/mnt/etc/目錄新建格init.d目錄) 把 4,6生成的文件(inittab和 fastab )放到 /mnt/etc/目錄 把 2 生成的文件linuxrc 放到/目錄 這里所提到的 /目錄即my_rootfs目錄。 10. 新建/dev設備,在/dev目錄(即my_rootfs/dev/). mknod console c 5 1 8. 生成cramfs文件 ---------------------------------------------------------------- 下載mkfs.cramfs工具,然后用下面命令生成你要的cramfs文件系統 ./mkfs.cramfs ./my_rootfs ./root.cramfs 移植就這么簡(jiǎn)單,剩下的就是下載,燒寫(xiě)內核,文件系統等。聰明的你不用我說(shuō)怎么做了吧 :) |
聯(lián)系客服