打造你的44BSP-玩转网络
内容导读:
转载:http://bbs.eepw.com.cn/dispbbs.asp?BoardID=3&ID=27451&replyID=&skin=1
原作者:eking
打造你的44BSP-玩转网络
====================
基本的操作系统起来以后,接下来就应该打通系统的经脉——网络了。44B0开发板搭配的一般是NE2000兼容网卡,我用的就是RTL8019AS。
以下就是打通系统经脉的step by step,其中还有一些我不太明白的地方,请大家补充
1.NE2000 END驱动硬件说明
--------------------
SNG44BSP的NE2000使用S3C44B0外部中断EINT1,中断为高电平触发,故S3C44B的中断应配置成上升沿触发。
SNG44BSP的NE2000使用的芯片为RTL8019AS,它比一般NE2000兼容网口多了一些自定义设置,需要在网络初始化配置时设置,如中断使能、工作模式等。具体参考RTL8019 DATASHEET。
SNG44BSP Ne2000数据位为8位、LITTLE ENDIAN、RT JUMPLESS、NO PROM;地址为0x60A0000,地址模式为0x300,且由于硬件连接的原因NE2000的地址应进行变换。
2.NE2000 END驱动程序设计
--------------------
SNG44BSP是由WINDRIVER的ne2000 END驱动修改而来的,主要修改的配置说明如下:
2.1 ne2000End.c
1)地址转换
由于SNG44BSP开发板的NE2000地址线有交换,所以对网卡的读写需进行地址转换才能正常工作。
在驱动的外部总线读写宏SYS_xx_xxxx()中使用NEADDR()进行地址转换。NEADDR定义在ne2000End.h
#ifndef SYS_OUT_CHAR
#define SYS_OUT_CHAR(pDrvCtrl,addr,value) \
sysOutByte(NEADDR((pDrvCtrl)->base + (UINT) (addr)), (value))
#endif
#ifndef SYS_IN_CHAR
#define SYS_IN_CHAR(pDrvCtrl,addr,pData) \
(*(pData) = (UCHAR) sysInByte(NEADDR((pDrvCtrl)->base +
(UINT) (addr))))
#endif
#ifndef SYS_IN_WORD_STRING
#define SYS_IN_WORD_STRING(pDrvCtrl,addr,pData,len) \
(sysInWordString (NEADDR((pDrvCtrl)->base + (UINT) (addr)), \
(UINT16 *)(pData), (len)))
#endif
#ifndef SYS_OUT_WORD_STRING
#define SYS_OUT_WORD_STRING(pDrvCtrl,addr,pData,len) \
(sysOutWordString (NEADDR((pDrvCtrl)->base + (UINT) (addr)), \
(UINT16 *) (pData), (len)))
#endif
2)RTL8019AS特定初始化步骤
a)rtl8019_reset()
向RESET端口写入0x00进行复位;
循环检测INTSTAT的ISTAT_RST位,为1说明复位成功退出循环;
INTSTAT写入0xff清零;
在RTL8019_INIT进行RTL8019特定初始化。
b)RTL8019_INIT
进入PAGE3;
9346CR写入0xcf以允许对CONFIGx的操作;
配置CONFIG1以允许IRQ、选择IRQ为INT0、选择地址为300H;
配置CONFIG2为0x00;
配置CONFIG3以禁止PNP、启动全双工模式、LED状态表示;
9346CR写入0x0f禁止对CONFIGx操作;
退出PAGE3;
3)NE2000收发函数修改(not necessary)
a)ne2000DataIn()
远程DMA传送前清除INTSTAT的RDC位;
远程DMA传送结束后清除INTSTAT的RDC位;
b)ne2000DataOut()
远程DMA传送前清除INTSTAT的RDC位;
远程DMA传送结束后循环检测INTSTAT的RDC位,为1传送完成;
再次清除INTSTAT的RDC位;
c)ne2000EnetAddrGet()
同ne2000DataIn()
2.2 ne2000End.h
1)定义地址转换宏NEADDR()
#define NE2000_BASE 0x60a0000
#define ODD_OFFSET 0x20
#define NEADDR(port) (((port)&1)?(ODD_OFFSET-1+(port)):((port)))
2)定义RTL8019特殊寄存器
2.3 configNet.h
1) SNG44BSP_LOAD_FUNC_0
SNG44BSP_LOAD_FUNC_0定义END驱动的入口函数,这是END驱动对外部的唯一接口,系统由此函数加载END driver。
2) SNG44BSP_LOAN ??
默认值为1
3) SNG44BSP_LOAD_STRING_0
SNG44BSP_LOAD_STRING_0定义END驱动的初始化参数,格式为<adrs>:<vecNum>:<intL
vl>:<byteAccess>:<usePromEnetAddr>:<offset>其中
<adrs> - device base address
<vecNum> - interrupt vector number (NOTE: must in hex)
<intLvl> - interrupt level (usually the same as <vecNum>)
<byteAccess> - 1: NIC work in 8bit 0: 16bit
<usePromEnetAddr> - 1: get mac addr from PROM
<offset> - 相对缓冲区起始地址的偏移量,需根据ne2000_device的packetBuf设置,若
运行时发生Data abort,需调整此参数
如: #define SNG44BSP_LOAD_STRING_0 "0x60a0000:18:18:1:0:2" 定义ne2000设备地址为0x60a0000;中断向量和中断号24(0x18);ne2000工作于8bit模式;不从PROM读取MAC地址; 2BYTE字节对齐。
4) 定义网络设备列表endDevTbl[]
END_TBL_ENTRY endDevTbl [] =
{
#ifdef INCLUDE_SNG44BSP_END
{ 0, SNG44BSP_LOAD_FUNC_0, SNG44BSP_LOAD_STRING_0,
SNG44BSP_LOAN , NULL, FALSE},
#endif /* INCLUDE_SNG44BSP_END */
{ 0, END_TBL_END, NULL, 0, NULL, FALSE},
};
第一个参数:此网络设备号unit,编号0,1,2……
第二个参数:END加载函数
第三个参数:END加载参数
第四个参数:SNG44BSP_LOAN ??
第五个参数:NULL ??
第六个参数:标志驱动是否已经加载,FALSE由系统加载,TRUE用户加载
2.4 sysLib.c
1)实现系统存取外部数据总线的函数sysInByte、sysInWord、sysInLong、sysInWordString、sysInLongString、sysOutByte、sysOutWord、sysOutLong。
2)增加系统MAC地址变量ne2000EnetAddr[],设置为ETHERNET_MAC_ADRS
2.5 SNG44B.h
定义系统缺省MAC地址ETHERNET_MAC_ADRS
2.6 config.h
1) 定义系统的启动参数(从网络通过FTP获取kernel)
# define DEFAULT_BOOT_LINE "ene(0,0) eking:vxWorks " \
"h=192.168.1.31 " \
"e=192.168.1.11:ffffff00 " \
"u=target " \
"pw=ok " \
"tn=44b0"
ene(0, 0):END设备名ene,unit number为0,processor number为0
eking:vxWorks:主机名eking,文件名vxWorks
h=192.168.1.31:主机ip地址
e=192.168.1.11:ffffff00:目标机ip地址和地址掩码
u=target:FTP用户名
pw=ok:FTP密码
tn=44b0:目标机名
2) 定义加载网络模块宏和包含的模块
/* Enhanced Network Driver (END) Support */
#define INCLUDE_NETWORK
#ifdef INCLUDE_NETWORK
# define INCLUDE_UDP
# define INCLUDE_TCP
# define INCLUDE_ICMP
# define INCLUDE_IGMP
# undef INCLUDE_PPP
#endif
#define INCLUDE_END
#undef END_OVERRIDE /* define if you are using old boot ROMs. */
#ifdef INCLUDE_END
# define INCLUDE_SNG44BSP_END /* Include Ethernet driver */
#endif /* INCLUDE_END */
2.7 makefile
添加MACH_EXTRA = ne2000End.o以编译ne2000End模块。
标签:
来源: 作者: 时间:2006/9/25 16:50:53