加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

u-boot-2009.08在2440上的移植

发布时间:2020-12-15 06:30:22 所属栏目:百科 来源:网络整理
导读:常用命令: 先 ? ? ? ? #: 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-bo

常用命令:
先 ? ? ? ?#: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;

? ? ? ??NFADDR = (page >> 8) & 0xff;

? ? ? ??NFADDR = (page >> 16) & 0xff;

}?

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的分区信息


可以复制文字代码

static struct mtd_partition mini2440_default_nand_part[]={
? ? [0]={
.name = "U-boot",
.size = 0x00040000,0); font-family:Arial; font-size:16px">.offset = 0,0); font-family:Arial; font-size:16px">? ? },0); font-family:Arial; font-size:16px">? ? [1]={
.name = "param",0); font-family:Arial; font-size:16px">.size = 0x00020000,0); font-family:Arial; font-size:16px">.offset = 0x00040000,0); font-family:Arial; font-size:16px">? ? [2]={
.name = "Kernel",0); font-family:Arial; font-size:16px">.size = 0x00500000,0); font-family:Arial; font-size:16px">.offset = 0x00060000,0); font-family:Arial; font-size:16px">? ? [3]={
.name = "root",0); font-family:Arial; font-size:16px">.size = 1024*1024*1024,0); font-family:Arial; font-size:16px">.offset = 0x00560000,0); font-family:Arial; font-size:16px">? ? [4]={
.name = "nand",0); font-family:Arial; font-size:16px">.offset = 0x00000000,0); font-family:Arial; font-size:16px">? ? }
;

还需要添加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填写,大部分情况下按照以下参数填写即可?

struct?s3c2410_platform_nand mini2440_nand_info?.tacls????????=?20.twrph0????????=?60.twrph1????????.nr_sets????(mini2440_nand_sets.sets????????=?mini2440_nand_sets.ignore_unset_ecc?;

还需要把 nand flash 设备注册到系统中,

struct?platform_device?*mini2440_devices]?__initdata?{
? ??............................
????&s3c_device_iis????&s3c_device_nand,//把nand flash设备添加到开发板的设备列表结构?
;

在mini2440_machine_init函数中添加平台的数据信息。
void?__init mini2440_machine_init(void)
{
? ? ...........................
????s3c_device_nand.dev.platform_data = &mini2440_nand_info; //添加
????platform_add_devices(mini2440_devices?ARRAY_SIZE;
}

不过还要在该文件中添加几个头文件才能编译成功:
/*添加下面的四个文件*/
#include?<linux/mtd.h>
/nand/nand_ecc/partitions>

#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的大小,下载过程中可找到











(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
    站长推荐
    热点阅读