AT91RM9200 EK or DK开发参考
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 [编辑 ] 主要地址资源分配 [ 编辑 ] 使用厂商提供的低级初始化模块的资源分配
[ 编辑 ] 完全使用 U - boot 来做 bootloader 的资源分配
[ 编辑 ] 移植 u-boot 到目标板 [ 编辑 ] U-Boot 主要目录结构 board 目标板相关文件,比如Makefile 和u-boot.lds 等都和具体的开发板的硬件和地址分配有关;common 独立于处 理器体系结构的通用代码,与体系结构无关的文件。实现各种命令的C 文件,如内存大小探测与故障检 测;cpu 与处理器相关的文件。如mpc8xx 子目录下含串口、网口、LCD 驱动及中断初始化等文件;disk disk 驱动的分区处理代码driver 通用设备 驱动,如CFI FLASH 驱动(目前对INTEL FLASH 支持较好)doc U-Boot 的说明文档;examples 可在U-Boot 下运行的示例程序;如hello_world.c,timer.c ;include U-Boot 头文件;尤其configs 子目录下与目标板相关的配置头文件是移植过程中经常 要修改的文件;lib_xxx 处理器体系相关的文件,如lib_ppc, lib_arm 目录分别包含与PowerPC 、ARM 体系结构相关的文件;net 与网络功能相 关的文件目录,如bootp,nfs,tftp ;post 上电自检文件 目录。尚有待于进一步完善;rtc RTC 驱动程序;tools 用于创建U-Boot S-RECORD 和BIN 镜像文件的工具; [ 编辑 ] 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 2 、进入 ./include/configs 下 以 at91rm9200dk.h 为模板,生成 h9200m.h ;在这里的文件都是和硬件系统配置息息相关,它需记录新平台的所有配置参数。 命 令: cd u-boot-1.1.6/include/configs 3 、修改 Makefile 以及 编辑源码根目 录下的 Makefile ,搜索 at91rm9200 , 1.1.6 版本在 1766 行,在 1768 行插入配置代码,编辑源码目录下 的 MAKEALL ,搜索 at91rm9200 , 1.1.6 版本在 190 行,在 at91rm9200dk 后加入 h9200m 即可。 命令: vi u-boot-1.1.6/Makefile 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 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 上述两步擦除 FLASH 中所有内容,若只擦除 uboot 所占部分,则 >protect off 10000000 1001FFFF 或 ( 待证实 ) >protect off 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 h.JP100 设置为 1 - 2 短接,从 flash 启动,启动 Flash 中固化的程序。 [ 编辑 ] 环境变量设置 a. 网络参数设置 >setenv ethaddr 12:34:56:78:99:aa ;MAC 地址>setenv ipaddr IP 地址(192.168.0.139) ; 目标板IP b. 系统自动运行 注意:这里设置为络服务器启动模式,用网线从主机上下载内核和文件系统到 SDRAM 中,每次掉 电后都要重新开始。 >setenv bootargs root=/dev/ram rw initrd=0x21100000,6000000 ramdisk_size=15360 initrd 指定根文 件系统的位置 >setenv bootcmd tftp 21000000 uimage/; tftp 21100000 ramdisk.gz/; bootm 21000000 设定自动启动 脚本,先用 tftp 下载内核镜象到 21000000 ,然 后下载文件系统到 21100000 ,再从内核镜象地址 21000000 启动 注意:必须确保主机上启动了 tftp 服务,在根目录上有 tftpboot 目录。可用 rpm –q tftp 查看是否安装了 tftp ,若没有的话,则需要安装。在服务配置里选定 tftp 服务,开始。设置开机时自动启动 tftp 服务。执行 ntsysv 命 令,然后选择需要开机自动启动的服务, nfs,tftp 等,以空格选择。 在 linux 下的终端执行 minicom ,则启动 串口终端,可以用 minicom –s 设置。 |
主要参看了网上的几篇文章, http://bbs2.chinaunix.net/viewthread.php?tid=855860
http://www.lupaworld.com/23340/viewspace_4343.html
基于以上的分析,仔细阅读 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开发参考相关推荐
- 推荐60+ Flex开发参考网站
推荐60+ Flex开发参考网站 下面是一些好的Flex开发的网站或者Flex资源,如果你使用Flex开发,可以参考一下. 网上找的,可以参考参考!呵呵 新手入门参考: Adobe Flex 3 - ...
- CSS参考手册_web前端开发参考手册系列
CSS参考手册_web前端开发参考手册系列 网址: http://css.doyoe.com/
- php+参考手册,PHP程序开发参考手册
PHP综合查询参考手册,包含PHPWeb开发中应用的各种语句.函数.类及其方法. 前言 第一篇 PHP基础篇 第1章 语句 第2章 经典类 第3章 数组函数库 第4章 类和对象函数库 第5章 日期时间 ...
- 深入浅出oracle OAF,深入浅出Oracle之OAF开发参考.doc
Oracle ERP最佳实践 E-BUSINESS SUITE ORACLE核心应用技术 OAF开发参考 Author:赵振坤 Creation Date:April 26, 2013 Last Up ...
- Spring Framework 开发参考手册中文(在线HTML)
'原文:http://blog.csdn.net/zfrong/article/details/3971722 Spring Framework 开发参考手册中文(在线HTML) Spring Fra ...
- webapp开发参考
webapp开发参考: http://blog.csdn.net/zhuming3834/article/details/51706256
- 高通驱动开发参考(二)
第1章 Driver相关模块介绍 1.1 REX简介 虽说目前QSC60x5平台上采用L4操作系统,REX只是L4上面的一个Task.但高通为了开发的兼容性,提供的API仍然采用老的一套接口(可能内部 ...
- Arm指令模拟器开发参考指南【翻译自 armDeveloper】
目录 简介 开始 安装ARMIE 安装之前 安装步骤 安装之后 开始使用ARM 指令模拟器 开始之前 步骤 示例:编译并执行一个"Hello World"程序 示例:编译,向量化和 ...
- php.bbs模板,Xiuno BBS 模板风格开发参考
文章目录 修罗BBS系统可以用来搞CMS,可以通过自己做模版的方式搞一下文章系统 下面是从零开发模版所需要用到的信息 首先Xiuno的模板是要放在 plugin 文件夹下, 当做一个插件来使用的 关于 ...
- PHP程序开发参考手册
/**语句*/ //if语句--条件控制语句 <?php$num = 2011;if(($num%4)==0&&($num%100)!=0){echo "$num&qu ...
最新文章
- java socket nio 阻塞_Java NIO实现非阻塞式socket通信
- 读取/书写Java的XML格式properties文件
- 2021永州高中高考成绩查询入口,邵阳高考成绩查询入口2021
- 李开复看衰语音识别 这些国内外巨头却有话要说!
- tablepc是什么平板电脑_tablepc平板电脑怎么截图
- redis数据类型-列表(List)
- 相对地址转化为绝对地址
- matlab小波变换,图像处理
- 极盾科技荣获2021年梦想小镇7周年“脉冲星奖”
- 微信小程序新版本提示更新
- 软件License设计思路与实现方案
- 通达OAV12报表中心
- 基于大数据的模型预测用户是否会进行交易 文档+答辩PPT+Python源码及数据
- 计算机13E怎么转换成十进制,十六进制换算(进制转换计算器)
- 基于STM32F4:多通道ADC采集,采用DMA的形式,亲测有效
- 虚拟内存太低怎么办?
- java中级程序员面试题_中级Java程序员常见面试题汇总
- 中南大学汪炼成教授课题组:三维金属-半导体-金属AlN深紫外探测器
- 认亲app如何创建小家谱
- 洛谷 4828 Nagisa loves Tomoya 题解