u-boot-2009.08在2440上的移植
来源:互联网 发布:stc15单片机最小系统 编辑:程序博客网 时间:2024/06/08 10:19
常用命令:
先 #:make clean
再 #:make my2440_config
最后 #:make 生成。bin文件
一、移植环境
- 主 机: VMWare8.0--Fedora 5
- 开发板:Mini2440--256MB Nand,Kernel:2.6.30.4
- 编译器:arm-linux-gcc-4.3.2.tgz
- u-boot: u-boot-2009.08.tar.bz2
二、移植步骤
本次移植的功能特点包括:
- 支持Nand Flash读写
- 支持从Nor/Nand Flash启动
- 支持CS8900或者DM9000网卡
- 支持Yaffs文件系统
- 支持USB下载(还未实现)
1、首先安装编译器:arm-linux-gcc-4.3.2.tgz
1.将arm-linux-gcc-4.3.2.tgz解压到根目录下,使用如下命令
[root@localhost ~]# tar xvzf arm-linux-gcc-4.3.2.tgz -C / 2.执行命令:vi/etc/profile 在path murge的语句断后添加
pathmurge/usr/local/arm/4.3.2/bin;
修改:
if [ "$EUID" = "0" ]; then
pathmunge /sbin
pathmunge /usr/sbin
pathmunge /usr/local/sbin
pathmunge /usr/local/arm/4.3.2/bin (添加此行)
fi
3.执行:
# source /etc/profile
(一) 参照其“嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(一)”
然后转到
http://blog.chinaunix.net/space.php?uid=22174347
(二) 参照其“嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(二)”
移植u-boot 到NOR flash
(三) 当进行“嵌入式Linux之我行——u-boot-2009.08在2440上的移植详解(三)”时需要注意的地方
(1) 由于原作者使用的flash是64M,而我所使用的是256M,因此要修改nand_read_ll 函数(修改寻址部分):
要修改代码如下:
#include <config.h>
#define NF_BASE 0x4E000000
#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCONT __REGi(NF_BASE + 0x4)
#define NFCMD __REGb(NF_BASE + 0x8)
#define NFADDR __REGb(NF_BASE + 0xC)
#define NFDATA __REGb(NF_BASE + 0x10)
#define NFSTAT __REGb(NF_BASE + 0x20)
#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1))
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1))
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}
#define NAND_SECTOR_SIZE 2048// 注意这个地方原来是512,需要改成2048即2K的页
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
static void s3c2440_write_addr_lp(unsigned int addr)
{
int i, col, page;
col = addr & NAND_BLOCK_MASK;
page = addr / NAND_SECTOR_SIZE;
NFADDR = col & 0xff;
for (i = 0; i < 10; i ++);
NFADDR = (col >> 8) & 0x0f;
NFADDR = page & 0xff;
for (i = 0; i < 10; i ++);
NFADDR = (page >> 8) & 0xff;
for (i = 0; i < 10; i ++);
NFADDR = (page >> 16) & 0xff;
for (i = 0; i < 10; i ++);
}
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;
}
NAND_CHIP_ENABLE;
for(i = start_addr; i < (start_addr + size);)
{
NAND_CLEAR_RB;
NFCMD = 0x00;
s3c2440_write_addr_lp(i);
NFCMD = 0x30;
//注释掉下面的内容
/*NFADDR = i & 0xFF;
NFADDR = (i >> 9) & 0xFF;
NFADDR = (i >> 17) & 0xFF;
NFADDR = (i >> 25) & 0xFF;*/
NAND_DETECT_RB;
for(j = 0; j < NAND_SECTOR_SIZE; j++, i++)
{
*buf = (NFDATA & 0xFF);
buf ++;
}
}
NAND_CHIP_DISABLE;
return 0;
}
(2) 现在进入u-boot的第二阶段(添加Nand Flash(K9F1208U0C)的有关操作支持)。中
vim include/configs/my2440.h
因为我们的是256M
所以这样设置:
/* Command line configuration. */
#define CONFIG_CMD_NAND
#define CONFIG_CMDLINE_EDITING
#ifdef CONFIG_CMDLINE_EDITING
#undef CONFIG_AUTO_COMPLETE
#else
#define CONFIG_AUTO_COMPLETE
#endif
/* NAND flash settings */
#if defined(CONFIG_CMD_NAND)
#define CONFIG_SYS_NAND_BASE 0x4E000000 //Nand配置寄存器基地址
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#define NAND_SAMSUNG_LP_OPTIONS 1 //注意:如是64M的Nand Flash,所以不用,如果是128M的大块Nand Flash,则需加上
#endif
然后:
#vim include/configs/my2440.h
//注释掉环境变量保存到Flash的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则要恢复这些Flash宏定义)
//#define CONFIG_ENV_IS_IN_FLASH 1
//#define CONFIG_ENV_SIZE 0x10000 /* Total Size of Environment Sector */
//添加环境变量保存到Nand的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则不要这些Nand宏定义)
#define CONFIG_ENV_IS_IN_NAND 1
#define CONFIG_ENV_OFFSET 0x40000 //将环境变量保存到nand中的0x40000(128k的整数)位置必须在块的起始位置//0x30000(16K的整数)无法写
#define CONFIG_ENV_SIZE 0x20000 /* 128k(block(128)的整数)*///否则报warning
注意:
如果你用的是交叉网线直连2440开发板,在确定U-boot的DM9000网卡驱动移植没问题的情况下,可以通过window下的终端ping通XP和虚拟机Linux,但就是无法
tftp 0x31000000 filename //filename代表你要通过tftp下载的文件名,即在/tftpboot文件夹下的文件名
有一种情况就说明你机器的网卡不支持这样与2440开发板连接,我的机器就出现了这个问题,但当我换作用交换机连接XP、虚拟机Linux与2440开发板时就可以tftp了。
(3) Linux-2.6.30.4在Mini2440上的内核移植
1.准备工作目录和解压内核源码
2. 进入内核根目录修改Makefile使之编译成ARM平台
#cd linux-2.6.30.4#vim Makefile
3. 机器码的确认:
U-Boot和Linux中都有一个机器码,只有当这两个机器码一致的时候,才能够正确的引导Linux内核。u-boot- 2009.08/include/asm-arm/mach-types.h文件中的1985行附近的位置
#define MACH_TYPE_MINI2440 1999
linux-2.6.32.2/arch/arm/tools/mach-typs文件中的1989行附近的位置mini2440 MACH_MINI2440 MINI2440 1999
4. #vim u-boot/board/samsung/my2440/my2440.c
把gd->bd->bi_arch_number = MACH_TYPE_SMDK2410改为MACH_TYPE_MINI2440
5. Linux 2.6.32.2根目录下,
#vim Makefile
1)修改总目录下的Makefile
ARCH =arm
CROSS_COMPILE =arm-linux- (后面都不要有空格)
3) linux-2.6.32.2/arch/arm/mach-s3c2440 目录下有个mach-mini2440.c 文件,把它直接删除。将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c 复制一份。命名为mach-mini2440.c , 找到MACHINE_START(S3C2440, "SMDK2440"), 修改为MACHINE_START(MINI2440, "My Mini2440")
4) 在 mach-mini2440.c( 就是我们刚刚通过复制mach-smdk2440.c 得到的)的第160 行
smdk2440_map_io(void)函数中,把其中的16934400改为mini2440 开发板上实际使用的12000000
5) 命令行模式下%s/smdk2440/mini2440/g (mach-mini2440.c 下)
6)arch/arm/mach-s3c2440/mach-mini2440.c文件中添加NandFlash的分区信息
可以复制文字代码
[0]={
.name = "U-boot",
.size = 0x00040000,
.offset = 0,
},
[1]={
.name = "param",
.size = 0x00020000,
.offset = 0x00040000,
},
[2]={
.name = "Kernel",
.size = 0x00500000,
.offset = 0x00060000,
},
[3]={
.name = "root",
.size = 1024*1024*1024,
.offset = 0x00560000,
},
[4]={
.name = "nand",
.size = 1024*1024*1024,
.offset = 0x00000000,
}
;还需要添加NandFlash的设置表。
//这里是开发板的nand flash 设置表,因为板子上只有一片,因此也就只有一个表
static struct s3c2410_nand_set mini2440_nand_sets[] = {
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
.partitions = mini2440_default_nand_part,
},
};
//这里是nand flash本身的一些特性,一般需要对照datasheet填写,大部分情况下按照以下参数填写即可
static struct s3c2410_platform_nand mini2440_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
};
static struct platform_device *mini2440_devices[] __initdata = {
............................
&s3c_device_iis,
&s3c_device_nand,//把nand flash设备添加到开发板的设备列表结构
};
static void __init mini2440_machine_init(void)
{
...........................
s3c_device_nand.dev.platform_data = &mini2440_nand_info; //添加
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
}
/*添加下面的四个文件*/
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h> //添加
7) yaffs2启动系统 #make menuconfig
设置boot option -> default commond line -"noinit root=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
8) 给内核打上yaffs补丁
9) 在 Linux 源代码根目录下执行
#make mini2440_defconfig ;使用Linux 官方自带的mini2440 配置
#make zImage
10) 进入到kernel/arch/arm/boot目录下,生成并将uImage.img拷贝到/tftp目录下
mkimage -n 'linux-2.6.32.2' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000-d zImage uImage.img
11) 将uboot烧写到nand flash里(通过H-Jtag)
12) nand flash 启动后输入
#set bootcmd 'nand read 0x31000000 0x60000 0x500000;bootm 0x31000000'
#set bootargs 'noinit root=/dev/mtdblock3 init=/linuxrc console=ttySAC0'
#saveenv
#tftp 0x30000000 uImage.img
#nand erase 0x60000 0x500000 //擦除nand的0x60000开始大小为0x500000的内容
#nand write 0x30000000 0x60000 0x500000 //将内存0x30000000处的内容写入到nand的0x60000处
#tftp 0x30000000 root.bin
#nand erase 0x560000 0xffaa0000//256M - 0x560000
#nand write.yaffs2 0x30000000 0x560000 0x60be80//0x60be80是root.bin的大小,下载过程中可找到
- u-boot在2440上的移植
- u-boot-2009.08在2440上的移植详解
- u-boot-2009.08在2440上的移植详解1
- u-boot-2009.08在2440上的移植详解 2
- u-boot-2009.08在2440上的移植详解3
- u-boot-2009.08在2440上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- U-boot在SBC2410上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- U-Boot在S3C2410上的移植
- u-boot 在s3c2443上的移植
- U-Boot在S3C2410上的移植
- u-boot 在s3c6400上的移植
- U-Boot在S3C2410上的移植
- u-boot在s3c44b0 上的移植
- Linux------ 实现磁盘配额
- php 获取 POST JSON 数据
- 机械设计制造及其自动化-本科课程
- dos命令
- mysql数据库在Linux操作系统上的安装及容易出现的问题
- u-boot-2009.08在2440上的移植
- 仿写Android屏幕解锁小应用
- android程序 点击两次返回键程序退出
- Linux 入门时必学60文件处理个命令
- autoconf
- Embed到程序中的swf文件如何获取MovieClip对象
- 相机 android java.lang.RuntimeException: setParameters failed
- 软件工程-本科课程
- linux 挂载