`
844604778
  • 浏览: 548433 次
文章分类
社区版块
存档分类
最新评论

u-boot-2012.10移植到AT91RM9200(包括NAND FLASH)

 
阅读更多

基于中嵌SRM9204

目 录

1 配置--2

1.1修改顶层Makefile(可选)--2

1.2配置--2

1.3下载、运行、测试--3

2 修改内存配置参数(根据芯片手册修改)--4

2.1 修改配置参数--4

2.2 编译--4

2.3运行测试--4

3 配置网络参数--5

3.1 配置--5

3.2 编译--5

3.3运行测试--5

4 移植NAND Flash驱动--6

4.1 原理图--6

4.2配置--6

4.2添加代码--7

4.3 编译--8

4.4 运行测试--8

5 保存环境变量到NAND Flash和添加NAND 分区信息--9

5.1 配置环境变量保存到NAND-9

5.2 配置支持NAND 分区信息--9

5.3编译--10

5.4 运行测试--10

6 支持烧写yaffs2文件系统--11

6.1配置--11

6.2修改drivers/mtd/nand/nand_util.c-11

6.3 编译、运行测试--11

7 打印CPU时钟信息并添加自己的log-11

7.1 配置--11

7.2 修改arch/arm/lib/board.c-11

7.3 修改arch/arm/cpu/arm920t/at91/cpu.c-12

7.4 编译--12

7.5运行测试--12

7 精简u-boot13

7.1注释掉include/config_cmd_default.h中一些不用的命令--13

7.2注释掉include/configs/at91rm9200ek.h中一些不用的命令--13

7.3编译--14

7.4运行测试--14

8 支持NORFlash启动--14

8.1配置:修改include/configs/at91rm9200ek.h-14

8.2编译--14

8.3烧写u-boot.bin到NOR FLASH-15

1 配置

1.1修改顶层Makefile(可选)

root@zjh:/home/work/u-boot-2012.10#vi Makefile

411 $(obj)u-boot.bin: $(obj)u-boot

412$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

413$(BOARD_SIZE_CHECK)

414cp u-boot.bin /home/tftpboot 根据自己的环境修改交叉编译器前缀

我的交叉编译器版本为4.4.3

1.2配置

root@zjh:/home/work/u-boot-2012.10#vi boards.cfg

搜索at91

60 at91rm9200ek arm arm920t at91rm9200ek atmel at91 at91rm9200ek

61 at91rm9200ek_ram arm arm920t at91rm9200ek atmel at91 at91rm9200ek:RAMBOOT

可以看到有两行,一个是基于Flash启动,一个是基于RAM启动,我们先配置成基于RAM启动,编译后使用原有的u-boot将新的u-boot下载到RAM,通过go命令运行

root@zjh:/home/work/u-boot-2012.10#make at91rm9200ek_ram_config

root@zjh:/home/work/u-boot-2012.10#make

以上两步可合成一步

root@zjh:/home/work/u-boot-2012.10#make at91rm9200ek_ram

编译成功后,将生成u-boot.bin,如果进行了1.1,则会将u-boot.bin拷贝到tftp服务器目录/home/tftpboot

1.3下载、运行、测试

首先查看u-boot链接地址

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

42 #ifdefCONFIG_RAMBOOT

43 #define CONFIG_SKIP_LOWLEVEL_INIT

44 #define CONFIG_SYS_TEXT_BASE 0x20100000

45 #else

46 #defineCONFIG_SYS_TEXT_BASE 0x10000000

47 #endif

我们配置为RAM启动,将会跳过底层初始化,这是链接地址为0x20100000

启动原有的u-boot,执行如下操作

U-Boot@zjh> tftpboot 20100000u-boot.bin

emac: Starting autonegotiation...

emac: Autonegotiation complete

emac: link up, 100Mbps full-duplex

Using emac device

TFTP from server 192.168.1.100; our IP address is 192.168.1.105

Filename 'u-boot.bin'.

Load address: 0x20100000

Loading: T ###############

done

Bytes transferred = 206924 (3284c hex)

U-Boot@zjh> go 20100000

## Starting application at 0x20100000 ...

U-Boot 2012.10 (Aug 02 2013 - 10:50:07)

DRAM: 32 MiB

WARNING: Caches not enabled

Flash: 8 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any key to stop autoboot: 0

U-Boot>

2 修改内存配置参数(根据芯片手册修改)

2.1 修改配置参数

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

83 #defineCONFIG_SYS_SDRAM_SIZE SZ_64M

09 #defineCONFIG_SYS_SDRC_CR_VAL 0x2188c159 /* set up the CONFIG_SYS_SDRAM */

2.2 编译

root@zjh:/home/work/u-boot-2012.10#make distclean && make at91rm9200ek_ram

注:最后先make distclean,再编译,否则有时可能会有问题

2.3运行测试

启动原有的u-boot,执行如下操作

U-Boot@zjh> tftpboot 20100000u-boot.bin

emac:Starting autonegotiation...

emac:Autonegotiation complete

emac: linkup, 100Mbps full-duplex

Using emacdevice

TFTP fromserver 192.168.1.100; our IP address is 192.168.1.105

Filename'u-boot.bin'.

Load address:0x20100000

Loading: T###############

done

Bytestransferred = 206924 (3284c hex)

U-Boot@zjh>go 20100000

## Startingapplication at 0x20100000 ...

U-Boot2012.10 (Aug 02 2013 - 11:24:55)

DRAM: 64 MiB

WARNING:Caches not enabled

Flash: 8 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any keyto stop autoboot: 0

U-Boot>

3 配置网络参数

3.1 配置

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

146 /*

147 * Network Driver Setting

148 */

149 #defineCONFIG_DRIVER_AT91EMAC

150 #defineCONFIG_SYS_RX_ETH_BUFFER 16

151 #defineCONFIG_RMII

152 #defineCONFIG_MII

153

154 #define CONFIG_NETMASK255.255.255.0

155 #define CONFIG_IPADDR192.168.1.105

156 #define CONFIG_SERVERIP192.168.1.100

157 #define CONFIG_ETHADDR00:0c:29:4d:e4:f4

也可以不用配置,启动u-boot后跳过命令设置

3.2 编译

root@zjh:/home/work/u-boot-2012.10#make distclean && make at91rm9200ek_ram

3.3运行测试

启动原有的u-boot,执行如下操作

U-Boot@zjh> tftpboot 20100000u-boot.bin

emac:Starting autonegotiation...

emac:Autonegotiation complete

emac: linkup, 100Mbps full-duplex

Using emacdevice

TFTP fromserver 192.168.1.100; our IP address is 192.168.1.105

Filename'u-boot.bin'.

Load address:0x20100000

Loading:###############

done

Bytestransferred = 207016 (328a8 hex)

U-Boot@zjh>go 20100000

## Startingapplication at 0x20100000 ...

U-Boot2012.10 (Aug 02 2013 - 11:33:02)

DRAM: 64 MiB

WARNING:Caches not enabled

Flash: 8 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any keyto stop autoboot: 0

U-Boot>ping 192.168.1.100

emac: linkup, 100Mbps full-duplex

Using emacdevice

host192.168.1.100 is alive

4 移植NANDFlash驱动

4.1 原理图


4.2配置

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

70 #define CONFIG_ATMEL_LEGACY

137 #include<config_cmd_default.h>

138

140 #defineCONFIG_CMD_DHCP

141 #defineCONFIG_CMD_FAT

142 #defineCONFIG_CMD_MII

143 #defineCONFIG_CMD_PING

144 #defineCONFIG_CMD_USB

145 #undefCONFIG_CMD_FPGA

146 #define CONFIG_CMD_NAND

148 /* NAND flash */

149 #ifdef CONFIG_CMD_NAND

150 #define CONFIG_NAND_ATMEL

151 #define CONFIG_SYS_MAX_NAND_DEVICE 1

152 #define CONFIG_SYS_NAND_BASE 0x40000000// CS3

153 #define CONFIG_SYS_NAND_DBW_8

154 #define CONFIG_SYS_NAND_MASK_ALE (1 << 22)

154 #define CONFIG_SYS_NAND_MASK_CLE (1 << 21)

155 #define CONFIG_SYS_NAND_ENABLE_PIN AT91_PIN_PC0

156 #define CONFIG_SYS_NAND_READY_PIN AT91_PIN_PC2

157 #endif

4.2添加代码

root@zjh:/home/work/u-boot-2012.10#vi drivers/mtd/nand/atmel_nand.c

34 #include <asm/arch/at91_pmc.h>

34 #include <asm/arch/at91_mc.h>

void nand_init_f(void)

{

at91_mc_t *mc = (at91_mc_t *)ATMEL_BASE_MC;

at91_pmc_t *pmc = (at91_pmc_t*)ATMEL_BASE_PMC;

u32 csa;

csa = readl(&mc->ebi.csa);

writel(csa | AT91_EBI_CSA_CS3A,&mc->ebi.csa);

writel(AT91_SMC_CSR_ACSS_STANDARD |AT91_SMC_CSR_DBW_8 | AT91_SMC_CSR_WSEN | \

AT91_SMC_CSR_NWS(5) | AT91_SMC_CSR_TDF(1)| AT91_SMC_CSR_RWSETUP(1) | \

AT91_SMC_CSR_RWHOLD(2),&mc->smc.csr[3]);

/* Enable PIOC clock */

writel(1 << ATMEL_ID_PIOC,&pmc->pcer);

at91_set_A_periph(AT91_PIN_PC1, 0); /* SMOE */

at91_set_A_periph(AT91_PIN_PC3, 0); /* SMWE */

at91_set_gpio_output(CONFIG_SYS_NAND_ENABLE_PIN, 1);

at91_set_gpio_input(CONFIG_SYS_NAND_READY_PIN, 0);

}

ntatmel_nand_chip_init(int devnum, ulong base_addr)

{

int ret;

struct mtd_info *mtd =&nand_info[devnum];

struct nand_chip *nand =&nand_chip[devnum];

nand_init_f();

}

static voidat91_nand_hwcontrol(struct mtd_info *mtd,

int cmd, unsigned intctrl)

{

struct nand_chip *this = mtd->priv;

if (ctrl& NAND_CLE)

writeb(cmd, this->IO_ADDR_W + CONFIG_SYS_NAND_MASK_CLE);

else

writeb(cmd, this->IO_ADDR_W +CONFIG_SYS_NAND_MASK_ALE);

}

root@zjh:/home/work/u-boot-2012.10#vi drivers/mtd/nand/nand_base.c

#include<asm/arch/gpio.h>

#include<asm/arch/at91_pio.h>

static voidnand_select_chip(struct mtd_info *mtd, int chipnr)

{

switch (chipnr) {

case -1:

at91_set_gpio_value(CONFIG_SYS_NAND_ENABLE_PIN, 1);

break;

case 0:

at91_set_gpio_value(CONFIG_SYS_NAND_ENABLE_PIN, 0);

break;

default:

BUG();

}

}

4.3 编译

4.4 运行测试

启动原有的u-boot,执行如下操作

U-Boot@zjh> tftpboot 20100000u-boot.bin

emac:Starting autonegotiation...

emac:Autonegotiation complete

emac: linkup, 100Mbps full-duplex

Using emacdevice

TFTP fromserver 192.168.1.100; our IP address is 192.168.1.105

Filename'u-boot.bin'.

Load address:0x20100000

Loading: T##################

done

Bytestransferred = 250916 (3d424 hex)

U-Boot@zjh>go 20100000

## Startingapplication at 0x20100000 ...

U-Boot 2012.10(Aug 05 2013 - 15:05:34)

DRAM: 64 MiB

WARNING:Caches not enabled

Flash: 8 MiB

NAND: 128 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any keyto stop autoboot: 0

U-Boot>

5 保存环境变量到NAND Flash和添加NAND 分区信息

5.1 配置环境变量保存到NAND

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

//#define CONFIG_ENV_IS_IN_FLASH

#define CONFIG_ENV_IS_IN_NAND

#define CONFIG_ENV_OFFSET 0x0

#defineCONFIG_ENV_SIZE SZ_128K

5.2 配置支持NAND 分区信息

#define CONFIG_CMD_MTDPARTS

#define CONFIG_MTD_DEVICE

#define MTDIDS_DEFAULT "nand0=at91rm9200-0"

/* writeable partitions require their size and offset beerasesize aligned*/

#define MTDPARTS_DEFAULT "mtdparts=at91rm9200-0:128k(params),"\

"4m(kernel),"\

"-(rootfs)"

5.3编译

5.4 运行测试

启动原有的u-boot,执行如下操作

U-Boot@zjh> tftpboot 20100000u-boot.bin

……

U-Boot2012.10 (Aug 05 2013 - 15:22:35)

DRAM: 64 MiB

WARNING:Caches not enabled

Flash: 8 MiB

NAND: 128 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any keyto stop autoboot: 0

U-Boot>save

SavingEnvironment to NAND...

ErasingNand...

Erasing at0x0 -- 100% complete.

Writing toNand... done

U-Boot>mtd default

U-Boot>save

SavingEnvironment to NAND...

ErasingNand...

Erasing at0x0 -- 100% complete.

Writing toNand... done

U-Boot>mtd

device nand0<at91rm9200-0>, # parts = 3

#: name size offset mask_flags

0: params 0x00020000 0x00000000 0

1: kernel 0x00400000 0x00020000 0

2: rootfs 0x07be0000 0x00420000 0

activepartition: nand0,0 - (params) 0x00020000 @ 0x00000000

defaults:

mtdids : nand0=at91rm9200-0

mtdparts:mtdparts=at91rm9200-0:128k(params),4m(kernel),-(rootfs)

U-Boot>

6 支持烧写yaffs2文件系统

6.1配置

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

#define CONFIG_CMD_NAND_YAFFS

6.2修改drivers/mtd/nand/nand_util.c

if (!need_skip && !(flags& WITH_DROP_FFS) && !(flags &WITH_YAFFS_OOB)) {

rval= nand_write (nand, offset, length, buffer);

if(rval == 0)

return0;

*length= 0;

printf("NAND write to offset %llx failed %d\n",

offset,rval);

returnrval;

}

……

if(flags & WITH_YAFFS_OOB) {

intpage, pages;

size_tpagesize = nand->writesize;

size_tpagesize_oob = pagesize + nand->oobsize;

structmtd_oob_ops ops;

ops.len= pagesize;

ops.ooblen= nand->oobsize;

ops.mode= MTD_OOB_RAW;

ops.ooboffs = 0;

……

6.3 编译、运行测试

7 打印CPU时钟信息并添加自己的log

7.1 配置

root@zjh:/home/work/u-boot-2012.10#vi include/configs/at91rm9200ek.h

#define CONFIG_DISPLAY_CPUINFO

7.2 修改arch/arm/lib/board.c

static int display_banner(void)

{

printf("\n\n%s\n\n",version_string);

printf("----成都思晗科技有限公司-----赵建辉\n\n");

debug("U-Bootcode: %08lX -> %08lX BSS: ->%08lX\n",

_TEXT_BASE,

_bss_start_ofs + _TEXT_BASE,_bss_end_ofs + _TEXT_BASE);

#ifdef CONFIG_MODEM_SUPPORT

debug("ModemSupport enabled\n");

#endif

#ifdef CONFIG_USE_IRQ

debug("IRQStack: %08lx\n", IRQ_STACK_START);

debug("FIQStack: %08lx\n", FIQ_STACK_START);

#endif

return(0);

}

7.3 修改arch/arm/cpu/arm920t/at91/cpu.c

#ifdefined(CONFIG_DISPLAY_CPUINFO)

intprint_cpuinfo(void)

{

char buf[32];

printf("CPU: %s\n",CONFIG_SYS_ATMEL_CPU_NAME);

printf("Crystal frequency: %8sMHz\n",

strmhz(buf,get_main_clk_rate()));

printf("CPU clock : %8s MHz\n",

strmhz(buf,get_cpu_clk_rate()));

printf("Master clock : %8s MHz\n",

strmhz(buf,get_mck_clk_rate()));

return 0;

}

#endif

7.4 编译

7.5运行测试

## Startingapplication at 0x20100000 ...

U-Boot2012.10 (Aug 05 2013 - 15:54:35)

----成都思晗科技有限公司-----赵建辉

CPU: AT91RM9200

Crystal frequency:18.432 MHz

CPU clock: 179.712 MHz

Master clock: 59.904 MHz

DRAM: 64 MiB

WARNING:Caches not enabled

Flash: 8 MiB

NAND: 128 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any keyto stop autoboot: 0

U-Boot>

7 精简u-boot

7.1注释掉include/config_cmd_default.h中一些不用的命令

//#define CONFIG_CMD_CONSOLE /* coninfo */

//#define CONFIG_CMD_EDITENV /* editenv */

//#define CONFIG_CMD_FPGA /* FPGA configuration Support */

//#define CONFIG_CMD_IMI /* iminfo */

//#define CONFIG_CMD_ITEST /* Integer (and string) test */

//#define CONFIG_CMD_LOADS /* loads */

//#define CONFIG_CMD_MISC /* Misc functions like sleep etc*/

//#define CONFIG_CMD_NFS /* NFS support */

//#define CONFIG_CMD_SETGETDCR /* DCR support on 4xx */

//#define CONFIG_CMD_SOURCE /* "source" command support */

//#define CONFIG_CMD_XIMG /* Load part of Multi Image */

7.2注释掉include/configs/at91rm9200ek.h中一些不用的命令

//#define CONFIG_CMD_DHCP

//#define CONFIG_CMD_FAT

//#define CONFIG_CMD_USB

//#undef CONFIG_CMD_FPGA

……

/*

* USB Config

*/

#ifdef CONFIG_CMD_USB

#defineCONFIG_USB_ATMEL 1

#defineCONFIG_USB_OHCI_NEW 1

#defineCONFIG_USB_KEYBOARD 1

#defineCONFIG_USB_STORAGE 1

#defineCONFIG_DOS_PARTITION 1

#defineCONFIG_SYS_USB_OHCI_CPU_INIT 1

#defineCONFIG_SYS_USB_OHCI_REGS_BASE ATMEL_USB_HOST_BASE

#defineCONFIG_SYS_USB_OHCI_SLOT_NAME "at91rm9200"

#defineCONFIG_SYS_USB_OHCI_MAX_ROOT_PORTS 15

#endif

7.3编译

root@zjh:/home/work/u-boot-2012.10#make distclean && make at91rm9200ek_ram

查看u-boot.bin大小

root@zjh:/home/work/u-boot-2012.10#ll -h u-boot.bin

-rw-r--r-- 1root root 203K 2013-08-05 16:25 u-boot.bin

之前是260k

7.4运行测试

启动原有的u-boot,执行如下操作

U-Boot2012.10 (Aug 05 2013 - 16:24:26)

----成都思晗科技有限公司-----赵建辉

CPU:AT91RM9200

Crystalfrequency: 18.432 MHz

CPUclock : 179.712 MHz

Masterclock : 59.904 MHz

DRAM: 64 MiB

有点问题

8 支持NOR Flash启动

8.1配置:修改include/configs/at91rm9200ek.h

#ifdefCONFIG_RAMBOOT

#defineCONFIG_SKIP_LOWLEVEL_INIT

#defineCONFIG_SYS_TEXT_BASE 0x20100000

#else

#defineCONFIG_SYS_TEXT_BASE 0x00000000

#endif

8.2编译

root@zjh:/home/work/u-boot-2012.10#make distclean && make at91rm9200ek

8.3烧写u-boot.bin到NOR FLASH

U-Boot@zjh>tftp 21000000 u-boot.bin

emac:Starting autonegotiation...

emac:Autonegotiation complete

emac: linkup, 100Mbps full-duplex

Using emacdevice

TFTP fromserver 192.168.1.100; our IP address is 192.168.1.105

Filename'u-boot.bin'.

Load address:0x21000000

Loading: T###############

done

Bytestransferred = 207836 (32bdc hex)

U-Boot@zjh>protect off all

Un-ProtectFlash Bank # 1

.......................................................................................................................................done

U-Boot@zjh>erase 10000000 +3ffff

...........done

Erased 11sectors

U-Boot@zjh>cp.b 21000000 10000000 3ffff

Copy toFlash... done

U-Boot@zjh>reset

resetting ...

U-Boot2012.10 (Aug 05 2013 - 16:32:02)

----成都思晗科技有限公司-----赵建辉

CPU: AT91RM9200

Crystalfrequency: 18.430 MHz

CPUclock : 179.692 MHz

Masterclock : 59.897 MHz

DRAM: 64 MiB

WARNING:Caches not enabled

Flash: 8 MiB

NAND: 128 MiB

In: serial

Out: serial

Err: serial

Net: emac

Hit any keyto stop autoboot: 0

U-Boot>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics