ARM仿真器-foxICE 设为首页   |   加入收藏夹   |   网站地图         
  站内搜索:
 
http://www.foxice.net
最新下载_foxICE
ARM7TDMI R3内核
ARM7EJS内核
ARM946E-S内核
ARM966E-S内核
ARM9TDMI内核
ARM940T内核
ARM指令集速查卡
ARM925T内核(TI925T)

更多 >> 

 技术专栏RSS订阅

   首页>技术专栏>Redboot >Redboot 安装历程

Redboot 安装历程

作者:Samfei 1 2

改成 :
CYG_LABEL_DEFN(__reserved_bootmon) = 0x01000000; . = CYG_LABEL_DEFN(__reserved_bootmon) + 0x00000;
[mlt_arm_at91_eb40_rom.ldi 就是生成 rom 版 redboot 中 target.ld 的依据 .]
然后重新配置 redboot 和编译 , 运行 , 烧录到 EV40, 正常启动了 redboot. ^_^
[ 此时出现一个非常讨厌的问题 , 就是 EV40 板子一运行 redboot, 蜂鸣器不停的叫 . 我没有去检查为什么这样 ! 后来只好在自己公司的板子上试了 .]

八 配置flash
由于 EB40 采用的 flash 芯片和 EV40 采用的芯片是不一样的 , 因此很正常的结果是我们第七节编译处理的 redboot 是不能正确识别 EV40 的 flash 芯片 . 因此就必须考虑修改 flash 驱动 .
此时本人对如何修改还不是太清楚 , 因此只要乖乖地去看ecos的资料 . 正好同事买了一本ecos的书 , 这样就省了看英文资料的麻烦 .
从资料上 , 可以知道修改配置 , 主要是修改cdl 文件 . 跟EB40有关的flash包是 :
Package CYGPKG_DEVS_FLASH_EB40 (FLASH memory support for Atmel AT91/EB40):
Package CYGPKG_DEVS_FLASH_ATMEL_AT29CXXXX (Support for Atmel AT29Cxxxx flash memory):
我就把CYGPKG_DEVS_FLASH_EB40 包中采用的ATMEL 芯片的包改成 :
CYGPKG_DEVS_FLASH_AMD_AM29XXXXX
具体修改的文件是ecos/packages/devs/flash/arm/eb40/current/cdl/flash_eb40.cdl:
修改requires CYGPKG_DEVS_FLASH_ATMEL_AT29CXXXX 为

requires CYGPKG_DEVS_FLASH_AMD_AM29XXXXX
修改cdl_interface CYGINT_DEVS_FLASH_ATMEL_AT29CXXXX_REQUIRED {
display "Generic Atmel AT29CXXXX driver required"
为cdl_interface CYGINT_DEVS_FLASH_AMD_AM29XXXXX_REQUIRED {
display "Generic Amd AM29XXXXX driver required"
修改implements CYGINT_DEVS_FLASH_ATMEL_AT29CXXXX_REQUIRED
为implements CYGINT_DEVS_FLASH_AMD_AM29XXXXX_REQUIRED

增加requires CYGHWR_DEVS_FLASH_AMD_AM29LV160.
这里特别是要说明的是最后这一行 , 因为CYGPKG_DEVS_FLASH_AMD_AM29XXXXX支持多种芯片 , 在配置的时候 , 需要指定哪些芯片可以识别 , 刚开始的时候ecoscofing tree和编译后 , 就是没有看到驱动程序包含进去 , 弄了半天才搞明白 , 如果一种芯片也没有选 , 则驱动程序就不包含进去 . 因此需要加入至少一种芯片的选择 , 最后一行就是选择AM29LV160的芯片 .
同时修改ecos/packages/ecos.db 的target eb40 中 :
修改CYGPKG_DEVS_FLASH_ATMEL_AT29CXXXX
为CYGPKG_DEVS_FLASH_AMD_AM29XXXXX

再修改ecos/packages/devs/flash/arm/eb40/current/src/eb40_flash.c:
增加#define CYGNUM_FLASH_WIDTH 16
修改#include "cyg/io/flash_at29cxxxx.inl"
为#include "cyg/io/flash_am29xxxxx.inl"

此时 , 由于EV40板子乱叫的原因 , 我是用我们自己的板子WX10 来调试了 , 而WX10 采用的flash是AM29LV641, 与 AM29LV160是有区别的 , 因此我打开了flash调试 , 自己增加了一些调试语句 , 运行后 , 然后增加了AM29LV641的驱动 , 具体文件是ecos/packages/devs/flash/amd/am29xxxxx/current/include/flash_am29xxxxx_parts.inl, 增加了 AM29LV641配置 :
+ { // MBM29LV641
+ device_id : FLASHWORD(0x22d7),
+ block_size : 0x10000 * CYGNUM_FLASH_INTERLEAVE,
+ block_count: 32,
+ device_size: 0x200000 * CYGNUM_FLASH_INTERLEAVE,
+ base_mask : ~(0x200000 * CYGNUM_FLASH_INTERLEAVE - 1),
+ bootblock : true,
+ bootblocks : { 0x000000 * CYGNUM_FLASH_INTERLEAVE,
+ 0x004000 * CYGNUM_FLASH_INTERLEAVE,
+ 0x002000 * CYGNUM_FLASH_INTERLEAVE,
+ 0x002000 * CYGNUM_FLASH_INTERLEAVE,
+ 0x008000 * CYGNUM_FLASH_INTERLEAVE,
+ _LAST_BOOTBLOCK
+ },
+ banked : false,
+ bufsiz : 1
+ },
具体还是放在CYGHWR_DEVS_FLASH_AMD_AM29LV160 下 , 这样上面的cdl不用修改 .[ 上面的修改中我没有修改 flash 的容量 , 因为 AM29LV641 是 8M 的 , 我还弄清楚如何改 ! 我就先把它当成 2M 使用 .]
经过上面的修改 , 重新编译运行后 ,redboot 能够正确识别了 flash 的 . ^_^

九 网卡驱动
google 了” ecos 8019as driver ” , 查到了二个结果 , 我把二个驱动包都下载下来了 . 然后分别测试了一下 , 但都没有成功 . 我最后选择 dp 83902a 这种方式重点研究 .
首先下载其软件包 , 解压到相应的目录 . 然后增加了 CYGPKG_DEVS_ETH_RLTK_ISA8019AS 定义 .
由于 EB40 没有网卡驱动 , 因此只好自己增加配置 . 具体是 redboot_ROM.ecm 中增加 :
package -hardware CYGPKG_DEVS_ETH_RLTK_ISA8019AS current ;
package -hardware CYGPKG_DEVS_ETH_NS_DP 83902A current
package CYGPKG_IO_ETH_DRIVERS current ;
然后在文件 ecos/packages/devs/eth/rltk/isa8019as/current/include/devs_eth_rltk_isa8019as.inl 中修改网卡的起始地址和中断 :
static dp 83902a _priv_data_t dp 83902a _eth0_priv_data = {
base: (cyg_uint8*) 0x03210000,
interrupt: 17,
tx_buf1: 0x40,
tx_buf2: 0x48,
rx_buf_start: 0x50,
rx_buf_end: 0x80,
hardwired_esa: false,
};
然后编译 , 烧录 , 运行 . 但运行到网卡时就没有反应了 . 网卡能检测到 . 此时只好调试原代码 , 打开了 dp 83902a 驱动的开关 . 发现发送数据包时 , 就不动了 . 经过检查其代码 , 发现 mac 地址有二种方式 , 一种是从网卡 eprom 中取 , 另一种就是指定 , 于是我就把配置改成了指定 :
static dp 83902a _priv_data_t dp 83902a _eth0_priv_data = {
base: (cyg_uint8*) 0x03210000,
interrupt: 17,
tx_buf1: 0x40,
tx_buf2: 0x48,
rx_buf_start: 0x50,
rx_buf_end: 0x80,
hardwired_esa: true,
esa: {0x00, 0x05, 0x 0c , 0x04, 0x05, 0x06},
};
但效果仍然一样 . 通过多次调试和分析 , 想起了寄存器偏移量的问题 . 我在 EV40 板子上用 uclinux 驱动网卡时也是同样的问题 , 后来把 所有寄存器的偏移量 *2 就可以了 . 于是动手将全部寄存器偏移量 *2. 这样呢 , 网卡驱动就可以了 , 并能发送和接收数据包了 . 【这个呢 , 我自己也不太明白 , 是不是跟硬件的设置有关 ? 】
但 redboot 启动时 , 经过很长时间才到 redboot 提示符出来 . 原来是 redboot 启动时 , 自动通过 bootp 去取的 IP 地址 , 由于没有 bootp 服务器 , 因此要等待一段时间才出现超时 , 让我误以为死机了 .
建立好 bootp 服务器 , redboot 就正常启动 , 并且配置了 ip 地址 . 然后 ping 也通了 .
此时大功告成 .!!!

十 启动 uclinux
uclinux 编译时必须注意的是 : 由于 redboot 运行时 , 必须要是使用部分内存 , 你可以用 version 命令看出使用了什么内存 , 因此 uclinux 的入口地址就不能是 0x2000000, 我选择了 0x2010000, 前面留了 64K.
将 linux.elf 拷贝到 bootp 和 tftp 服务器的 /tftpboot 下 . 运行 :
> load – m tftp linux.elf
> go 0x2010000
注意 : 由于 redboot 串口使用 38400 波特率 , 而 uclinux 采用 9600 波特率 , 因此 uclinux 启动后出现乱码 , 没有关系 , 把波特率改成 9600, 然后重新连接终端就可以了 .

附 : 修改的patch. Patch是针对WX10板子的 . 由于我修改的ecos是 cvs 版本 , 每次checkout 的不一定一样 . 因此 patch 就不一定能够直接使用 , 另外呢 , 我的patch中也有一些我增加的调试语句 , 如果你要产品中使用 , 建议删除好了 .

1 2

立即下载:
点击下载
相关文档
 
下载说明:
  1. 未经本站明确许可,任何网站不得非法盗链及抄袭本站资源!
 

首页 | 产品介绍 | 技术支持 | 下载中心 | 技术专栏 | 关于我们 | 联系我们
电话:86-755-82798083   82796301   传真:86-755-82799007    Email:sales@foxice.net   sales6@foxice.net
在线咨询:QQ:346466907   MSN:sales6@foxice.net   ini3000@msn.com

© 2006 Foxice.net 版权所有