建議編譯u-boot的時候arm-linux-gcc用2.95.3 編譯2.6核心時用 3.4.1 。
一. 安裝 Skyeye
我們標明 skyeye 的 1.2.3 這個版本, 為了能讓它上面運作的 arm-linx 能挂接 NFS,我
們需要修改 device/net/dev_net_cs 8900a .c (修改後的檔案在附件裡), 再編譯 skyeye。
操作如下, 先解壓源碼包:
#tar xzf skyeye-1.2.3_Rel.tar.gz
#cd skyeye-1.2.3
請用附件裡的 dev_net_cs 8900a .c 替換 device/net/dev_net_cs 8900a .c 後執行編譯:
#make
編譯完後生成的 skyeye 在 binary 下,将其拷貝至 /usr/local/bin/ 下:
#cp binary/skyeye /usr/local/bin
二. 編譯u-boot
2.1 配置闆子SDROM和FLASH參數為闆子實際大小,找到u-boot- 1.1.6 /include/configs/smdk2410.h,修改其中的PHYS_SDRAM_1_SIZE為闆子實際SDRAM大小 64M ,CFG_MAX_FLASH_SECT為128,修改PHYS_FLASH_SIZE為闆子實際FLASH大小 16M 。并儲存。
如下所示
*-----------------------------------------------------------------------
* Physical Memory Map
*/
#define CONFIG_NR_DRAM_BANKS 1
#define PHYS_SDRAM_1 0x30000000
#define PHYS_SDRAM_1_SIZE 0x04000000
#define PHYS_FLASH_1 0x00000000
#define CFG_FLASH_BASE PHYS_FLASH_1
#define CONFIG_AMD_LV400 1
#if 0
#define CONFIG_AMD_LV800 1
#endif
#define CFG_MAX_FLASH_BANKS 1
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE 0x04000000
#define CFG_MAX_FLASH_SECT (128)
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x020000)
#endif
#ifdef CONFIG_AMD_LV400
#define PHYS_FLASH_SIZE 0x04000000
#define CFG_MAX_FLASH_SECT (128)
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x020000)
#endif
2.2修改uboot目錄下的Makefile,将
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-Linux-
endif
修改成
ifeq ($(ARCH),arm)
CROSS_COMPILE = /opt/host/armv 4l /bin/armv 4l -unknown-linux-
endif
2.3修改processor.h中:
union debug_insn
{
u32 arm;
u16 thumb;
}
修改成:
union debug_insn
{
u32 arm_mode;
u16 thumb_mode;
}
2.4 配置并編譯:
make clean
make smdk2410_config
make
經過以上指令則生成兩個檔案:u-boot和u-boot.bin。
三. 建立一個目錄用于存放相關檔案。
3.1 如建立TestArm目錄:mkdir TestArm
3.2 将前面生成的u-boot檔案放在TestArm目錄下。
3.3 建立檔案命名為skyeye.conf并放在TestArm目錄下,檔案内容如下
cpu: arm920t
mach: s 3c 2410x
mem_bank:map=I,type=RW,addr=0x48000000,size=0x20000000
#注意此處的addr一定要與上面smdk2410.h配置的SDRAM和FLASH的大小與基位址一定要相同,否則啟動不起來,卡在那裡。
#下面這一句和FLASH一樣
mem_bank:map=M,type=RW,addr=0x00000000,size=0x04000000,file=u-boot.bin,boot=yes
#下面這一句和SDRAM一樣
mem_bank:map=M,type=RW,addr=0x30000000,size=0x04000000
完整的skyeye.conf如下:
#skyeye config file sample
cpu: arm920t
mach: s 3c 2410x
mem_bank: map=M, type=RW, addr=0x00000000, size=0x01000000, file=u-boot.bin, boot=yes
mem_bank: map=M, type=RW, addr=0x30000000, size=0x04000000
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000, file=vmlinux
mem_bank: map=M, type=RW, addr=0xc1000000, size=0x00600000, file=initrd.img
mem_bank: map=M, type=RW, addr=0xc1600000, size=0x 00a 00000
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
net: type=cs 8900a , base=0x19000300, size=0x20,int=9, mac=0:4:3:2:1:f, ethmod=tuntap, hostip= 10.0.0 .1
#lcd:type=s 3c 2410x,mod=gtk
dbct:state=on
四. 運作指令./skyeye如下所示
[[email protected] TestArm]$ skyeye –e u-boot
**************************** WARNING *****************************
If you want to run ELF image, you should use -e option to indicate
your elf-format image filename. Or you only want to run binary image,
you need to set the filename of the image and its entry in skyeye.conf.
***********************************************************************
big_endian is false.
arch: arm
cpu info: armv4, arm920t, 41009200, ff00fff0, 2
mach info: name s 3c 2410x, mach_init addr 0x 8067f 58
flash: dump nand.dump
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM u-boot
ERROR: s 3c 2410x_io_write_word(0x 4c 000000) = 0x00ffffff
ERROR: s 3c 2410x_io_write_word(0x 4c 000008) = 0x00048032
U-Boot 1.1.6 (Jun 10 2008 - 08:40:29)
DRAM: 64 MB
Flash: 64 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
SMDK2410#
表明已經運作起來了,上面顯示有一個警靠我兩個ERROR,不知為何,正在查原因。啟動ArmLinux
SMDK2410 # go c0000000
五 編譯核心
我們標明 linux- 2.6.14 .tar.bz2 這個版本, 交叉編譯器用 arm-linux-gcc 3.4.1 (對
2.6 核心用 3.4 以下的版本編譯經常會出現問題)。操作步驟如下:
1.假定核心源碼包在 /root 下, 首先解壓源碼:
#cd /root
#tar xjf linux- 2.6.14 .tar.bz2
2.進入核心目錄:
#cd linux- 2.6.14
修改此目錄下的 Makefile, 将
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改為
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/ 3.4.1 /bin/arm-linux-
3.生成預設的核心配置檔案(for s 3c 2410):
#make smdk2410_defconfig
4.為核心添加 cs8900(見附件) 網卡驅動,以支援 NFS 挂接:
(1)複制 cs8900 驅動到 drivers/net/arm 目錄
#cp cs8900.c drivers/net/arm
#cp cs8900.h drivers/net/arm
(2)修改 drivers/net/arm 目錄下的 Kconfig 檔案, 在最後添加:
config ARM_CS8900
tristate "CS8900 support"
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
help
Support for CS 8900A chipset based Ethernet cards. If you have a network
(Ethernet) card of this type, say Y and read the Ethernet-HOWTO, available
from as well as .To compile this driver as a module, choose M here and read.
The module will be called cs8900.o.
注:在運作 make menuconfig 指令時就會出現: [ ] CS8900 support 這一選項
(3)修改 drivers/net/arm 目錄下的Makefile檔案,在最後添加如下内容:
obj-$(CONFIG_ARM_CS8900) += cs8900.o
注:2.6 版本核心的 Makefile 也與 2.4 的有所不同, 添加以上語句, 就會使核心在
編譯的時候根據配置将cs 8900A 的驅動程式以子產品或靜态的方式編譯到核心當中。
(4)修改 arch/arm/mach-s 3c 2410/mach-smdk2410.c
在此檔案中找到 smdk2410_iodesc[] 結構數組,添加如下如下内容:
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_ 1M , MT_DEVICE}
修改之後變成:
static struct map_desc smdk2410_iodesc[] __initdata = {
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_ 1M , MT_DEVICE}
};
并且添加一個頭檔案引用:
#include <asm-arm/arch-s 3c 2410/smdk2410.h>
(5)在 include/asm-arm/arch-s 3c 2410 目錄下建立檔案 smdk2410.h
#ifndef _INCLUDE_SMDK2410_H_
#define _INCLUDE_SMDK2410_H_
#include <linux/config.h>
#define pSMDK2410_ETH_IO 0x19000000
#define vSMDK2410_ETH_IO 0xE0000000
#define SMDK2410_ETH_IRQ IRQ_EINT9
#endif
5.參照 http://skyeye.wiki.sourceforge.net/Linux 修改核心檔案
修改 include/asm-arm/arch-s 3c 2410/map.h
#define S 3C 2410_CS6 (0x30000000UL)
to
#define S 3C 2410_CS6 (0xC0000000UL)
修改 include/asm-arm/arch-s 3c 2410/memory.h
#define PHYS_OFFSET (0x30000000UL)
to
#define PHYS_OFFSET (0xC0000000UL)
6.添加Nor flash驅動
6.1、分區資訊
HHARM2410-STUDY開發闆使用16bit 8M NOR FLASH,分區資訊如下:
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00140000 : "kernel"
0x00140000-0x00540000 : "ramdisk"
0x00540000-0x00800000 : " jffs2"
6.2、添加配置項
1、修改 drivers/mtd/maps/Kconfig檔案,添加如下内容:
config MTD_S 3C 2410
tristate "CFI Flash device mapped on S 3C 2410"
depends on ARM && MTD_CFI
help
This enables access to the CFI Flash on the Cogent S 3C 2410 board.
If you have such a board, say 'Y' here.
2、修改 drivers/mtd/maps/Makefile檔案,添加如下内容:
obj-$(CONFIG_MTD_S 3C 2410)+= s 3c 2410.o
3、複制驅動檔案s 3c 2410.c到drivers/mtd/maps目錄下
7.裁剪/定制核心
(1)#make menuconfig
(2)設定核心啟動參數
Boot options ---> Default kernel command string:
mem= 32M console=ttySAC0 root=/dev/ram initrd=0xc1000000,0x00600000 ramdisk_size=8192 rw
(3)設定 CS8900 的支援
Device Drivers --->
Network device support --->
Ethernet (10 or 100Mbit) ---> [] CS8900 support
選中 [*] CS8900 support
(4)設定 initrd 的支援
Device Drivers ---> Block devices ---> [ ] RAM disk support
下面三項必須設定:
1.確定 RAM disk support 被選中
2.相應的将預設的 (4096) Default RAM disk size (kbytes) 改成 8192;
3.Initial RAM disk (initrd) support 一定要選中, 切記!
(5)設定 NFS 的支援
File systems ---> Network File Systems --->
至少確定下面兩項被選中:
[*] NFS file system support
[*] Provide NFSv3 client support
(6)設定 ROM file system 的支援
File systems ---> [*] ROM file system support
確定 [*] ROM file system support 被選中
(7)設定 ext2 的支援
File systems ---> [*] Second extended fs support
確定 [*] Second extended fs support 被選中
(8) Memory Technology Devices(MTD)-->
<*>Memory Technology Device (MTD) support
[*]MTD partitioning support
<*>Direct char device access to MTD devices
<*>Caching block device access to MTD devices
RAM/ROM/Flash chip drivers-->
<*>Detect flash chips by Common Flash Interface (CFI) probe
<*>Support for Inter/Sharp flash chips
Mapping drivers for chip access-->
<*>CFI flash device mapped on S 3C 2410
Miscellaneous filesystems-->
<*>Journalling Flash File System v2 (JFFS2) support
7.編譯
#ln –s include/asm-arm include/asm
#make
編譯完成後會有個 vmlinux 在目前目錄下, 這就是我們要的 arm-linux 核心了
六、測試
6.1 将編譯好的核心檔案vmlinux拷貝到TestArm目錄
6.2 拷貝一個ramdisk根檔案系統到TestArm目錄
6.3 由skyeye啟動u-boot,然後用u-boot引導核心檔案
# skyeye –e u-boot
smdk2410# go c0000000
啟動核心時候如果出現些錯誤 Error: unrecognized/unsupported machine ID (r1 = 0x 33f 60264).Linux核心啟動時出現:bad machine ID,原因大緻是u-boot傳遞給核心的machine ID錯誤,可以手動在核心源代碼中添加machine ID.
解決方法:
在u-boot指令行中輸入bdinfo
檢視闆卡資訊,我的輸出如下:
[ [email protected] ]# bdinfo
arch_number =
0x 000000C 1env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x04000000
ethaddr = 08:00:3E:26: 0A :5B
ip_addr = 10.1.8 .245
baudrate = 115200 bps
修改核心的arch/arm/kernel/head.S,直接将s 3c 2410的參數賦給核心
# cd linux- 2.6.14 .1
# vi arch/arm/kernel/head.S +104
----------------------------------------------
102 __INIT
103 .type stext, %function
104 ENTRY(stext)
mov r0, #0
mov r1, #
0xc1ldr r2, =0x30000100
105 msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode
106 @ and irqs disabled
解決方法二========================================================
修改u-boot,填寫ID;
# vi common/cmd_boot.c
----------------------------------------------
31 #if defined(CONFIG_I386)
32 DECLARE_GLOBAL_DATA_PTR;
33 #endif
====>
31 //#if defined(CONFIG_I386)
32 DECLARE_GLOBAL_DATA_PTR;
33 //#endif
...
60 #if !defined(CONFIG_NIOS)
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
61 rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
62 #else
63
66 rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]);
67 #endif