原创 【原】pxa270 u-boot-1.3.3移植记录

2009-10-8 09:49 4577 3 3 分类: MCU/ 嵌入式


将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镜象。



 


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /1 下一条