一 方针
公司购买了EV40开发板:CPU AT91M40800, 内存2M+2M(扩展), FLASH 2M+4M(扩展), RTl8019AS芯片, FLASH是AM29LV160TE(2M) 公司自己开发自用的板子WX10: CPU AT91M40800, 内存4M, FLASH 8M, RTl8019AS芯片, FLASH是AM29LV641(8M)及其他运用功用芯片.
我首要的作业是开发体系的驱动软件,因而需求随时修正内核驱动,并调试,因而装入和发动的速度对作业效率是比较要害的.因为用hitool烧录办法发动 uclinux内核办法需求6~10分种一次.听”嵌入式linux群”kingmonkey说可以运用redboot, 因而决议试试.
二 环境树立
redboot是ecos操作体系的一部分,也是ecos操作体系最小装备的版别.因而要运用redboot,有必要树立ecos操作体系环境. 到网站http://sources.redhat.com/ecos/
查找其装置办法,依照阐明选用了其网络办法装置,运用:
# wget –passive-ftp ftp://ecos.sourceware.org/pub/ecos/ecos-install.tcl
下载装置指令,并运转:
# sh ecos-install.tcl
装置了ecos 2.0.我把这个装置在/rh80/ecos下.ECOS_REPOSITORY便是/rh80/ecos/ecos-2.0.
运转 :
# cd /rh80/ecos
# . ecosenv.sh
设置环境变量.
因为linux操作体系中现已装置了
http://www.uclinux.org/pub/uClin … f-tools-20030314.sh
因而我装置ecos时,没有挑选装置arm-elf GNU tools东西.
三 编译redboot
因为ecos是个可装备的操作体系,因而下载装置的实践便是一个装备的库房,要编译redboot就依照需求进行装备.装备的办法运用装备东西ecosconfig, 也有图形办法装备东西的,我没有用,只用字符界面的ecosconfig.
因为EV40相似EB40, 因而我的指令是:
# mkdir rom
# cd rom
# ecosconfig new eb40 redboot
#ecosconfig import /rh80/ecos/ecos-2.0/packages/hal/arm/at91/eb40/current/misc/redboot_ROMRAM.ecm
#ecosconfig tree
#make
成果编译呈现过错.
因而置疑编译器不兼容,所以从头装置ecos,此刻挑选arm-elf东西.此刻运转. Ecosenv.sh 时,新下载的东西的途径包括在PATH中, 从头进行了redboot生成和编译,正确生成了install/bin/redboot.bin等文件.
将redboot.bin用hitool烧写到EV40的flash中,发动,没有任何反响.从头挑选redboot的ROM版:
# ecosconfig new eb40 redboot
#ecosconfig import /rh80/ecos/ecos-2.0/packages/hal/arm/at91/eb40/current/misc/redboot_ROM.ecm
#ecosconfig tree
#make
编译,烧录,运转,依然无反响.
四 装备硬件参数
因为EB40和EV40不完全相同,因而首要查看硬件参数的装备,找到装备的文件是: ecos/packages/hal/arm/at91/eb40/current/include/hal_platform_ints.h
首要是AT91_EBI装备参数表, EV40是:
_InitMemory:
.long 0x01002529 @ 0x01000000, 16MB, 2 cycles added after transfer, 16-bit, 6 wait states
.long 0x020020a1 @ 0x02000000, 16MB, 0x02002121 0 cycles added after transfer, 16-bit, 1 wait state
.long 0x03002529 @ unused
.long 0x40000000 @ unused
.long 0x02202021 @ unused ,CS 4
.long 0x02302021 @ unused ,CS 5
.long 0x60000000 @ unused
.long 0x70000000 @ unused
.long 0x00000001 @ REMAP commande
.long 0x00000006 @ 7 memory regions, standard read
.long AT91_EBI @ EBI address
.long 10f // address where to jump
WX10的装备是:
_InitMemory:
.long 0x01002529 // 0x01000000, 16MB, 2 cycles after transfer, 16-bit, 6 wait states
.long 0x020020a1 // 0x02000000, 16MB, 0 cycles after transfer, 16-bit, 1 wait state
.long 0x03002529 // unused
.long 0x30000000 // unused
.long 0x40000000 // unused
.long 0x50000000 // unused
.long 0x60000000 // unused
.long 0x70000000 // unused
.long 0x00000001 // REMAP command
.long 0x00000000 // 7 memory regions, standard read
.long AT91_EBI // External Bus Interface address
.long 10f // address where to jump
这儿我要阐明的一点是EV40和WX10的差异, EV40是用到CS6的,而WX10是不必CS6的, EV40有扩展内存,由CS4和CS5装备. EV40网卡地址是0x40010000, 而WX10的网卡地址是0x03210000.
修正了装备后, 编译,烧录,运转,依然无反响.
向kingmonkey讨叫,kingmonkey以为可能是ecos版别不是最新的原因,主张用cvs下载最新的版别. 用ecos-install.tcl是最新的稳定版,但不是最新的.
五 装置cvs版ecos
装置办法参阅网站中Anonymous CVS:
# cd /rh80/ecos
# cvs -d server:anoncvs@ecos.sourceware.org:/cvs/ecos login
口令恣意
# cvs -z3 -d server:anoncvs@ecos.sourceware.org:/cvs/ecos co -P ecos
这样呢就下载的最新的ecos,目录是/rh80/ecos/ecos, 修正ecosenv.sh中
ECOS_REPOSITORY=/rh80/ecos/ecos/packages ; export ECOS_REPOSITORY
这样呢,就运用最新用cvs下载的ecos了.本来的ecos-2.0依然保存,并运用其下面的ecosconfig等东西,不必从头去下载ecosconfig东西了.
六 从头编译redboot
装置第三节的办法从头编译redboot,但依然无法作业.因而只好去看材料和代码.而且下载了网站上预编译好的reboot.bin来试,依然没有任何反响.
仔细阅览了ecos参阅手册:
http://ecos.sourceware.org/docs-latest/ref/ecos-ref.html
中关于Installation and Testing部分中ARM/ARM7 Atmel AT91 Evaluation Boards (EBXX)的材料,它运转redboot的办法是经过angel和arm-elf-gdb的办法的,因而我就想先依照其办法试一下.
把angel烧录到EV40板上,然后编译出redboot的RAM板(上面指令中redboot_ROM.ecm改成 redboot_RAM.ecm便是).然后装置手册,成功发动了redboot! 结合前面看了redboot的一些代码,置疑缺省的EV40装备是只能在angel办法下发动的.
七 修正redboot装备
经过阅览其文件, 发现编译指令文件install/lib/target.ld中:
__reserved_bootmon = 0x01000000; . = __reserved_bootmon + 0x10000;
将运转开端方位后移了一个0x10000, 这个可能是形成不能直接flash发动的原因.经过查看,修正了多处跟这个有关的当地:
1. ecos/packages/hal/arm/at91/eb40/current/include/hal_platform_ints.h中0x1010000 à 0x100000
2. ecos/packages/hal/arm/at91/eb40/current/include/pkgconf/mlt_arm_at91_eb40_rom.h中
#define CYGMEM_SECTION_reserved_bootmon_SIZE (0x10000) 改成
#define CYGMEM_SECTION_reserved_bootmon_SIZE (0x00000)
3. ecos/packages/hal/arm/at91/eb40/current/include/pkgconf/mlt_arm_at91_eb40_rom.ldi中
CYG_LABEL_DEFN(__reserved_bootmon) = 0x01000000; . = CYG_LABEL_DEFN(__reserved_bootmon) + 0x10000;
改成:
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
修正 #i nclude cyg/io/flash_at29cxxxx.inl
为 #i nclude 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”,查到了二个成果,我把二个驱动包都下载下来了.然后别离测试了一下,但都没有成功. 我最终挑选dp83902a这种办法要点研讨.
首要下载其软件包,解压到相应的目录. 然后添加了CYGPKG_DEVS_ETH_RLTK_ISA8019AS 界说.
因为EB40没有网卡驱动,因而只好自己添加装备.详细是redboot_ROM.ecm中添加:
package -hardware CYGPKG_DEVS_ETH_RLTK_ISA8019AS current ;
package -hardware CYGPKG_DEVS_ETH_NS_DP83902A current
package CYGPKG_IO_ETH_DRIVERS current ;
然后在文件ecos/packages/devs/eth/rltk/isa8019as/current/include/devs_eth_rltk_isa8019as.inl中修正网卡的开始地址和中止:
static dp83902a_priv_data_t dp83902a_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,
};
然后编译,烧录,运转.但运转到网卡时就没有反响了.网卡能检测到. 此刻只好调试原代码,打开了dp83902a驱动的开关.发现发送数据包时,就不动了.经过查看其代码,发现mac地址有二种办法,一种是从网卡eprom中取,另一种便是指定,所以我就把装备改成了指定:
static dp83902a_priv_data_t dp83902a_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, 0x0c, 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下. 运转:
gt; load –m tftp linux.elf
gt; go 0x2010000
留意: 因为redboot串口运用38400波特率,而uclinux选用9600波特率,因而uclinux发动后呈现乱码,没有关系,把波特率改成9600, 然后从头衔接终端就可以了.
附: 修正的patch. Patch是针对WX10板子的. 因为我修正的ecos是cvs版别,每次checkout的不必定相同.因而patch就不必定可以直接运用, 别的呢,我的patch中也有一些我添加的调试句子,假如你要产品中运用,主张删去好了.