No.105283 作者:xxc4401 邮件:xxc4401@126.com ID:76295 登陆:2次 文章数:1篇 最后登陆IP:222.178.10.244 最后登陆:2007/8/1 9:36:55 注册:2007/4/28 0:48:54 财富:106 发帖时间:2007/4/28 0:55:40 发贴者IP:222.178.10.213 标题:xxc4401:解决你的U-boot+ RTL8019AS 驱动问题总结 摘要:No.105283解决你的U-boot+ RTL8019AS 驱动问题总结 解决你的U-boot+ RTL8019AS 驱动问题总结 终于忙完了老板的事情,这两天闲着没有事情做却反到不自在——大约是没那个命吧!于是又想起了我的那块早已成封的SUMSUNG S3C44B0X开饭板来。我的开发板网卡电路有问题,一直都没有时间去管他,抽这个无聊的时间来搞定它,本想上网copy一个现成的,结果xxc只发现很多人问和ZLG的有源代码(倒是省了不少编码的事儿:),没有搜到讲原理的。这是我对移植源码时觉得易混淆或易搞错的地方的一个总结,帖出来,如果你真的需要,希望本问对你有帮助(支持开源精神!!!!!!!1)。。。说了这么多废话:)该进入正题了。 一、偶(还是习惯用Xxc)的开发板问题描述:EA44B0-II, 搜了一下,目前还有大量的在叫卖,如果你打算买板子,认准了,别被烫!!外型相同却一个350+,一个260+,或者多半就是我这款。网卡问题在与:(1)RTL8019上的SA0~ SA0分别与CPU 的ADDR0~ADDR4连接,显然这样只能工作于8位模式,BUT引脚IOCS16B拉高,出现矛盾了撒(其实能通过软件配置解决这个问题的),(2)SA8、SA9 高(暗示BASE_ADDR = 0x300);BD1 = 高(BASE_ADDR = 0x200),又矛盾了撒,(3)JP = 低(即jumper model),这个到是没有做,不过我还是该成了常用的jumpless model.。 二、硬件解决方案:(1)IOCS16B 悬空(2)BD1悬空(3)RTL8019AS的SA0 接到44B0X的ADDR8(任意> =ADDR5其实都可以)。该割的歌,该接的接,不要舍不得嘛:) 不管你是遇到硬件问题还是“packet too big”、 “TTTTTTTTTTT。。。”还是其他原因引起的网卡不通,呵呵十有八九都得改驱动。驱动怎么写,看DATASHEET和ZLG的驱动源代码吧,也没什么好说的。如果你的板子硬件没有问题,一般来说不过就是改一改地址偏移就ok了。但是如果你还想叫劲,想知道其所以然,或者你老觉得自己写的驱动没有错,可就是不工作。呵呵,你可以看看以下内容了(如果我错了,或你有其他想说的,xxc(email: xxc4401@126.com)双手欢迎你的续)。 三、移植过程中的常见问题。 (1)、byte order问题:大家都知道,主机与网络通讯时,常常要涉及到这个,写过linux socket程序的都知道hton(), ntoh()的东东。在u-boot中的RTL8019 driver不过就这几个主要的函数: int eth_init (bd_t * bd);/*bd_t 在u-boot.h中定义*/ extern int eth_send (volatile void *packet, int length); extern int eth_rx (void); NetReceive (NetRxPackets[0], rxlen); 这里要说的其实只是eth_send()中的*packet。读源码知,packet 指向TCP/IP协议栈中分配的收发BUFFER(net.c中就可见一斑,和linux中的SKB处理差不多),在上层协议分配PKTBUF时,有意分配了5*1536的连续区域,第一个用于NetTxPacket, 后4个用与 NetRxPacket, 为什么是1536呢?ethernet IP包 <= 1500 + 14,所以Buffer> = 1514, 而1536正好是第一个4字节对起的数字。打印*packet,你就知道,上曾协议已经将数据包按网络字节顺序(big-endian)存好了,其实想想你在socket编程时为什么显示使用hton\ntoh(),就知道理应这样哈。所以这里要说的是:这个byte order与网卡完全无关。有关的是:1)rtl8019as的DCR(BOS),0:little endian; 1: big endian; 不是无关末?这个指的什么?其实RTL8019AS接受到FRAME后,自动添加“接受状态(1B)+下一页指针(1B)+以太帧长度(2B)” 接受状态 == 当前RSR; 下一页指针 == 当前CURR; 以太帧长度 == 含FCS的帧长度。DCR(BOS)应该是指这四个BYTE的BYTE ORDER。这一点在eth_rx (void);中解吸帧前4B时可能对你有用。 (2)、CURR和BNRY的初始化问题。有网友提到,到底是初始化 CURR == BNRY 还是CURR == BNRY+1。其实这个只是数据结构中循环队列的操作问题。都能实现,只是操作有点点区别罢了。接受BUFFER,被实现为一个循环队列。CURR由chip自己操作,驱动中一般只是读起直,BN ......
>>返回讨论的主题
|