天天看點

建構 arm-linux 仿真運作環境 (skyeye + u-boot + arm-linux + NFS)

建議編譯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 &apos;Y&apos; 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 1

env_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, #

0xc1

   ldr    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

繼續閱讀