系统移植试验手册-2010-08-19(new)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

嵌入式学院实验手册系统移植部分
嵌入式学院教材开发部编著
(内部资料,请勿外传)
嵌入式学院(2010)版权所有V3.0
目录
目录 (2)
实验一交叉工具链的移植 (3)
实验二 u-boot的烧写及使用 (8)
实验三 u-boot-2010.03的移植 (12)
实验四 linux-2.6.22.6内核的编译和配置 (31)
实验五 linux-2.6.35内核移植—网卡驱动的添加 (34)
实验六 linux-2.6.35内核移植—Nand flash驱动的添加 (36)
实验七 linux-2.6.35内核移植—LCD驱动的添加 (38)
实验八 linux-2.6.35内核移植—USB驱动的添加 (40)
实验九 linux-2.6.35内核移植—SD卡驱动的添加 (42)
实验十 linux-2.6.35内核移植—yaffs2文件系统的支持 (45)
实验十一内核调试 (47)
实验十二内存调试 (50)
实验十三文件系统的移植 (53)
实验十四 UDEV的移植 (58)
实验一交叉工具链的移植
【实验目的】
了解交叉工具链的编译过程及其使用。

说明:在本系统移植课程实验中命令行提示符“$”表示是在主机上执行,“#”表示在目标板执行
【实验环境】
1、Ubuntu 10.10发行版
2、FS2410平台
【实验步骤】
1、源码下载
Crosstools-ng下载地址
/download/crosstool-ng/
同时对每一个版本都有相应的补丁我们尽量把这些补丁打上,这些补丁的下载地址是/download/crosstool-ng/01-fixes/
我这里选用的是crosstool-ng-1.8.1.tar.bz2
并下载补丁
000-scripts_log_do_not_interpret_log_string_as_printf_format.patch
001-binutils_binutils_remove_faulty_patch.patch
002-kconfig_resync_curses_check_with_Linux_kernel.patch
2、工具的安装
在使用之前必须安装一些软件
$ sudo apt-get install gawk autotools-dev automake texinfo libtool cvs patch bison flex libncurses5-dev
3、必要目录的创建
/home/linux目录下,$mkdir s3c2410-2.6.35 $mkdir toolchain
$ cd s3c2410-2.6.35
$mkdir toolchain
$cd toolchain
$ mkdir toolchain-build
$ mkdir toolchain-install
把下列源码包复制到目录/home/linux/s3c2410-2.6.35/toolchain
crosstool-ng-1.8.1.tar.bz2
000-scripts_log_do_not_interpret_log_string_as_printf_format.patch
001-binutils_binutils_remove_faulty_patch.patch
002-kconfig_resync_curses_check_with_Linux_kernel.patch
4、解压源码并打补丁
$ tar xvf crosstool-ng-1.8.1.tar.bz2
$ cd crosstool-ng-1.8.1
$ patch –p1 <../000-scripts_log_do_not_interpret_log_string_as_printf_format.patch $ patch –p1 <../001-binutils_binutils_remove_faulty_patch.patch
$ patch –p1 < ../002-kconfig_resync_curses_check_with_Linux_kernel.patch
5、配置并编译crosstool-ng-1.8.1
$ ./configure --prefix=/home/linux/s3c2410-2.6.35/toolchain/toolchain-install
$ make
$ make install
6、配置工具链选项
$ cd ../toolchain-build
$ cp ../crosstool-ng-1.8.1/samples/arm-unknown-linux-gnueabi/* ./
$ mv crosstool.config .config
$ ../toolchain-install/bin/ct-ng menuconfig
Paths and misc options --->
(${HOME}/src) Local tarballs directory
(${HOME}/x-tools/${CT_TARGET}) Prefix directory
修改为
Paths and misc options --->
(/home/linux/Downloads) Local tarballs directory //源码包存放路径
(/home/linux/toolchain) Prefix directory //工具生成后的安装路径
Target options --->
(armv4t) Architecture level
(arm9tdmi) Emit assembly for CPU
(arm920t) Tune for CPU
C compiler --->
[ ] Java
Operating System --->
[ ] Check installed headers
Paths and misc options --->
(1) Number of parallel jobs
Toolchain options --->
(none) Tuple's vendor string
C compiler --->
(crosstool-NG-${CT_VERSION}-farsight) gcc ID string
修改.config文件,将文件中的2.6.33.2全部改为2.6.35 7、目标代码准备
拷贝下面文件到/home/linux/Downloads目录下:binutils-2.19.1.tar.bz2
gcc-4.3.2.tar.bz2
glibc-ports-2.9.tar.bz2
linux-2.6.35.tar.bz2
ncurses-5.7.tar.gz
dmalloc-5.5.2.tgz
gdb-6.8.tar.bz2
gmp-4.3.2.tar.bz2
ltrace_0.5.3.orig.tar.gz
strace-4.5.19.tar.bz2
duma_2_5_15.tar.gz
glibc-2.9.tar.bz2
libelf-0.8.13.tar.gz
mpfr-2.4.2.tar.bz2
Sstrip.c
8、工具链编译
$ ../toolchain-install/bin/ct-ng build
这个过程比较时间比较长,1.5小时左右
9、环境变量的添加
修改文件/etc/bash.bashrc添加如下内容
export PATH=$PATH:/home/linux/toolchain/bin
重启配置文件
$ source bash.bashrc
10、工具链的测试
$ arm-none-linux-gnueabi-gcc –v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /home/linux/s3c2410-2.6.35/toolchain/toolchain-build/targets/src/gcc-4.3.2/configure --build=i686-build_pc-linux-gnu --host=i686-build_pc-linux-gnu --
target=arm-none-linux-gnueabi --prefix=/home/linux/toolchain --with-
sysroot=/home/linux/toolchain/arm-none-linux-gnueabi//sys-root --enable-
languages=c,c++,fortran --disable-multilib --with-arch=armv4t --with-cpu=arm9tdmi --with-tune=arm920t --with-float=soft --with-pkgversion=crosstool-NG-1.8.1-none --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --with-gmp=/home/linux/s3c2410-2.6.35/toolchain/toolchain-build/targets/arm-none-linux-gnueabi/build/static --with-
mpfr=/home/linux/s3c2410-2.6.35/toolchain/toolchain-build/targets/arm-none-linux-gnueabi/build/static --enable-threads=posix --enable-target-optspace --with-local-
prefix=/home/linux/toolchain/arm-none-linux-gnueabi//sys-root --disable-nls --enable-symvers=gnu --enable-c99 --enable-long-long
Thread model: posix
gcc version 4.3.2 (crosstool-NG-1.8.1-none)
这个时候我们的工具链就生成了
~/s3c2410-2.6.35/toolchain/toolchain-build/targets/arm-none-linux-
gnueabi/build/build-gdb-gdbserver/gdbserver
实验二 u-boot的烧写及使用
【实验目的】
了解U-boot-2010.03的代码结构及移植方法。

【实验环境】
1、Ubuntu 10.10发行版
2、u-boot-2010.03
3、FS2410平台
4、交叉编译器 arm-none-linux-gnueabi-gcc
【实验步骤】
1、u-boot的烧写
使用H-jtag将u-boot烧写在2410开发板的nand flash的零地址上,过程与arm实验时相同,区别在于选择flash上。

我们选择的是K9VF1208,如图
烧写完成后打开终端,重启开发板,显示如下
2、设置基本的u-boot环境变量
主机ip设置
# setenv serverip 192.168.1.2
目标板ip设置
# setenv ipaddr 192.168.1.3
保存环境变量
# saveenv
3、内核烧写
内核和文件系统的烧写都使用的是u-boot提供的命令如下:
# tftp 30008000 zImage
# nand erase 40000 200000
# nand write 30008000 40000 200000
4、文件系统烧写
# tftp 30008000 rootfs.cramfs
# nand erase 240000 800000
# nand write 30008000 240000 800000
5、启动参数设置
# setenv bootcmd nand read 30008000 40000 200000\; go 30008000
# setenv bootargs root=/dev/mtdblock2 i nit=/linuxrc console=ttySAC0,115200 # savenv
6、重新启动开发板,最终会进入如下界面,这便是一个最简linux系统
7、u-boot其他命令
u-boot支持那些命令我们可以通过在终端上输入”?”查看
实验三 u-boot-2010.03的移植
【实验目的】
了解U-boot-2010.03的代码结构及移植方法。

【实验环境】
1、Ubuntu 10.10发行版
2、u-boot-2010.03
3、FS2410平台
4、交叉编译器 arm-none-linux-gnueabi-gcc
【实验步骤】
说明:后面实验中的命令行提示符是($)则为主机命令(主机上执行),(#)则为开发板命令(开发板上执行)
1、建立自己的平台
1、下载源码
我们可以在下面这个网站上下载最新的和以前任一版本的uboot
ftp://ftp.denx.de/pub/u-boot/
我们这里使用的是u-boot-2010.03.tar.bz2
2、解压uboot源码
$ tar jxvf u-boot-2010.03.tar.bz2
3、进入到uboot源码
$ cd u-boot-2010.03
4、添加FS2410平台信息
我们关心的班级相关内容文件或目录
u-boot-2010.03/Makefile
u-boot-2010.03/cpu/arm920t/start.S
u-boot-2010.03/board/Samsung/smdk2410
u-boot-2010.03/lib_arm
u-boot-2010.03/include/configs/smdk2410.h
smdk2410是s3c2410的标准板,我们在smdk2410的基础上做FS2410的移植
$ cd board/samsung/
$ cp smdk2410 fs2410 –a
$ cd fs2410
$ mv smdk2410.c fs2410.c
$ vim Makefile
修改
COBJS := smdk2410.o flash.o

COBJS := fs2410.o flash.o
$ cd include/configs
$ cp smdk2410.h fs2410.h
修改u-boot顶层目录下的Makefile,按照smdk2410的内容添加fs2410的内容$ vim Makefile

smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
下添加:
fs2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t fs2410 samsung s3c24x0
修改编译器

ifeq ($(HOSTARCH, $(ARCH))
CROSS_COMPILE ?=
endif
下添加:
ifeq (arm, $(ARCH))
CROSS_COMPILE ?= arm-none-linux-gnueabi-
endif
5、编译u-boot-2010.03
$ make distclean
$ make fs2410_config
$ make
这个时候我们就可以得到一个u-boot.bin也就是我们的目标文件,但是这个文件通常情况下是不能够正常工作的,我们还需要对u-boot源代码进行进一步的修改。

2、针对我们的FS2410平台进行进一步的修改
1、u-boot源码中的中断屏蔽位
在s3c2410中有11个子中断屏蔽位代码里只有10个
修改cpu/arm920t/start.S
修改
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
为:
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
2、修改配置文件include/configs/fs2410.h
1)命令行提示符的修改:
#define CONFIG_SYS_PROMPT "SMDK2410 # "
改成:
#define CONFIG_SYS_PROMPT "fs2410 # "
2)网络参数设置
修改
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 10.0.0.110
#define CONFIG_SERVERIP 10.0.0.1

#define CONFIG_ETHADDR 11:22:33:44:55:66
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.222
#define CONFIG_SERVERIP 192.168.1.223
3)内核加载地址的修改
修改
#define CONFIG_SYS_LOAD_ADDR 0x33000000
改成:
#define CONFIG_SYS_LOAD_ADDR 0x30008000
4)Nand功能添加
对照include/config_cmd_default.h和include/config_cmd_all.h添加我们需要的相应功能。

Nand的功能的添加
#define CONFIG_CMD_NAND /* NAND support*/
#if defined(CONFIG_CMD_NAND)
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x4E000000
#define CONFIG_NAND_S3C2410
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
/* Nand Flash */
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#endif
5)同时支持nand启动和nor启动
#if defined(CONFIG_S3C2410)
#define CONFIG_S3C2410_NAND_BOOT 1 //nand 启动
#define CONFIG_S3C2410_NOR_BOOT 1 //nor 启动
#endif
6)环境变量保存位置
添加:
#ifdef C ONFIG_S3C2410_NOR_BOOT
#define CONFIG_ENV_IS_IN_FLASH 1 /*common/env_flash.c */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x30000) #endif
#ifdef C ONFIG_S3C2410_NAND_BOOT
#define CONFIG_ENV_IS_IN_NAND 1 /* common/env_nand.c */
#define CONFIG_ENV_SIZE 0x10000
#define CONFIG_ENV_OFFSET 0x30000
#define NAND_CTL_BASE 0x4E000000
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
#endif
7)USB功能的添加
#define CONFIG_CMD_FAT /* FAT support*/
#define CONFIG_CMD_USB /* USB support*/
#if defined(CONFIG_CMD_USB)
#define CONFIG_DOS_PARTITION
#define CONFIG_USB_OHCI
#define CONFIG_USB_STORAGE
#define CONFIG_SUPPORT_VFAT
#define LITTLEENDIAN
#endif
Ping命令的添加
#define CONFIG_CMD_PING /* ping support*/
8)Nor flash(sst39vf1601)及Norflash相关内容的
注释掉
#define CONFIG_AMD_LV400 1 /* uncomment this if you have a
LV400 flash */
添加
#define CONFIG_SST_39VF1601 1
添加
#ifdef CONFIG_SST_39VF1601
#define PHYS_FLASH_SIZE 0x00200000 /* 2M*/
#define CONFIG_SYS_MAX_FLASH_SECT (512) /* max number of sectors on one chip */
#endif
3、添加Nand启动功能(修改cpu/arm920t/start.S)
u-boot默认情况下是nar启动,这里我们添加nand启动的内容:
1)添加头文件
#include <version.h>
#include <status_led.h>
2)添加nand启动标志位
/*add for env_nand.c*/
.extern pbootflag
@pbootflag: //1:NOR flash, 0:NAND flash
3)添加BWSCON寄存器的定义(加粗字体为添加内容)
# if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base
addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */
#else
# define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base
addresses */
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */
# define BWSCON 0x48000000
# endif
4)添加启动模式判断Nor启动还是nand启动(加粗字体为添加内容)
/*czm add 2010-8-18*/
ldr r0,=BWSCON
ldr r0,[r0]
ands r0,r0,#6
beq nand_boot
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ cmp r0, r1 /* don't reloc during debug */
beq stack_setup
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_SKIP_RELOCA TE_UBOOT */
#endif
/* add 2010-08-18 */
bl stack_setup
5)添加NAND启动自搬移代码(在上一步代码下添加)
nand_boot:
#ifdef CONFIG_S3C2410_NAND_BOOT
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
nand1:
add r3, r3, #0x1
cmp r3, #0xa
blt nand1
nand2:
ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq nand2
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
@ get read to call C functions (for nand_read())
ldr sp, DW_STACK_START @ setup stack pointer mov fp, #0 @ no previous frame, so fp=0
@ copy U-Boot to RAM
ldr r0, =TEXT_BASE
mov r1, #0x0
mov r2, #0x30000
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read
bad_nand_read:
loop2: b loop2 @ infinite loop
ok_nand_read:
ldr r0, =pbootflag
mov r1, #0x0
str r1, [r0]
@ verify
mov r0, #0
ldr r1, =TEXT_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq stack_setup
bne go_next
notmatch:
loop3: b loop3 @ infinite loop
#endif @ CONFIG_S3C2410_NAND_BOOT
在_start_armboot: .word start_armboot下添加如下代码:
.align 2
DW_STACK_START: .word STACK_BASE + STACK_SIZE - 4
4、添加nand_read.c为nand启动做支持
在board/samsung/fs2410下添加文件nand_read.c并在这个文件中添加如下内容:
#include <config.h>
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
# if defined(CONFIG_S3C2410)
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
#define BUSY 1
#define NAND_SECTOR_SIZE 512
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE – 1)
inline void wait_idle(void) {
int i;
while(!(NFSTAT & BUSY))
for(i=0; i<10; i++);
}
/* low level nand read function */
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) {
int i, j;
if ((start_addr & NAND_BLOCK_MASK) || (size &
NAND_BLOCK_MASK)) {
return -1; /* invalid alignment */
}
/* chip Enable */
NFCONF &= ~0x800;
for(i=0; i<10; i++);
for(i=start_addr; i < (start_addr + size);) {
/* READ0 */
NFCMD = 0;
/* Write Address */
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
wait_idle();
for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {
*buf = (NFDATA & 0xff);
buf++;
}
}
/* chip Disable */
NFCONF |= 0x800; /* chip disable */
return 0;
}
# endif
并修改board/Samsung/fs2410/ 下Makefile
修改
COBJS := fs2410.o flash.o
为:
COBJS := fs2410.o flash.o nand_read.o
5、修改board/samsung/fs2410/flash.c支持sst19lv1601 nor flash芯片
修改
#define MAIN_SECT_SIZE 0x10000 /*64KB*/
为:
#define MAIN_SECT_SIZE 0x1000 /*4KB for sst39lv1601*/
修改
#define CMD_UNLOCK_BYPASS 0x00000020

#define CMD_UNLOCK_BYPASS 0x000000A0
修改
#define MEM_FLASH_ADDR1 (*(volatile u16
*)(CONFIG_SYS_FLASH_BASE + (0x00000555 << 1)))
#define MEM_FLASH_ADDR2 (*(volatile u16
*)(CONFIG_SYS_FLASH_BASE + (0x000002AA << 1)))

#define MEM_FLASH_ADDR1 (*(volatile u16
*)(CONFIG_SYS_FLASH_BASE + (0x00005555 << 1)))
#define MEM_FLASH_ADDR2 (*(volatile u16
*)(CONFIG_SYS_FLASH_BASE + (0x00002AAA << 1)))

#elif defined(CONFIG_AMD_LV800)
(AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV800B & FLASH_TYPEMASK); 下添加
#elif defined(CONFIG_SST_39VF1601)
(SST_MANUFACT & FLASH_VENDMASK) | (SST_ID_xF1601 & FLASH_TYPEMASK);
修改
for (j = 0; j < flash_info[i].sector_count; j++) {
if (j <= 3) {
/* 1st one is 16 KB */
if (j == 0) {
flash_info[i].start[j] = flashbase + 0;
}
/* 2nd and 3rd are both 8 KB */
if ((j == 1) || (j == 2)) {
flash_info[i].start[j] =
flashbase + 0x4000 + (j -1) * 0x2000;
}
/* 4th 32 KB */
if (j == 3) {
flash_info[i].start[j] =
flashbase + 0x8000;
}
} else {
flash_info[i].start[j] =
flashbase + (j - 3)*MAIN_SECT_SIZE; }
}

for (j = 0; j < flash_info[i].sector_count; j++) {
flash_info[i].start[j] =
flashbase + j*MAIN_SECT_SIZE;
}

case (AMD_MANUFACT & FLASH_VENDMASK):
printf ("AMD: ");
break;
下添加
case (SST_MANUFACT & FLASH_VENDMASK):
printf ("SST: ");
break;

case (AMD_ID_LV800B & FLASH_TYPEMASK):
printf ("1x Amd29LV800BB (8Mbit)\n");
break;
下添加
case ( SST_ID_xF1601 & FLASH_TYPEMASK):
printf ("1x 39VF1601\n");
break;
修改
if ((info->flash_id & FLASH_VENDMASK) !=
(AMD_MANUFACT & FLASH_VENDMASK)) {
return ERR_UNKNOWN_FLASH_VENDOR;
}

if ((info->flash_id & FLASH_VENDMASK) !=
(SST_MANUFACT & FLASH_VENDMASK)) {
return ERR_UNKNOWN_FLASH_VENDOR;
}
注释掉下面语句
if (!chip
&& (result & 0xFFFF) & BIT_PROGRAM_ERROR)
chip = ERR;
注释掉
*addr = CMD_PROGRAM;
6、修改common/env_flash.c,为nor flash保存环境变量做准备
修改
char * env_name_spec = "Flash";

char * nor_env_name_spec = "Flash";
修改
env_t *env_ptr = (env_t *)(&environment[0]);

extern env_t *env_ptr = (env_t *)(&environment[0]);
修改
env_t *env_ptr = (env_t *)CONFIG_ENV_ADDR;
extern env_t *env_ptr ;
添加
extern uchar env_get_char_spec (int index);
并注释掉下面语句
uchar env_get_char_spec (int index)
{
return ( *((uchar *)(gd->env_addr + index)) );
}
修改
int env_init(void)

int nor_env_init(void)
修改
int saveenv(void)

int nor_saveenv(void)
修改
void env_relocate_spec (void)

void nor_env_relocate_spec (void)
7、修改common/env_nand.c添加nor flash环境变量烧写功能
添加
volatile int pbootflag=1; //add by lht 1->nor 0->nand
extern int nor_env_init(void);
修改int env_init(void)函数在函数开始添加如下内容:
if(pbootflag==1) //by lht
{
env_name_spec = "NOR";
env_ptr=(env_t *)CONFIG_ENV_ADDR;
return nor_env_init();
}
修改int saveenv(void)函数,在函数开始添加如下内容
if(pbootflag==1)
{
env_name_spec = "NOR";
return nor_saveenv();
}
修改void env_relocate_spec (void)函数,在函数开始添加如下内容
if(pbootflag==1)
{
return nor_env_relocate_spec();
}
8、修改SDRAM刷新周期:board/samsung/fs2410/lowlevel_init.S
#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
改成:
#define REFCNT 1268 /* period=7.8125us, HCLK=100Mhz, (2048+1-
7.8125*100) */
9、链接文件的修改
修改cpu/arm920t/u-boot.lds:

cpu/arm920t/start.o (.text)
下添加
board/samsung/fs2410/lowlevel_init.o (.text)
board/samsung/fs2410/nand_read.o (.text)
10、go命令的优化
修改该common/cmd_boot.c
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulong addr, rc;
int rcode = 0;
/****add by farsight 2010-8-18**************************************/ char *commandline = getenv("bootargs");
struct param_struct *lht_params=(struct param_struct *)0x30000100;
printf("setup linux parameters at 0x30000100\n");
memset(lht_params,0,sizeof(struct param_struct));
lht_params->u1.s.page_size=4096;
lht_params->u1.s.nr_pages=0x4000000>>12;
memcpy(lht_params->commandline,commandline,strlen(commandline)+1); printf("linux command line is: \"%s\"\n",commandline);
/***************************************************************/
if (argc < 2) {
cmd_usage(cmdtp);
return 1;
}
addr = simple_strtoul(argv[1], NULL, 16);
printf ("## Starting application at 0x%08lX ...\n", addr);
/*
* pass address parameter as argv[0] (aka command name),
* and all remaining args
*/
/*********************add by farsight 2010-8-18*********************/
__asm__(
"mov r1, #193\n"
"mov ip, #0\n"
"mcr p15, 0, ip, c13, c0, 0\n" /* zero PID */
"mcr p15, 0, ip, c7, c7, 0\n" /* invalidate I,D caches */
"mcr p15, 0, ip, c7, c10, 4\n" /* drain write buffer */
"mcr p15, 0, ip, c8, c7, 0\n" /* invalidate I,D TLBs */
"mrc p15, 0, ip, c1, c0, 0\n" /* get control register */
"bic ip, ip, #0x0001\n" /* disable MMU */
"mov pc, %0\n"
"nop\n"
:
:"r"(addr)
);
/***************************************************************/
rc = do_go_exec ((void *)addr, argc - 1, argv + 1);
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lX\n", rc);
return rcode;
}
3、重新编译
$ make distclean
$ make fs2410_config
$ make
这个时候我们就可以获得一个我们能够使用的u-boot了
实验四 linux-2.6.22.6内核的编译和配置
【实验目的】
了解内核的编译过程及配置选项的内容
【实验环境】
1、Ubuntu 10.10发行版
2、u-boot-2010.03
3、FS2410平台
4、交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2
【实验步骤】
1、将实验代码中的rootfs.tar.bz2解压到/source下
$ tar xvf rootfs.tar.bz2 –C /source
2、解压内核并进入内核目录
$ tar xvf linux-2.6.22.6.farsight.tar.bz2
$ cd linux-2.6.22.6
3、修改Makefile
修改内核源码目录下的Makefile
修改
ARCH =
CROSS_COMPILE =

ARCH = arm
CROSS_COMPILE = arm-none-linux-gnueabi-
4、配置内核
make menuconfig
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL)
5、添加驱动文件
将实验代码2410GPIO_TEST_26/2410GPIO_TEST_drv.c拷贝到drivers/char下
6、修改对应Kconfig
修改drivers/char/Kconfig
在menu "Character devices"下面
加入如下内容:
config 2410GPIO_TEST_DRV
tristate "S3C2410 test drv Device Support"
depends on ARCH_S3C2410
---help---
support led test device driver on FS2410 develop board
7、修改对应Makefile
在drivers/char/Makefile 中
找到在 obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o ,在其下一行添加:
obj-$(CONFIG_2410GPIO_TEST_DRV) += 2410GPIO_TEST_drv.o
8、动态编译内核
配置内核时按“空格”选择,配置完成后保存退出
$ make menuconfig
Device Drivers --->
Character devices --->
<M> S3C2410 test drv Device Support
重新编译内核并把内核拷贝到tftpboot下,并把驱动模块拷贝到/source/rootfs下
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
$ cp drivers/char/2410GPIO_TEST_drv.ko /source/rootfs
编译应用程序并将它拷贝到/source/rootfs/bin下
$ arm-none-linux-gnueabi-gcc –o 2410GPIO_TEST_APP 2410GPIO_TEST_APP.c
$ cp 2410GPIO_TEST_APP /source/rootfs/bin
设置u-boot环境变量
# setenv serverip 192.168.1.2
# setenv ipaddr 192.168.1.3
# setenv bootcmd tftp 33000000 zImage\;go 33000000
# setenv bootargs root=nfs nfsroot=192.168.1.2:/source/rootfs console=ttySAC0,115200 init=/linuxrc ip=192.168.1.3
# savenv
重新启动系统
创建设备节点
# mknod /dev/GPIO_TEST c 252 0
运行2410GPIO_TEST_APP并查看开发板LED状态# 2410GPIO_TEST_APP
9、静态编译内核
配置内核时按“空格”选择,配置完成后保存退出$ make menuconfig
Device Drivers --->
Character devices --->
<*> S3C2410 test drv Device Support
重新编译内核并把内核拷贝到tftpboot下
$ make zImage
$ cp arch/arm/boot/zImage /tftpboot
重新启动系统
创建设备节点
# mknod /dev/GPIO_TEST c 252 0
运行2410GPIO_TEST_APP并查看开发板LED状态# 2410GPIO_TEST_APP
实验五 linux-2.6.35内核移植—网卡驱动的添加
【实验目的】
本实验通过在上个实验结果的linux2.6.22.6内核上移植CS89900A网卡驱动,使其可以通过网络nfs的方式挂载在ubantu主机环境上的文件系统,从而实现linux系统的完全启动。

【实验环境】
1、Ubuntu 10.10发行版
2、u-boot-2010.03
3、FS2410平台
4、交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2
【实验步骤】
linux-2.6.35内核中有cs8900的驱动,但是这个驱动需要我们修改,这也是第一种支持我们的网卡的方法.另外我们可以移植一个可以使用的cs8900网卡驱动到我们的内核中.这里我们使用第二种方法
1、解压内核
$ tar xvf linux.2.6.35.tar.bz2
$ cd linux-2.6.35
2、修改顶层Makefile
修改
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=

ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
3、拷贝配置文件
$ cp arch/arm/configs/s3c2410_defconfig .config
4、将cs8900.c和cs8900.h两个文件拷贝到linux-2.6.35/drivers/net/arm/下
5、修改Kconfig添加cs8900内核配置项
修改linux-2.6.35/drivers/net/arm/Kconfig添加如下内容:
config S3C2410_CS8900
tristate “CS8900 support”
depends on NET_ETHERNET && ARM && ARCH_SMDK2410
---help---
support for cs8900 chipset base Ethernet cards, if you have a network card of this type.
6、修改Makefile添加内核编译配置
修改driver/net/arm/Makefile添加如下内容:
obj-$(CONFIG_S3C2410_CS8900) += cs8900.o
7、添加地址映射定义
修改arch/arm/mach-s3c2410/include/mach/map. h文件,添加如下内容:
/* CS8900a */
#define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000)
#define vSMDK2410_ETH_IO 0xE0000000
#define SMDK2410_ETH_IRQ IRQ_EINT9
8、添加平台代码
修改arch/arm/mach-s3c2410/mach-smdk2410.c文件,添加如下内容:
static struct map_desc smdk2410_iodesc[] __initdata = {
/* nothing here yet */
{vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE} //添加内容};
9、配置内核,使之支持cs8900网卡
$ make menuconfig
Kernel Features ---> //使用EABI工具链这两项是必须选择的
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL) (NEW) Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> CS8900a support
10、重新编译内核
$ make zImage
11、拷贝zImage到tftpboot目录下并重新启动开发板
$ cp arch/arm/boot/zImage /tftpboot
实验六 linux-2.6.35内核移植—Nand flash驱动的添加【实验目的】
本实验通过在上个实验的基础上做Nand flash的移植,Nand flash在s3c2410的默认配置中是已经选上的,只是他的分区需要根据我们的实际情况来配置。

从而进一步完善系统的结果,并掌握Nand flash的移植方法
【实验环境】
1、Ubuntu 10.10发行版
2、u-boot-2010.03
3、FS2410平台
4、交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2
【实验步骤】
在linux-2.6.35.2的内核中已经包含了s3c2410的nand flash控制器的驱动,但是需要我们正确配置后才能正常工作。

1、修改分区信息,建立分区表
在arch/arm/plat-s3c24xx/common-smdk.c中有nand flash的分区信息如下,我们需要在这个基础上进行修改。

修改后为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader u-boot-2010.03",
.size = SZ_1M,
.offset = 0,
},
[1] = {
.name = "kernel linux-2.6.35",
.offset = SZ_1M,
.size = SZ_4M,
},
[2] = {
.name = "rootfs busybox-1.17.3",
.offset = SZ_1M * 5,
.size = SZ_8M,
},
[3] = {
.name = "usrfs",
.offset = SZ_1M * 13,
.size = SZ_1M * 51,
},
};
2、配置内核
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
<*> NAND Device Support --->
<*> NAND Flash support for Samsung S3C SoCs
这些选项在这个内核里已经选上了,这里列出来让大家知道添加flash驱动涉及到的内容!
3、编译内核
$ make zImage
4、拷贝内核镜像到tftpboot下并重新启动开发板
$ cp arch/arm/boot/zImage /tftpboot
5、启动系统,查看系统信息
# cat /proc/mtd
dev: size erasesize name
mtd0: 00100000 00004000 "bootloader u-boot-2010.03"
mtd1: 00400000 00004000 "kernel linux-2.5.35"
mtd2: 00800000 00004000 "rootfs buysbox-1.17.3"
mtd3: 03300000 00004000 "usrfs"
实验七 linux-2.6.35内核移植—LCD驱动的添加
【实验目的】
在嵌入式系统中经常使用LCD进行交互,这里我们通过修改平台代码使我们的内核支持LCD,完成相应功能!
【实验环境】
1、Ubuntu 10.10发行版
2、u-boot-2010.03
3、FS2410平台
4、交叉编译器 arm-none-linux-gnueabi-gcc-4.3.2
【实验步骤】
s3c2410 LCD的驱动内核中已经存在,我们需要完成的工作就只使这个驱动能够正常的工作,这需要我们修改平台代码
1、头文件的添加
在arch/arm/mach-s3c2410/mach-smdk2410.c中添加头文件
#include <mach/fb.h>
#include <mach/regs-lcd.h>
2、添加相应LCD相关平台信息
在arch/arm/mach-s3c2410/mach-smdk2410.c中添加如下内容:
static struct s3c2410fb_display s3c2410_lcd_cfg[] __initdata = {
{
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVCLK |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
.type = S3C2410_LCDCON1_TFT,
.width = 320,
.height = 240,
.pixclock = 100000, /* HCLK/10 */
.xres = 320,
.yres = 240,
.bpp = 16,
.left_margin = 13,
.right_margin = 8,
.hsync_len = 4,
.upper_margin = 2,
.lower_margin = 7,
.vsync_len = 4,
},
};
static struct s3c2410fb_mach_info s3c2410_fb_info __initdata = {
.displays = s3c2410_lcd_cfg,
.num_displays = ARRAY_SIZE(s3c2410_lcd_cfg),
.default_display = 0,
.lpcsel = ((0xCE6) & ~7) | 1<<4,
};
在函数smdk2410_init中添加如下内容
s3c24xx_fb_set_platdata(&s3c2410_fb_info);
3、配置内核
Device Drivers --->
Graphics support --->
<*> Support for frame buffer devices --->
<*> S3C2410 LCD framebuffer support
[*] Bootup logo --->
这些选项在这个内核多数已经选上了,这里列出来让大家知道添加LCD驱动涉及到的内容!
4、编译内核
$ make zImage
5、拷贝内核镜像到tftpboot下
$ cp arch/arm/boot/zImge /tftpboot
6、插上LCD启动系统
启动系统后发现LCD上有一个可爱的企鹅LOGO,这就是我们Linux的吉祥物。

相关文档
最新文档