构建 arm-linux 仿真运行环境 (skyeye + u-boot + arm-linux + NFS)
来源:互联网 发布:arcgis js 点击事件 编辑:程序博客网 时间:2024/05/23 00:07
建议编译u-boot的时候arm-linux-gcc用2.95.3 编译2.6内核时用
一. 安装 Skyeye
我们选定 skyeye 的
们需要修改 device/net/dev_net_cs
操作如下, 先解压源码包:
#tar xzf skyeye-1.2.3_Rel.tar.gz
#cd skyeye-1.2.3
请用附件里的 dev_net_cs
#make
编译完后生成的 skyeye 在 binary 下,将其拷贝至 /usr/local/bin/ 下:
#cp binary/skyeye /usr/local/bin
二. 编译u-boot
2.1 配置板子SDROM和FLASH参数为板子实际大小,找到u-boot-
如下所示
*-----------------------------------------------------------------------
* Physical Memory Map
*/
#define CONFIG_NR_DRAM_BANKS 1 /* we have 1 bank of DRAM */
#define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
#define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */
#define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
#define CFG_FLASH_BASE PHYS_FLASH_1
/*-----------------------------------------------------------------------
* FLASH and environment organization
*/
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a LV400 flash */
#if 0
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#endif
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE 0x04000000 /* 64MB */
#define CFG_MAX_FLASH_SECT (128) /* max number of sectors on one chip */
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x020000) /* addr of environment */
#endif
#ifdef CONFIG_AMD_LV400
#define PHYS_FLASH_SIZE 0x04000000 /* 64MB */
#define CFG_MAX_FLASH_SECT (128) /* max number of sectors on one chip */
#define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x020000) /* addr of environment */
#endif
2.2修改uboot目录下的Makefile,将
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-Linux-
endif
修改成
ifeq ($(ARCH),arm)
CROSS_COMPILE = /opt/host/armv
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
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
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
mem_bank: map=I, type=RW, addr=0x48000000, size=0x20000000
mem_bank: map=I, type=RW, addr=0x19000300, size=0x00000020
net: type=cs
#lcd:type=s
dbct:state=on
四. 运行命令./skyeye如下所示
[Filter@zhoub 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
flash: dump nand.dump
uart_mod:0, desc_in:, desc_out:, converter:
SKYEYE: use arm920t mmu ops
Loaded RAM u-boot
ERROR: s
ERROR: s
U-Boot
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 内核用 3.4 以下的版本编译经常会出现问题)。操作步骤如下:
1.假定内核源码包在 /root 下, 首先解压源码:
#cd /root
#tar xjf linux-
2.进入内核目录:
#cd linux-
修改此目录下的 Makefile, 将
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
ARCH ?= arm
CROSS_COMPILE ?= /usr/local/arm/
3.生成默认的内核配置文件(for s
#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
(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
(4)修改 arch/arm/mach-s
在此文件中找到 smdk2410_iodesc[] 结构数组,添加如下如下内容:
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_
修改之后变成:
static struct map_desc smdk2410_iodesc[] __initdata = {
/* nothing here yet */
/* Map the ethernet controller CS
{vSMDK2410_ETH_IO,pSMDK2410_ETH_IO, SZ_
};
并且添加一个头文件引用:
#include <asm-arm/arch-s
(5)在 include/asm-arm/arch-s
#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
#define S
to
#define S
修改 include/asm-arm/arch-s
#define PHYS_OFFSET (0x30000000UL)
to
#define PHYS_OFFSET (0xC0000000UL)
6.添加Nor flash驱动
6.1、分区信息
HHARM2410-STUDY开发板使用16bit
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00140000 : "kernel"
0x00140000-0x00540000 : "ramdisk"
0x00540000-0x00800000 : " jffs2"
6.2、添加配置项
1、修改 drivers/mtd/maps/Kconfig文件,添加如下内容:
config MTD_S
tristate "CFI Flash device mapped on S
depends on ARM && MTD_CFI
help
This enables access to the CFI Flash on the Cogent S
If you have such a board, say 'Y' here.
2、修改 drivers/mtd/maps/Makefile文件,添加如下内容:
obj-$(CONFIG_MTD_S
3、复制驱动文件s
7.裁剪/定制内核
(1)#make menuconfig
(2)设置内核启动参数
Boot options ---> Default kernel command string:
mem=
(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
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
解决方法:
在u-boot命令行中输入bdinfo
查看板卡信息,我的输出如下:
[ ~ljh@GDLC ]# bdinfo
arch_number = 0x
env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x04000000
ethaddr = 08:00:3E:26:
ip_addr =
baudrate = 115200 bps
修改内核的arch/arm/kernel/head.S,直接将s
# cd linux-
# vi arch/arm/kernel/head.S +104
----------------------------------------------
102 __INIT
103 .type stext, %function
104 ENTRY(stext)
/********* add here *********/
mov r0, #0
mov r1, #0xc1
ldr r2, =0x30000100
/********* end add *********/
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)
/************** add here ******************/
if(argc==2)
rc = ((ulong (*)(int, char *[]))addr) (0, gd->bd->bi_arch_number);
else
/*************** add end *****************/
61 rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]);
62 #else
63 /*
64 * Nios function pointers are address >> 1
65 */
66 rc = ((ulong (*)(int, char *[]))(addr>>1)) (--argc, &argv[1]);
67 #endif
- 构建 arm-linux 仿真运行环境 (skyeye + u-boot + arm-linux + NFS)
- 构建 arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)
- 构建arm-linux仿真运行环境(skyeye+arm-linux+NFS)
- 构建arm-linux仿真运行环境(skyeye+arm-linux+NFS)
- 构建 arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)
- 构建 arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)
- arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)
- [转载]构建 arm-linux 仿真运行环境 (skyeye + arm-linux + NFS)(自己附加了注解)
- arm linux on skyeye using nfs
- 创建虚拟的U-boot和ARM Linux学习环境
- arm embeded linux nfs boot configure
- 使用 SkyEye 模拟 ARM Linux
- uboot 用 yaffs、nfs 引导linux命令行,u-boot,bootargs,arm
- U-boot 编译找不到 arm-none-linux
- 建立ARM+Linux运行环境
- 建立ARM+Linux运行环境
- linux+arm环境配置——NFS
- arm linux nfs
- 利用Ubuntu组建机群
- 东方标准的嵌入式系统课程
- python namespace and variable scope
- 在ITPUB上发表了文章《探秘QTP9.5新特性之过程指南(Process Guidance)》
- 关于Java与C++的一点点猜想
- 构建 arm-linux 仿真运行环境 (skyeye + u-boot + arm-linux + NFS)
- 毕业这三年
- 今天继续看Mule
- 坚持5年多的PKM成果
- c++ 获得系统时间
- 安装QT/E开发环境
- 第二人生的源码分析(106)脚本的词法分析(4)
- protues 软件介绍
- Barry生活日记(二)