我的AT91RM9200板

来源:互联网 发布:南风知我意2txt下载 编辑:程序博客网 时间:2024/05/08 04:15

CYCLONE板子移植笔记

马志军

 

 

一:板载资源

   32MB HYNIX SDRAM 连接于CS1上。起始地址:0x2000000

   2MB AMD NOR FLASH 连接于CS0上。起始地址:0x1000000

   16MB INTEL NOR FLASH连接于CS2上。起始地址:0x3000000

   32MB SANMSUNG NAND FLASH连接于CS3上。起始地址:0x4000000

   256KB IIC EEPROM连接于 TWI

   100M ETHERNET

   RTC 连接于 TWI

   2.0 CAN连接于 NPCS1

   3 RS232

   1 RS485

   1 SD CARD

   1 USB HOST

   1 USB DEVICE

   1 TFT LCD CONTROLLER连接于 NCS4

   1 TOUCH连接于 TWI

   1 CHARACTER LCD(128X64)

   8 KEYS

   8 LEDS

   EXTERN PORTS

 

:UBOOT常用命令使用介绍

1IICSDRAM相互拷贝命令

   命令:icpout

作用:拷贝IIC中的数据到SDRAM

格式:icpout chip_num addr[.1,.2,.3] SDRAM_start_addr length

解释:

     chip_num代表第几个iic器件

addr为地址,括号中的数字代表使用的IIC器件的地址宽度

1表示8位,2表示16位,3表示24位)

SDRAM_start_addrSDRAM中起始地址

length为需要拷贝的数据长度

(注意:该命令由马志军编写,源UBOOT不具备该命令)

例如:将第IIC总线上第1个存储器的0地址开始处的32个字节拷贝到SDRAM0开始处。(注意程序中的第一个编号为0)

icpout 0 0.2 00000000 32

 

   命令:icpin

作用:拷贝SDRAM中的数据到IIC

格式:icpin chip_num addr[.1,.2,.3] SDRAM_start_addr length

解释:

     chip_num代表第几个iic器件

addr为地址,括号中的数字代表使用的IIC器件的地址宽度

1表示8位,2表示16位,3表示24位)

SDRAM_start_addrSDRAM中起始地址

length为需要拷贝的数据长度

(注意:该命令由马志军编写,源UBOOT不具备该命令)

例如:将第IIC总线上第1个存储器的0地址开始处的32个字节拷贝到SDRAM0开始处。(注意程序中的第一个编号为0)

icpin 0 0.2 00000000 32

 

   命令:imw

作用:IIC器件指定地址处数据修改

格式:imw chip_num addr[.1,.2,.3] value length

解释:

     chip_num代表第几个iic器件

addr为地址,括号中的数字代表使用的IIC器件的地址宽度

1表示8位,2表示16位,3表示24位)

value为写入指定地址的数据

length为写入的数据长度

例如:将第IIC总线上第1个存储器的0x2500地址开始处的2个字节修改为ffff(注意程序中的第一个编号为0)

imw 0 2500.2 ffff 2

 

   命令:imd

作用:查看IIC器件指定地址处数据

格式:imd chip_num addr[.1,.2,.3]

解释:

     chip_num代表第几个iic器件

addr为地址,括号中的数字代表使用的IIC器件的地址宽度

1表示8位,2表示16位,3表示24位)

例如:查看IIC总线上第1个存储器的0x2500地址开始处的数据。(注意程序中的第一个编号为0)

Imd 0 2500.2

 

   命令:protect

作用:锁定FLASH或解锁FLASH

格式:protect on/off blank num

       protect on/off N:Sec_start-Sec_end

       protect on/off all

解释:

blank num代表第几个存储器件

N代表第几个存储器件

Sec_start需要操作的扇区首地址

Sec_end 需要操作的扇区尾地址(该地址是下个扇区首地址减1

例如:锁定FLASH的第二个到第3个扇区

protect on 30020000 3005ffff

例如:解锁FLASH的第二个到第3个扇区

protect off 30020000 3005ffff

protect off 12-3

(注意每个flash扇区的地址不一样。结束扇区地址是下一个扇区起始地址减1

 

   命令:erase

作用:擦除芯片

格式:erase all

       erase N:Sec_start-Sec_end

解释:

N代表第几个存储器件

Sec_start需要操作的扇区首地址

Sec_end 需要操作的扇区尾地址(该地址是下个扇区首地址减1

例如:擦除储存器所有扇区

erase all

例如:擦除第一块FLASH的第二个和第3个扇区

erase 30020000 3005ffff

erase 1:2-3

(注意每个flash扇区的地址不一样。结束扇区地址是下一个扇区起始地址减1

 

   命令:cp[.b,.w.,.l]

作用:存储器相互拷贝命令

格式:cp.b/w/l start_addr end_addr

解释:

b代表单字节拷贝

w代表双字节拷贝

l代表四字节拷贝

start_addr需要拷贝的源起始地址

end_addr 需要拷贝的目标起始地址

(该命令可以在SDRAMFLASH之间,SDRAMSDRAM之间,FLASHFLASH之间相互拷贝)

例如:拷贝SDRAM0地址处32个字节到FALSH0地址开始处

cp.b 20000000 30000000 32

cp.w 20000000 30000000 16

cp.l 20000000 30000000 8

 

   命令:md

作用:存储器查看命令

格式:md start_addr

解释:

start_addr需要拷贝的源起始地址

(该命令可以查看SDRAMFLASH指定开始地址处的内容)

例如:查看SDRAM0地址开始处的内容

md 20000000

 

   命令:flinfo

作用:存储器信息查看

格式:flinfo

解释:查看 FLASH相关信息,包括扇区起始地址,存储器大小,锁定状态等

例如:查看FLASH信息

flinfo

 

三:目标板的启动过程

 

     本实验板使用的ATMELAT91RM9200处理器,该处理器在上电复位后,启动内部的一级boot代码检测各个外设存储器开始的32个字节是否存在有效的向量代码,如果有就下载到内部的16KB RAM运行。如果所有存储器都没有有效向量,存储器启动内部XMODEM协议向串口打出”C”字符,等待PC机下传数据。

     在此我们需要用到三个boot代码,bootloaderbootuboot。前两个文件全部可以从ATMEL网站找到,后一个文件可以从sourceforge网站上找到。bootloader是芯片外用户的一级boot,它负责初始化CPUIIC设备,SDRAM和串口。然后把后面的boot代码从指定存储器(这儿我们仍然放在IIC器件中)中拷贝到SDRAM指定地址处运行。boot的作用是把UBOOT解压到SDRAM制定地址处并运行。最后uboot再解压LINUX映象到SDRAM,传递参数给LINUX内核,并启动内核。

     Bootloader.bin存放在AT24C256芯片的0x0000开始处。

     Boot.bin存放在AT24C256芯片的0x2500开始处。

Uboot.bin存放在SDRAM中并的0x21000000开始处。

     Uboot.bin.gz存放在INTEL FALSH0x3002000开始处。

 

实施步骤1

1:连接目标板串口和PC串口,打开超级终端,打开实验版上电,此时PC的超级终端中不断显示”C”

 

 

 

2右键点击超级终端,选择发送文件(使用XMODEM协议),选择Bootloader.bin发送

 

3:发送完毕后超级终端仍然不断显示”C”,此时右键点击超级终端,选择发送文件(使用XMODEM协议),选择Uboot.bin发送,发送完毕后uboot已经运行,超级终端中可以看到uboot运行的信息。

 

 

4:解锁FLASH指定扇区。(命令:protect off 1:1-2

 

 

 

5:擦除FLASH指定扇区。(命令:erase 1:1-2erase 30020000 3005ffff

 

 

6:下载Uboot.bin.gz。(命令:loadb)输入命令后回车。此时右键点击超级终端,选择发送文件(使用Kermit协议),选择Uboot.bin.gz发送,发送完毕后请仔细查看终端中显示的起始地址和数据长度。后面有用。

 

7:拷贝数据到FLASH。(命令:cp.w 21000000 30020000 76c0注意,如果改用其它目标板,地址参数和UBOOT的长度可能和此处的不一样。

此时已经在目标板的第一个扇区存入了uboot的压缩影像。

实施步骤2

下面只要在IIC中放入bootloaderboot文件即可。

 

 

1:下载bootloader文件到内存(命令:loadb)回车后,右键点击“发送文件”,然后选择bootloader.bin文件发送

2:写入下载的数据到IIC器件。(命令:icpin 0 0.2 21000000 1c60

 

 

 

3:修改第6个向量区首字节为0x14,这样保证CPU自动读取bootloader时能完整下载完整个bootloader文件。因为CPU自动检测32个字节向量,并以第6个向量的数据作为下载代码的长度。

在此我们必须把偏移地址为0x14的一个字节修改为0x17。(命令:imw 0 14.2 17 1)完成后我们即可下载MyBoot.bin文件

 

 

 

4:下载MyBoot.bin文件到内存(命令:loadb),回车后右键点击超级终端,选择MyBoot.Bin发送

5:写入MyBoot.binIIC器件中,偏移地址为0x2500处。(命令:icpin 0 2500.2 21000000 2980

注意,因为我的MyLoader下载的起始地址是IIC0x2500地址处,所以此处的MyBoot.bin必须烧写到该地址处。否则MyLoader无法正确下载MyBoot程序并正确运行。

 

四:可能的问题

1:在移植uboot时,请注意使用板上的FLASH对应的驱动,没有的话在别的板级目录中找一个。

2INTELflash的驱动有一个swapx)函数,请改成16位交换函数,参考32位交换函数,否则写入flash16位数据时倒的。

3:请参考bootloader,并在其中添加boot代码拷贝函数。注意bootloader编译后的大小理论上不能大于16K,实际上应该不大于14K,保留2K的堆栈空间。

4

 

 

辅助知识

如何生成Makefile

首先,您的系统中必须具备以下工具

1Autoconf

2Automake

3m4

4perl

5libtool(其中libtool非必须)。

开始制作Makefile文件

生成 Makefile 过程

首先进入 project 目录,在该目录下运行一系列命令,创建和修改几个文件,就可以生成符合该平台的Makefile文件,操作过程如下:

1) 运行autoscan命令

2) configure.scan 文件重命名为configure.in,并修改configure.in文件

3) project目录下新建Makefile.am文件,并需要单独生成Makefile文件的子目录下也新建Makefile.am文件

4) project目录下新建NEWS README ChangeLog AUTHORS文件(非必须步骤)

5) 运行aclocal命令

6) 运行autoconf命令

7) 运行automake –add-missing命令

8) 运行./confiugre脚本(该命令运行后产生Makefile文件)

Automake

安装指导参见: the 节 called 安装 Automake-1.8 第 6 .

官方下载地址

Automake (1.8): 
ftp://ftp.gnu.org/gnu/automake/

Automake的内容

Automake 产生 Makefile.in 文件,与 Autoconf 配合使用。

安装下列程序: acinstall, aclocal, aclocal-1.8, automake, automake-1.8, compile, config.guess, config.sub, depcomp, elisp-comp, install-sh, mdate-sh, missing, mkinstalldirs, py-compile, symlink-tree, ylwrap

简短说明

acinstall是用来安装aclocal-style M4文件的脚本.

aclocal 根据configure.in文件的内容,自动生成aclocal.m4文件。

automake根据Makefile.am文件的内容,自动生成Makefile.in文件。要为一个包建立所有的Makefile.in文件,通过在目录的顶层以没有参数的形式运行automake程序。automake会自动找到每一个合适的Makefile.am (通过扫描configure.in)并且产生相应的Makefile.in

compile 是编译器的包装脚本。

config.guess是用来为特定的编译、主机或目标架构来尝试猜测标准的系统名称的脚本。

config.sub 是配置验证子脚本。

depcomp在编译程序同时产生其依赖信息的脚本。

elisp-comp 能按字节编译 Emacs Lisp 代码。

install-sh 是能安装程序, 脚本或者数据文件的脚本。

mdate-sh 打印程序和目录更改时间的脚本.

missing 是一个用来填充在安装过程检查出的缺失的GNU程序空位的脚本.

mkinstalldirs产生目录树结构的脚本.

py-compile 编译 Python 程序。

symlink-tree 为整个目录创建符号链接的脚本。

ylwrap lexyacc的包装脚本。

Automake 安装依赖关系

Automake 依赖于: Autoconf, Bash, Coreutils, Diffutils, Grep, M4, Make, Perl, Sed.