2007.8.13

u-boot1.1.6 初步调试成功。

1. 在网上找了几个 u-boot 的移植文档,之前一直没有成功,后来,设置好 u-boot 的程序运行地址后, make clean && make at91rm9200dk_config && make ,生成 u-boot.bin 文件。

2. 在调试好 arm9200 的仿真器后,选择 File->Load memory from file ,选择 u-boot.bin 文件。

3. 文件 Load 成功以后,将 PC 指针设置为 u-boot 程序的运行地址。

4. 执行程序,即可在串口终端看到 u-boot 的提示符。

2007.8.14

1. 发现在文件 Start.S 中调用了 LowLevelInit 函数,初始化 SDRAM , 终端, DEBUG 串口, NAND 等,根据需要添加。在 u-boot 中没有进行 LowLevelInit ,所以会出现初始化不正确的时候会有问题。

2. 经常会出现 IIC 不 能写的状况,原因不明。

3.AXD 调试的时候,经常要重启才可以。有时候要进行断电。

4.u-boot 的程序启动地址在 board/at91rm9200dk/config.mk 中修改 TEXT_BASE 的值

2007.8.15

1. 研究 PMC 时钟是怎么回事,给个时钟是 如何产生的,看数据手册的方框图。

设置 master clock 的寄存 器,选择使用 slow clock ,main clock,plla,pllb 中的一个作为 时钟输入,通过 master clock controller 后生成 master clock process clock. 选择 的 plla pllb 可以通过设置相应的寄存器 来倍频 main clock.

2007-8-20

1.u-boot-1.1.6 成功从 nand flash 上启动。但 是还有很多问题没有搞清楚。 board/at91rm9200dk/config.mk ,这个 TEXT_BASE 的值所起的作 用,没有搞清楚。 U-boot.bin

文件从 flash 中读取到 sdram 中的内存的位置不是这个地址,也还是可以启动的。所以,之前的 bios9200 的代码完全不用作任何的改变,就可以将 u-boot 烧写到 nand flash 上,并且读入内存,启动 u-boot 。之前虽然也进行过直接烧写的工作,但是可能是 u-boot 中的代码,初始化的串口有问题,造成没有什么输出,显示的。现在代码中写死了。

2. 阅读了一下 bios9200 的代码,关键的部分在于,不同的板子,要进行不同的 LowLevelInit 工作 的,所以之前的 at91rm9200_for_Uboot ,不能够使用,也是因为 LowLevelInit 初始化的可能有些问题,在 u-boot 启动的时候,按照网上的修改方法,并没有进行 LowLevelInit ,所以出 现问题。

3.u-boot 的移植配置,参看以下文章

开发板 H9200M 简介

FLSH: 4M (2M ×16)  -> 固化Linux 内 核0x1000_0000-0x103_FFFF
SDRAM: 32M (2
×8M ×16)           0x2000_0000-0x21FF_FFFF
NAND Flash: 64M ->
存 放数据JP100: 12 短接,从flash 启 动,启动Flash 中固化的程序。23 短接,从片内ROM 启动,启动片内ROM 中的程序。

[编辑 ]

主要地址资源分配

[ 编辑 ]

使用厂商提供的低级初始化模块的资源分配

资源名字

接口方式

内存分布

备注

SDRAM

NCS1

20000000-21FFFFFF

32M

FLASH

NCS0

10000000-103FFFFF

4M

10000000-10005FFF

boot.bin

10010000-1001FFFF

Uboot.gz

10020000-1015FFFF

uImage

10160000-102FFFFF

ramdisk

103F 0000-103FFFFF

环境变量的存放地点

[ 编辑 ]

完全使用 U boot 来做 bootloader 的资源分配

资源名字

接口方式

内存分布

备注

SDRAM

NCS1

20000000-21FFFFFF

32M

FLASH

NCS0

10000000-103FFFFF

4M

10000000-1001FFFF

u-boot.bin

10020000-1015FFFF

uImage

10160000-102FFFFF

ramdisk

103F 0000-103FFFFF

环境变量的存放地点

[ 编辑 ]

移植 u-boot 到目标板

[ 编辑 ]

U-Boot 主要目录结构

board 目标板相关文件,比如Makefileu-boot.lds 等都和具体的开发板的硬件和地址分配有关;common 独立于处 理器体系结构的通用代码,与体系结构无关的文件。实现各种命令的C 文件,如内存大小探测与故障检 测;cpu 与处理器相关的文件。如mpc8xx 子目录下含串口、网口、LCD 驱动及中断初始化等文件;disk disk 驱动的分区处理代码driver 通用设备 驱动,如CFI FLASH 驱动(目前对INTEL FLASH 支持较好)doc U-Boot 的说明文档;examples 可在U-Boot 下运行的示例程序;如hello_world.c,timer.cinclude U-Boot 头文件;尤其configs 子目录下与目标板相关的配置头文件是移植过程中经常 要修改的文件;lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm 目录分别包含与PowerPCARM 体系结构相关的文件;net 与网络功能相 关的文件目录,如bootp,nfs,tftppost 上电自检文件 目录。尚有待于进一步完善;rtc RTC 驱动程序;tools 用于创建U-Boot S-RECORDBIN 镜像文件的工具;

[ 编辑 ]

u-boot1.1.6 boot.bin 移植方法

1 、增加目标平台到 ./board/ 下(此步骤可选,主要为了不影响源码)

因为我们当前 平台 h9200m 用的是 at91rm9200 CPU ,因此我们找最 接近的已有平台来简化移植过程,进入 board 目录下,以原有 at91rm9200dk 为 模板,拷贝 at91rm9200dk 为我们 h9200m 目录,进入目录 h9200m ,将 at91rm9200dk.c 更名为 h9200m.c ,再编辑当前目录下的 Makefile ,编辑 并搜索 at91rm9200 ,在 28 行会找到 at91rm9200dk.o ,将其改为 h9200m.o ;目录中 config.mk 是用来记录 U-boot 复制到 内存的基址, flash.c 用来配置 Flash u-boot.lds 是内核链接器的脚本文 件。 命令:

cd u-boot-1.1.6/board
cp at91rm9200dk/ h9200m
R
cd h9200m
mv at91rm9200dk.c h9200m.c
vi Makefile
       /at91rm9200
u-boot 1.1.6 版本中在第28 行) 修改at91rm9200dkh9200m

2 、进入 ./include/configs

at91rm9200dk.h 为模板,生成 h9200m.h ;在这里的文件都是和硬件系统配置息息相关,它需记录新平台的所有配置参数。 命 令:

cd u-boot-1.1.6/include/configs
cp at91rm9200dk.h h9200m.h

3 、修改 Makefile 以及

编辑源码根目 录下的 Makefile ,搜索 at91rm9200 1.1.6 版本在 1766 行,在 1768 行插入配置代码,编辑源码目录下 MAKEALL ,搜索 at91rm9200 1.1.6 版本在 190 行,在 at91rm9200dk 后加入 h9200m 即可。 命令:

vi u-boot-1.1.6/Makefile
       /at91rm9200
输入:h9200m_config   :        unconfig
                @$(MKCONFIG) $(@:_config=) arm arm920t h9200m NULL at91rm9200
vi u-boot-1.1.6/MAKEALL
       /AT91RM9200      (1.1.6
版本是在第190) (插入h9200m ,插入后如下:)At91rm9200dk     h9200m      cmc_pu2                    /

4 、根据具体的硬件配 置,修改参数

因为在 at91rm9200 引导时,厂商提供了前期初始化的 boot.bin ,它 主要作了部分的硬件初始化,替代 U-boot stage1 部分,所以在 U-boot 中就应该去掉这部分功能,不然会导致重复配置,使 U-boot 在初始配置时当掉,因此我们要修改 . /include/configs/h9200m.h ,添加 #define CONFIG_SKIP_LOWLEVEL_INIT 1 (我们默认添在第 40 行),使 U-boot 跳过低级初始化过程;我们使用的开发板的 nor flash 4M 的,因此我们搜索 PHYS_FLASH_SIZE ,复制这行,并将上面的原始一行注释掉,将下面的 0x200000 改为 0x400000 ,在 163 行。 命令:

vi u-boot-1.1.6/include/configs/h9200m.h
       :40
添加#define CONFIG_SKIP_LOWLEVEL_INIT 1
       :161
/PHYS_FLASH_SIZE 修改0x200000 改为0x400000
       :164
/CFG_MAX_FLASH_SECT 修 改256 改为71
       :200
/CFG_PROMPT 修改Uboot> 改为H9200M> 注释掉188192 行、196
       /* #ifdef CONFIG_SKIP_LOWLEVEL_INIT
       ... ...
       #else */
       ... ...
       /*#endif*/      /* CONFIG_SKIP_LOWLEVEL_INIT */
注释掉176179 行、182/*  #ifdef CONFIG_SKIP_LOWLEVEL_INIT
       ... ...
       /*#endif*/      /* CONFIG_SKIP_LOWLEVEL_INIT */
       ... ...
修改180181 两行为#define CFG_ENV_ADDR     (PHYS_FLASH_1 + 0x103f000)  /* end flash */
       #define CFG_ENV_SIZE     0x10000  /* 64K */

5 、下面我们要进行针 对板子的具体化设置

编辑 ./board/h9200m/h9200m.c ,跳转到第 50 行,

gd->bd->bi_arch_number = MACH_TYPE_AT91RM9200; 修改为gd->bd->bi_arch_number = MACH_TYPE_H9200M;

再编辑 ./include/asm-arm/mach-types.h ,跳转到第 740 行,添加硬件设备 的 ID 号,我们在这里使用 1888 作为 h9200m 的设备号

#define MACH_TYPE_H9200M                1888

这样我们的开发板就有自己的设备号了,不过 kernel 是不成认的,如果你想让全世界人 都承认,你还要到 www.kernel.com 去申请你的设备,这样一来所有内核源码中都会有这一段代码了;上面的做法仅用来测试使用。 ( 至此一个可以启动的 U boot 就已经完成了 )

[ 编辑 ]

从裸板开始,假设 flash 中没有内容,从新载入 uboot

a.PC 宿主机设置

windows 下,打开超级终端,设置串口为 115200 8N1 无 流控

b.JP100 设置为 2 3 短接,从片内 rom 启动,启动片内 ROM 中的程序。上电, 复位,超级终端下出现 ”CCCCCCC”

c. Xmodem 协议发送 loader.bin ,发完继续出现 ”CCCCCC”

d. 再用 Xmodem 协议发送 u-boot.bin ,发完显示 >U-Boot> 提示符

e. 擦除 FLASH:

>protect off all
>erase all

上述两步擦除 FLASH 中所有内容,若只擦除 uboot 所占部分,则

>protect off 10000000 1001FFFF
>erasse 10000000 1001FFFF
>protect on 10000000 1001FFFF

( 待证实 )

>protect off 1:0-1
>erase 1:0-1
>protect on 1:0-1

f. 装入 boot.bin

>loadb 20000000  ( 能过串口线(Kermit mode) 来装 载二进制文件)

在超级终端下,用 kermit 模式发送 boot.bin

>cp.b 20000000 10000000 5ffff

g. 装入 u-boot.gz

>loadb 20000000

kermit 模式发送 u-boot.gz

>cp.b 20000000 10010000 ffff
>protect on 10000000 1001ffff   (FLASH
区域保护)

h.JP100 设置为 1 2 短接,从 flash 启动,启动 Flash 中固化的程序。

[ 编辑 ]

环境变量设置

a. 网络参数设置

>setenv ethaddr 12:34:56:78:99:aa      ;MAC 地址>setenv ipaddr IP 地址(192.168.0.139)             ; 目标板IP
>setenv serverip
服务器地址(192.168.0.123)       ; 服务器IP
>setenv bootdelay 5                 ;
延时>saveenv                            ; 保存

b. 系统自动运行

注意:这里设置为络服务器启动模式,用网线从主机上下载内核和文件系统到 SDRAM 中,每次掉 电后都要重新开始。

>setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360
 consloe=ttyS0,115200 mem=32M
>saveenv

initrd 指定根文 件系统的位置

>setenv bootcmd tftp 21000000 uimage/; tftp 21100000 ramdisk.gz/; bootm 21000000
>saveenv

设定自动启动 脚本,先用 tftp 下载内核镜象到 21000000 ,然 后下载文件系统到 21100000 ,再从内核镜象地址 21000000 启动

注意:必须确保主机上启动了 tftp 服务,在根目录上有 tftpboot 目录。可用 rpm –q tftp 查看是否安装了 tftp ,若没有的话,则需要安装。在服务配置里选定 tftp 服务,开始。设置开机时自动启动 tftp 服务。执行 ntsysv 令,然后选择需要开机自动启动的服务, nfs,tftp 等,以空格选择。

linux 下的终端执行 minicom ,则启动 串口终端,可以用 minicom –s 设置。

2007-8-21 NAND 移植成功

主要参看了网上的几篇文章, http://bbs2.chinaunix.net/viewthread.php?tid=855860

http://www.lupaworld.com/23340/viewspace_4343.html

重点内容如下部分:

对于 uboot 的移植请参考我之前写的 《 U-Boot 的编译与移植到 QT-S3C44B0X 开发板上》 http://bbs.chinaunix.net/viewthr ... p;highlight=pywj777 非常感谢 dozec 的《基于 S3C2410 Linux 全线移植文档》 http://bbs.chinaunix.net/viewthr ... Linux 全线移植文档 我的 nand flash 移植大部分是 参考这个文档移植成功的。 下面对 nand flash 的初始化代码 nand_init() 进行分析: 1. 如果定义 (CONFIG_COMMANDS & CFG_CMD_NAND) 没定义 (CFG_NAND_LEGACY) start_armboot() 调用 driver/nand/nand.c 中的 nand_init() ,否则如果定义 (CONFIG_COMMANDS & CFG_CMD_NAND) 并且有定义了 CFG_NAND_LEGACY ,则调用自己定义的 nand_init() 。在我当前的情景中是使用 driver/nand/nand.c 中的 nand_init() 2.nand_init() 调用本文件中的 nand_init_chip() nand 进行初始化。 3.nand_init_chip() 首先调用 board_nand_init() 4.board_nand_init() 是需要自己添加的函数,这个函数的主要功能是对 struct nand_chip 结构体的函数指针赋值,让它们指向自己为 nand 驱 动编写的一些函数,对未赋值的指针, uboot 会在后面为其赋上通用 nand 驱 动函数指针。 5.nand_init_chip() 接着调用 nand_scan().
6.nand_scan()
定义在 drivers/nand/nand_base.c 文件中。它首先对 struct nand_chip 结构体中在 board_nand_init() 函数中未赋值的指针赋上通用 nand 驱 动函数指针。 7. 通 用 nand 驱动函数 nand_select_chip() 赋值给 struct nand_chip 结 构体的函数指针用于打开或关闭 nand 芯片, 0 为打开, 1 为关闭。在这个函数中会调用 nand_chip 结构体中的 hwcontrol 函数指针,这个指针指向的函数是需要自己编写的。这个函数指针在 board_nand_init() 函数中被赋值。主要作用是向 nand flash 发送一些 nand flash 开启与关闭命令。 8.nand_scan() 剩余部分初始化 nand_chip mtd_info 结构体。 9.nand_scan() 最后在返回时调用 drivers/nand/nand_bbt.c 文件中的 nand_default_bbt() 10.nand_default_bby() 选择一个坏块描述表,返回时调用本文件中的 nand_scan_bbt() 11.nand_scan_bbt() 寻找建立一个坏块描述表。 12. 最后返回到 nand_init() ,这样 nand 驱动的初始化完成了。 下面对命令 nand read addr ofs size 的执行流程进行分析: 1.nand read addr ofs size 命令的作 用是从 nand flash 地址的偏移量 ofs 处 读取长度为 size 字节的数据存储到内存地址 addr 处。 2.common/main.c 文件中的 main_loop() 主要执行 read_line() 读取命令 行。 3.read_line() 读取到命令行后会调用 common/main.c 文件中的 run_command() 4.run_command() 调用 common/command.c 文件中的 find_cmd() .u_boot_cmd 段中寻找该命令的 cmd_tbl_t 结构,找到后返回该结构。该命令的结构是通过定义在 include/command.h 中的宏定义 U_BOOT_CMD 登记进 .u_boot_cmd 段中的。 5.run_command() 找到该命令的 cmd_tbl_t 结构后则执行该命令对应的函数。对于本情景是 nand 命令对应的函数 do_nand() 6.do_nand() 有两个版本,一个是定义了 CFG_NAND_LEGACY 。另一个是未定义 CFG_NAND_LEGACY 。这两个版本都定义在 common/cmd_nand.c 文件中。对于本情景使用未定义 CFG_NAND_LEGACY do_nand() 函数。要使用 do_nand() 还必须定义宏 CONFIG_COMMANDS&CFG_CMD_NAND 。(若未定义 CFG_NAND_LEGACY 则在这个情景中的 do_nand() 函数调用的函数都定义在 drivers/nand_legacy/nand_legacy.c 文件中)。 7. 对于我们的情景 do_nand() 会调用定义在 include/nand.h 文件中的 nand_read() 8.nand_read() 则调用本 nand 芯 片对应的 nand_info_t 结构的 read 指针。而 read 指针在 nand_scan() 中被指向了 同文件 (drivers/nand/nand_base.c) 中的 nand_read() 函数。 9.nand_read() 函数最终会调用 nand_chip 结构中的 cmdfunc 指针,通过这个指 针指向的函数向 nand flash 芯片发送命令。最终完成整个命令的执行。 为了让 uboot 支持自己 QT 板子的 nand flash 而进行修改的部分 1. 前面的移植请参考我写的一篇《 U-Boot 的编译与移植到 QT-S3C44B0X 开发板上》,现在在 board/51EDA/QT/ 目录下建立 nand.c 文件。 2. nand.c 中添加自己的 board_nand_init() 函数。设定 nand_chip 结构中的 hwcontrol dev_ready 指针指向自己的 函数 QT_hwcontrol QT_device_ready 。 并建立自己的 QT_hwcontrol QT_device_ready 函 数。 3. 由 于自己板子的 nand flash 的命令发送方式与 uboot 提 供的通用 nand flash 命令发送方式不同,所以在 nand.c 文件中建立自己的命令发送函数 QT_nand_command() ,并在 board_nand_init() 函数中将 nand_chip 结构中的 cmdfunc 指针指向 QT_nand_command() 函数,使其使用自己定义的发送命令函数。 4. include/configs/QT.h 中定义 CFG_NAND_BASE 用于指 定自己板子 nand flash I/O 地址。 5. CONFIG_COMMANDS 中打开 CFG_CMD_NAND 选项。 6. include/configs/QT.h 中定义 NAND_MAX_CHIPS 指定 自己板子的 nand flash 芯片数。 7. include/configs/QT.h 中定义 CFG_MAX_NAND_DEVICE 指定想要支持的 nand flash 设备数。 dozec 的《基于 S3C2410 Linux 全线移植文档》在 U-BOOT Nand Flash 的支持中的移植方法是在定义了 CFG_NAND_LEGACY 情况下移植的。而我的是在未定义 CFG_NAND_LEGACY 的情况下移植的。

基于以上的分析,仔细阅读 u-boot 的代码主要修改 board/at91rm9200dk/at91rm9200dk.c

/*

* Disk On Chip (NAND) Millenium initialization.

* The NAND lives in the CS2* space

*/

#if (CONFIG_COMMANDS & CFG_CMD_NAND)

extern ulong nand_probe (ulong physadr);

#define AT91_SMARTMEDIA_BASE 0x40000000    /* physical address to access memory on NCS3 */

void nand_init (void)

{

/* Setup Smart Media, fitst enable the address range of CS3 */

*AT91C_EBI_CSA |= AT91C_EBI_CS3A_SMC_SmartMedia;

//CFGR

#define AT91C_EBI_DBPUC       ((unsigned int) 0x1 <<0)

#define AT91C_EBI_EBSEN ((unsigned int) 0x1 <<1)

AT91C_BASE_EBI->EBI_CFGR =(AT91C_EBI_DBPUC & 0x00 ) | (AT91C_EBI_EBSEN & 0x00);

// 根据不同的 flash 对寄存器进行相应的设置

/*    AT91C_BASE_SMC2->SMC2_CSR[3] = (SM_RWH | SM_RWS |

AT91C_SMC2_ACSS_STANDARD | AT91C_SMC2_DBW_8 |

SM_TDF | AT91C_SMC2_WSEN | SM_NWS);*/

AT91C_BASE_SMC2->SMC2_CSR[3] = (AT91C_SMC2_NWS & 0x04) |

AT91C_SMC2_WSEN |

(AT91C_SMC2_TDF & 0X200) |

(AT91C_SMC2_BAT) |

AT91C_SMC2_DBW_8;

/* enable the SMOE line PC0=SMCE, A21=CLE, A22=ALE */

*AT91C_PIOC_ASR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |

AT91C_PC3_BFBAA_SMWE;

*AT91C_PIOC_PDR = AT91C_PC0_BFCK | AT91C_PC1_BFRDY_SMOE |

AT91C_PC3_BFBAA_SMWE;

//flash CE PC15 RE PC14 ,所以进行以下配置,根据不同的板子来

*AT91C_PMC_PCER = 1 << AT91C_ID_PIOC;

//enable PC14 bid output

*AT91C_PIOC_ODR = AT91C_PIO_PC14;

*AT91C_PIOC_PER = AT91C_PIO_PC14;

//pull-up 14

AT91C_BASE_PIOC->PIO_PPUDR = ~AT91C_PIO_PC14;

AT91C_BASE_PIOC->PIO_PPUER = AT91C_PIO_PC14;

//enable pc15 for output

*AT91C_PIOC_PER = AT91C_PIO_PC15;

AT91C_BASE_PIOC->PIO_OER = AT91C_PIO_PC15;

// 进行短暂的延时

int j;

for(j=0;j<50000;j++);

printf ("%4lu MB/n", nand_probe(AT91_SMARTMEDIA_BASE) >> 20);

}

修改配置文件 include/configs/at91rm9200dk.h 中关于 nand flash 的宏定义

// 增加 nand 的命令支持

#define CONFIG_COMMANDS          /

((CONFIG_CMD_DFL | CFG_CMD_MII |/

CFG_CMD_DHCP | CFG_CMD_NAND ) & /

~(CFG_CMD_BDI | /

CFG_CMD_IMI | /

CFG_CMD_AUTOSCRIPT | /

CFG_CMD_FPGA | /

CFG_CMD_MISC | /

CFG_CMD_LOADS ))

/* this must be included AFTER the definition of CONFIG_COMMANDS (if any) */

#include <cmd_confdefs.h>

//#include <asm/arch/AT91RM9200.h>

#define CFG_NAND_LEGACY   1     // 使用 board/at91rm9200dk/at91rm9200dk.c 中的 nand_init() 函数和 driver/nand_legacy/nand_legacy.c 中的函数,如果不定义,使用 driver/nand/nand.c 中的 nand_init()

#define CFG_MAX_NAND_DEVICE  1     /* Max number of NAND devices        */

#define SECTORSIZE 512

#define ADDR_COLUMN 1

#define ADDR_PAGE 2

#define ADDR_COLUMN_PAGE 3

#define NAND_ChipID_UNKNOWN  0x00

#define NAND_MAX_FLOORS 1

#define NAND_MAX_CHIPS 1

//my ale cle 这个不是很明白,应该根据你的板子上的连接来设置,看你的 flash 上的 cle ale 分别接的是那一根地址线

#define AT91_SMART_MEDIA_ALE (1 << 21)  /* our ALE is AD21 */

#define AT91_SMART_MEDIA_CLE (1 << 22)  /* our CLE is AD22 */

//PC15 接的是 CE PC14 接的是 RE

#define NAND_DISABLE_CE(nand) do { *AT91C_PIOC_SODR = AT91C_PIO_PC15;} while(0)

#define NAND_ENABLE_CE(nand) do { *AT91C_PIOC_CODR = AT91C_PIO_PC15;} while(0)

#define NAND_WAIT_READY(nand) while (!(*AT91C_PIOC_PDSR & AT91C_PIO_PC14))

#define WRITE_NAND_COMMAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr | AT91_SMART_MEDIA_CLE) = (__u8)(d); } while(0)

#define WRITE_NAND_ADDRESS(d, adr) do{ *(volatile __u8 *)((unsigned long)adr | AT91_SMART_MEDIA_ALE) = (__u8)(d); } while(0)

#define WRITE_NAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) = (__u8)d; } while(0)

#define READ_NAND(adr) ((volatile unsigned char)(*(volatile __u8 *)(unsigned long)adr))

/* the following are NOP's in our implementation */

// 要进行修改,按以下定义

#define NAND_CTL_CLRALE(nandptr)     (nandptr & ~(AT91_SMART_MEDIA_ALE))

#define NAND_CTL_SETALE(nandptr)      (nandptr|AT91_SMART_MEDIA_ALE)

#define NAND_CTL_CLRCLE(nandptr)      (nandptr & ~(AT91_SMART_MEDIA_CLE))

#define NAND_CTL_SETCLE(nandptr)      (nandptr|AT91_SMART_MEDIA_CLE)

2007-8-22

1. 解决环境变量 env 的 存储问题。

描述:在 cmd_nvedit.c 中,检查环境变量存储在那里。可选的有 CFG_ENV_IS_IN_NVRAM

CFG_ENV_IS_IN_EEPROM

CFG_ENV_IS_IN_FLASH

CFG_ENV_IS_IN_DATAFLASH

CFG_ENV_IS_IN_NAND

CFG_ENV_IS_NOWHERE

include/configs/at91rm9200.h 中定义其中的一种就可以,因为还没有搞好 I2C, 所以目前先使用 NAND flash 。在该文件中添加:

#define CFG_ENV_IS_IN_NAND

#define CFG_ENV_OFFSET                                   0x40000                // 环境变量存储位置偏移

#define CFG_ENV_SIZE                                 0x20000                // 环境变量存储大小

#define CFG_ENV_ADDR                               0x40040000

并且注释掉其他的 ENV 的设置。

由于 nand 的 驱动使用了 nand_legacy.c 中的 nand 接口函数。所以要修改 common/env_nand.c 中的 saveenv 函数和 env_relocate_spec 函数。

int saveenv(void)

{

ulong total;

int ret = 0;

puts ("Erasing Nand...");

/*

if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))

return 1;

*/

if (nand_legacy_erase(&nand_dev_desc[0], CFG_ENV_OFFSET, CFG_ENV_SIZE,1))

return 1;

puts ("Writing to Nand... ");

total = CFG_ENV_SIZE;

/*

ret = nand_write(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);

if (ret || total != CFG_ENV_SIZE)

return 1;

*/

ret = nand_legacy_rw(&nand_dev_desc[0] , 0x00 ,CFG_ENV_OFFSET,CFG_ENV_SIZE, (size_t *)&total, (u_char*)env_ptr);

puts ("done/n");

return ret;

}

/*

* The legacy NAND code saved the environment in the first NAND device i.e.,

* nand_dev_desc + 0. This is also the behaviour using the new NAND code.

*/

void env_relocate_spec (void)

{

#if !defined(ENV_IS_EMBEDDED)

ulong total;

int ret;

total = CFG_ENV_SIZE;

//     ret = nand_read(&nand_info[0], CFG_ENV_OFFSET, &total, (u_char*)env_ptr);

ret = nand_legacy_rw(&nand_dev_desc[0], 0x01 ,CFG_ENV_OFFSET,CFG_ENV_SIZE, (size_t *)&total, (u_char*)env_ptr);

if (ret || total != CFG_ENV_SIZE)

return use_default();

if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)

return use_default();

#endif /* ! ENV_IS_EMBEDDED */

}

2007-8-27

内核与文件系统移植成功。其中经历了不少的问题。主要是这么几个方 面:

1. uboot 中的 bootargs 的设置, init=/linuxrc  console=/dev/ttyS0,115200 root=/dev/mtdblock2

2. 自动启动内核的时候, bootcmd 的设置在内核中要给 nand flash 分好区的,在第三个分区烧写上文件系统。

3. 编译 busybox ,写好 rcS 文件。

2007-8-28

1. 明确的几个问题。

1 )在当前的启动方式下, uboot 仅仅相当于提供了方便的方式下载内核,文件系统的任务,如何能够让 uboot 自己完成启动的全部任务。目前为 eeprom 中的 bios 程序,调用烧写在 nand flash 上的 uboot ,完成启动。但是 bios 要 是从 nand flash 上读出 uboot ,就必须移植 nand flash 的驱动才可以,这样相当于 bios 也 可以完成烧写 nand flash 的任务。那么是不是有办法让 uboot 烧 写在 eeprom 中,自己启动的。

2. 出现不能初始化 console 的错误的时候,可能是 /dev 没有加载,在编译内核的时候,要选中自动加载 /dev boot 的时候,这个选项。不然程序会因为找不到 /dev/console 出错。

AT91RM9200 EK or DK开发参考相关推荐

  1. 推荐60+ Flex开发参考网站

    推荐60+ Flex开发参考网站 下面是一些好的Flex开发的网站或者Flex资源,如果你使用Flex开发,可以参考一下. 网上找的,可以参考参考!呵呵 新手入门参考: Adobe Flex 3 - ...

  2. CSS参考手册_web前端开发参考手册系列

    CSS参考手册_web前端开发参考手册系列 网址: http://css.doyoe.com/

  3. php+参考手册,PHP程序开发参考手册

    PHP综合查询参考手册,包含PHPWeb开发中应用的各种语句.函数.类及其方法. 前言 第一篇 PHP基础篇 第1章 语句 第2章 经典类 第3章 数组函数库 第4章 类和对象函数库 第5章 日期时间 ...

  4. 深入浅出oracle OAF,深入浅出Oracle之OAF开发参考.doc

    Oracle ERP最佳实践 E-BUSINESS SUITE ORACLE核心应用技术 OAF开发参考 Author:赵振坤 Creation Date:April 26, 2013 Last Up ...

  5. Spring Framework 开发参考手册中文(在线HTML)

    '原文:http://blog.csdn.net/zfrong/article/details/3971722 Spring Framework 开发参考手册中文(在线HTML) Spring Fra ...

  6. webapp开发参考

    webapp开发参考: http://blog.csdn.net/zhuming3834/article/details/51706256

  7. 高通驱动开发参考(二)

    第1章 Driver相关模块介绍 1.1 REX简介 虽说目前QSC60x5平台上采用L4操作系统,REX只是L4上面的一个Task.但高通为了开发的兼容性,提供的API仍然采用老的一套接口(可能内部 ...

  8. Arm指令模拟器开发参考指南【翻译自 armDeveloper】

    目录 简介 开始 安装ARMIE 安装之前 安装步骤 安装之后 开始使用ARM 指令模拟器 开始之前 步骤 示例:编译并执行一个"Hello World"程序 示例:编译,向量化和 ...

  9. php.bbs模板,Xiuno BBS 模板风格开发参考

    文章目录 修罗BBS系统可以用来搞CMS,可以通过自己做模版的方式搞一下文章系统 下面是从零开发模版所需要用到的信息 首先Xiuno的模板是要放在 plugin 文件夹下, 当做一个插件来使用的 关于 ...

  10. PHP程序开发参考手册

    /**语句*/ //if语句--条件控制语句 <?php$num = 2011;if(($num%4)==0&&($num%100)!=0){echo "$num&qu ...

最新文章

  1. java socket nio 阻塞_Java NIO实现非阻塞式socket通信
  2. 读取/书写Java的XML格式properties文件
  3. 2021永州高中高考成绩查询入口,邵阳高考成绩查询入口2021
  4. 李开复看衰语音识别 这些国内外巨头却有话要说!
  5. tablepc是什么平板电脑_tablepc平板电脑怎么截图
  6. redis数据类型-列表(List)
  7. 相对地址转化为绝对地址
  8. matlab小波变换,图像处理
  9. 极盾科技荣获2021年梦想小镇7周年“脉冲星奖”
  10. 微信小程序新版本提示更新
  11. 软件License设计思路与实现方案
  12. 通达OAV12报表中心
  13. 基于大数据的模型预测用户是否会进行交易 文档+答辩PPT+Python源码及数据
  14. 计算机13E怎么转换成十进制,十六进制换算(进制转换计算器)
  15. 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效
  16. 虚拟内存太低怎么办?
  17. java中级程序员面试题_中级Java程序员常见面试题汇总
  18. 中南大学汪炼成教授课题组:三维金属-半导体-金属AlN深紫外探测器
  19. 认亲app如何创建小家谱
  20. 洛谷 4828 Nagisa loves Tomoya 题解

热门文章

  1. 课程设计 计算机公共基础,基于Moodle的大学计算机公共基础课程设计.pdf
  2. ICMP数据包-实战分析
  3. 如何把windowsXP系统主题成Windows7风格windowsxp主题包
  4. php smarty 调试模式,Smarty3调试
  5. Silverlight 4 Tools for Visual Studio 2010手动一步一步安装
  6. WPE封包外挂教程(下)
  7. 数据结构试卷(一)及答案
  8. 高等数学(第七版)同济大学 总习题六 个人解答
  9. SEO经验分享之百度知道篇
  10. 洛谷P3853 路标设置