访问电脑版页面

导航:老古开发网手机版其他

打造你的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
栏目: [ ]

相关阅读

安森美推出新的高功率图腾柱PFC控制器,满足具挑战的能效标准

动态功耗低至60μA/MHz!助力设备超长续航,首选国民技术低功耗MCU!