将u-boot-1.3.3.tar.bz2解压,得到文件夹u-boot-1.3.3
================================================================
第 1 阶段
================================================================
1)、在u-boot-1.3.3/board下找个与pxa270相似的开发板,这里以adsvix为例。
2)、将u-boot-1.3.3/board/adsvix目录复制到当前目录下,并改名为edukit270。
3)、把adsvix.c改名为edukit270.c,修改Makefile中的 COBJS := edukit270.o pcmcia.o,保存。
4)、将u-boot-1.3.3/include/configs/adsvix.h,复制到当前目录,并改名为edukit270.h。
5)、修改u-boot-1.3.3/Makefile的内容
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/crosstool/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-(交叉编译工具安装目录)
6)、在u-boot-1.3.3/Makefile中添加
edukit270_config: unconfig
@$(MKCONFIG) $(@:_config=) arm pxa edukit270
7)、打开超级终端,切换到u-boot-1.3.3目录,敲入命令
# make edukit270_config
Configuring for edukit270 board...
8)、之后就可以# make了。
make之后发现有错误
/root/Desktop/linux270/SRC/u-boot-1.3.3/common/cmd_ide.c:824: undefined reference to `outb'
common/libcommon.a(cmd_ide.o): In function `__ide_inb':
/root/Desktop/linux270/SRC/u-boot-1.3.3/common/cmd_ide.c:833: undefined reference to `inb'
8)、修改u-boot-1.3.3/include/configs/edukit270.h中的
//#define CONFIG_CMD_IDE(将这个命令注释掉保存),#make distclean,#make edukit270_config,#make 即可通过。
================================================================
第 2阶段 串口
================================================================
1)、将u-boot-1.3.3/include/configs/edukit270.h中的
#define CONFIG_BAUDRATE 38400
改为:
#define CONFIG_BAUDRATE 115200 // modifyed by xionggang
2)、这时串口还不能用,由于对GPIO的配置不适合该开发板,可参考数据手册(edukit4 的WinCE6.0的eboot应该也行吧),需要修改对GPIO的配置,将u-boot-1.3.3/include/configs/edukit270.h中的
/*
* GPIO settings
*/
#define CFG_GPSR0_VAL 0x00018004
#define CFG_GPSR1_VAL 0x004F0080
#define CFG_GPSR2_VAL 0x13EFC000
#define CFG_GPSR3_VAL 0x0006E032
#define CFG_GPCR0_VAL 0x084AFE1A
#define CFG_GPCR1_VAL 0x003003F2
#define CFG_GPCR2_VAL 0x0C014000
#define CFG_GPCR3_VAL 0x00000C00
#define CFG_GPDR0_VAL 0xCBC3BFFC
#define CFG_GPDR1_VAL 0x00FFABF3
#define CFG_GPDR2_VAL 0x1EEFFC00
#define CFG_GPDR3_VAL 0x0187EC32
#define CFG_GAFR0_L_VAL 0x84400000
#define CFG_GAFR0_U_VAL 0xA51A8010
#define CFG_GAFR1_L_VAL 0x699A955A
#define CFG_GAFR1_U_VAL 0x0005A0AA
#define CFG_GAFR2_L_VAL 0x40000000
#define CFG_GAFR2_U_VAL 0x0109A400
#define CFG_GAFR3_L_VAL 0x54000000
#define CFG_GAFR3_U_VAL 0x00001409
修改为:
/*
* GPIO settings,modyfied by xionggang,refered to edukit4 wince6's eboot
*/
#define CFG_GPSR0_VAL 0x00709C04 /* 0x40E00018 */
#define CFG_GPSR1_VAL 0x00CF0002 /* 0x40E0001C */
#define CFG_GPSR2_VAL 0x0021C000 /* 0x40E00020 */
#define CFG_GPSR3_VAL 0x00020000 /* 0x40E00118 */
#define CFG_GPCR0_VAL 0xC0040000 /* 0x40E00024 */
#define CFG_GPCR1_VAL 0x00000380 /* 0x40E00028 */
#define CFG_GPCR2_VAL 0x00000000 /* 0x40E0002C */
#define CFG_GPCR3_VAL 0x00000003 /* 0x40E00124 */
#define CFG_GPDR0_VAL 0xC0709C04 /* 0x40E0000C */
#define CFG_GPDR1_VAL 0x00CF0382 /* 0x40E00010 */
#define CFG_GPDR2_VAL 0x0021C000 /* 0x40E00014 */
#define CFG_GPDR3_VAL 0x00020002 /* 0x40E0010C */
#define CFG_GAFR0_L_VAL 0x80000000 /* 0x40E00054 */
#define CFG_GAFR0_U_VAL 0x00000000 /* 0x40E00058 */
#define CFG_GAFR1_L_VAL 0x00008018 /* 0x40E0005C */
#define CFG_GAFR1_U_VAL 0x00000000 /* 0x40E00060 */
#define CFG_GAFR2_L_VAL 0x00000000 /* 0x40E00064 */
#define CFG_GAFR2_U_VAL 0x00000000 /* 0x40E00068 */
#define CFG_GAFR3_L_VAL 0x00000000 /* 0x40E0006C */
#define CFG_GAFR3_U_VAL 0x00000000 /* 0x40E0b0070 */
3)、将u-boot-1.3.3/include/configs/edukit270.h中的
/*
* Memory settings
*/
#define CFG_MSC0_VAL 0x23F2B3DB
#define CFG_MSC1_VAL 0x0000CCD1
#define CFG_MSC2_VAL 0x0000B884
#define CFG_MDCNFG_VAL 0x08000AC8
#define CFG_MDREFR_VAL 0x0000001E
#define CFG_MDMRS_VAL 0x00000000
#define CFG_FLYCNFG_VAL 0x00010001
#define CFG_SXCNFG_VAL 0x40044004
改为:
/*
* Memory settings,modifyed by xionggang, refer to edukit4 wince's eboot
*/
#define CFG_MSC0_VAL 0x23F2B8F9 /* 0x48000008 */
#define CFG_MSC1_VAL 0xA441A441 /* 0x4800000C */
#define CFG_MSC2_VAL 0x7FF07FF4 /* 0x48000010 */
#define CFG_MDCNFG_VAL 0x08000AC8 /* 0x48000000 */
#define CFG_MDREFR_VAL 0x0000001E /* 0x48000004 */
#define CFG_MDMRS_VAL 0x00000000 /* 0x48000040 */
#define CFG_FLYCNFG_VAL 0x00010001
#define CFG_SXCNFG_VAL 0x00000000 /* 0x4800001C */
4)、将u-boot-1.3.3/board/edukit270/lowlevel_init.S中的
setvoltage:
mov r10, lr
bl initPXAvoltage /* In case the board is rebooting with a */
mov lr, r10 /* low voltage raise it up to a good one. */
注释掉:
setvoltage:
@ mov r10, lr
@ bl initPXAvoltage /* In case the board is rebooting with a */
@ mov lr, r10 /* low voltage raise it up to a good one. */
将以上修改保存,重新编译,下到norflash中,重置,即可看到串口输出的信息,此时norflash已可用,可用kermit传输文件来更新自身。
注:如果要在SDRAM中运行,需要在u-boot-1.3.3/include/configs/edukit270.h中添加宏的定义:
#define CONFIG_SKIP_LOWLEVEL_INIT 1 // add by xionggang ,in order to boot in ram
如果在flash中运行时,需要去掉该宏的定义。
================================================================
第3阶段 以太网---DM9000
================================================================
1)、在u-boot-1.3.3/include/configs/edukit270.h中添加宏的定义:
#include <config_cmd_default.h>
#define CONFIG_CMD_PING // add by xionggang
并注释掉
//#undef CONFIG_CMD_NET // bt xionggang
在该文件的最后添加:
/*
* Davicom DM9000 Network Card,add by xionggang
*/
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x4000000
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE+0x100000)
#define CONFIG_DM9000_USE_16BIT 1
#define CONFIG_NET_RETRY_COUNT 10
2)、到此为止将u-boot.bin下到flash中,设置以及网相关的环境变量,就可以ping通了。生成的u-boot.bin将大于128KB,
因此环境变量保存的位置不能保存在偏移0x20000,这里改为0x30000,在当前文件中将
#define CFG_MONITOR_LEN 0x20000
改为
#define CFG_MONITOR_LEN 0x30000
3)、在当前文件中添加和修改以太网相关的环境变量
#define CONFIG_SERVERIP 192.168.1.99
改为:
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.201
#define CONFIG_SERVERIP 192.168.2.80
4)、经过修改之后,ping 可以通,但有时不能,通过tftp下载时,断断续续,问题在于
驱动里用的是dm9000x,开发板上用的是dm9000A,有所不同,如果直接用uboot自带的驱动ping不能。
需要将/root/Desktop/linux2410/SRC/u-boot-1.3.3/drivers/net/dm9000x.c的内容
/* Check packet ready or not */
DM9000_ior(DM9000_MRCMDX); /* Dummy read */
rxbyte = DM9000_inb(DM9000_DATA); /* Got most updated data */
在前面需要加两句:
/* Check packet ready or not */
DM9000_ior(DM9000_MRRH); /* The follow code is special in DM9000A */
DM9000_ior(DM9000_MRRL);
DM9000_ior(DM9000_MRCMDX); /* Dummy read */
rxbyte = DM9000_inb(DM9000_DATA); /* Got most updated data */
保存,重新编译,下载更新,即可正常使用ping和tftp了。
================================================================
第4阶段 nand flash,nand使用mtd技术。该部分直接引用xulp骗写的代码及方法。
================================================================
1)、在u-boot-1.3.3/board/edukit270目录下新建文件nand.c,内容如下:
/* add by xulp */
#include <common.h>
#if defined(CONFIG_CMD_NAND) && !defined(CFG_NAND_LEGACY)
#include <nand.h>
/* Nand Flash confige registers */
#define rGPLR0 (*(volatile unsigned *)0x40E00000)
#define rGPDR0 (*(volatile unsigned *)0x40E0000C)
#define rGPDR1 (*(volatile unsigned *)0x40E00010)
#define rGPSR0 (*(volatile unsigned *)0x40E00018)
#define rGPSR1 (*(volatile unsigned *)0x40E0001C)
#define rGPCR0 (*(volatile unsigned *)0x40E00024)
#define rGPCR1 (*(volatile unsigned *)0x40E00028)
#define rGAFR0_L (*(volatile unsigned *)0x40E00054)
#define rGAFR1_L (*(volatile unsigned *)0x40E0005C)
#define rPSSR (*(volatile unsigned *)0x40F00004)
static void k9f1208u0b_init(void)
{
rGAFR0_L &= (~(0xf<<18));
rGAFR1_L &= (~(0x3<<2));
rGAFR1_L |= ((0x1<<3));
rGPDR0 |= (0x1<<9); /* GPIO9->#CE */
rGPDR0 &= (~(0x1<<10)); /* GPIO10->R/#B */
rGPDR1 |= (0x1<<1); /* nCS5 */
// rPSSR = 0x30;
}
static void edukit_hwcontrol(struct mtd_info *mtdinfo, int cmd)
{
struct nand_chip *my_nand = mtdinfo->priv;
switch(cmd)
{
case NAND_CTL_SETCLE:
my_nand->IO_ADDR_W = (void __iomem *)Cmd_Port;
break;
case NAND_CTL_CLRCLE:
my_nand->IO_ADDR_W = (void __iomem *)Data_Port;
break;
case NAND_CTL_SETALE:
my_nand->IO_ADDR_W = (void __iomem *)Addr_Port;
break;
case NAND_CTL_CLRALE:
my_nand->IO_ADDR_W = (void __iomem *)Data_Port;
break;
case NAND_CTL_SETNCE:
rGPCR0 |= (1<<9);
break;
case NAND_CTL_CLRNCE:
rGPSR0 |= (1<<9);
break;
}
}
static int edukit_dev_ready(struct mtd_info *mtdinfo)
{
if(rGPLR0 & (0x1<<10))
return 1;
else
return 0;
}
int board_nand_init(struct nand_chip *nand)
{
k9f1208u0b_init(); /* 64M Nand Flash K9F1208U0B Initialize */
nand->hwcontrol = edukit_hwcontrol;
nand->dev_ready = edukit_dev_ready;
nand->eccmode = NAND_ECC_SOFT;
nand->options = NAND_SAMSUNG_LP_OPTIONS;
return 0;
}
#endif
保存。
2)、修改当前目录下的Makefile,在
COBJS := edukit270.o pcmcia.o
后添加nand.o
COBJS := edukit270.o pcmcia.o nand.o
保存。
3)、在u-boot-1.3.3/include/configs/edukit270.h的最后添加
/*
* Nand Flash configue,add by xionggang
*/
#define CFG_NAND_BASE 0x14800000 /* Nand Flash configue */
#define NAND_MAX_CHIPS 1
#define CFG_MAX_NAND_DEVICE 1
#define Data_Port 0x14800000 /* I/O Port Address */
#define Cmd_Port 0x14800010 /* Command Address */
#define Addr_Port 0x14800008 /* Address Address */
注意,最后一行是#endif /* __CONFIG_H */
4)、在当前文件中添加,nand 命令,如下:
#include <config_cmd_default.h>
#define CONFIG_CMD_PING // add by xionggang
#define CONFIG_CMD_NAND // add by xionggang
保存,重新编译,更新,至此,u-boot移植完成,己实现基本功能。
注:听徐工说,如果直接用引导wince的子板来引导uboot的话,可能nand不能正常使用,
原因在于使用eboot的子板nand flash标记坏块的方式不一样,不是采用标准方式。
需要在裸机下用ADS来重新标记。
此至生成的u-boot.bin大小达到160K以上,为了减小大小,可将不用的命令去掉。
在引导内核镜象时,需要修改一些参数。可在源代码中修改,也可设置环境变量。
在引导内核时,需要修改机器码,以与内核中的机器码一致,否则不能引导,这里在文件
/root/Desktop/linux270/SRC/u-boot-1.3.3/board/edukit270/edukit270.c中的
/* arch number of ADSVIX-Board */
gd->bd->bi_arch_number = 620;
修改为:
/* arch number of ADSVIX-Board */
gd->bd->bi_arch_number = 406;
这样,才可引导edukit pxa270镜象。
文章评论(0条评论)
登录后参与讨论