登陆|注册|搜索|最近新帖
发帖子|共享我的资料|精华帖子|热门话题
导航: 老古开发网老古论坛首页单片机程序设计ARM技术嵌入式系统另类其他文件交流售后服务广告区域
→解决你的U-boot+ RTL8019AS 驱动问题总结

  [上一篇帖子]:请教linux启动问题您好,在下正把linux移到2410上。 /P P bootloader是
  [下一篇帖子]:提供MC13213模块开发板套件我公司提供MC13213模块开发板套件, CC2420&nb



 [ 索引]* 105283: 解决你的U-boot+ RTL8019AS 驱动问题总结

 xxc4401
  
  
  头衔:
  等级:新手上路
  威望:0
  生日:
  文章:1
  积分:54
  用户ID:76295
  登陆次数:2
  性别:男性
  状态:离线帅哥哟,离线,有人找我吗?
  门派:无门无派
  注册日期:2007-4-28
  最后登陆:2007-8-1
查看xxc4401的资料 xxc4401发表的帖子  邮箱:xxc4401@126.com  QQ:   MSN:  主页:  
 解决你的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@126com)双手欢迎你的续)。
三、移植过程中的常见问题。
(1)、byte order问题:大家都知道,主机与网络通讯时,常常要涉及到这个,写过linux socket程序的都知道hton(), ntoh()的东东。在u-boot中的RTL8019 driver不过就这几个主要的函数:
int eth_init (bd_t * bd);/*bd_t 在u-booth中定义*/
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(netc中就可见一斑,和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自己操作,驱动中一般只是读起直,BNRY的增加要程序实现,注意在eth_rx()中的实现。
(3)、93C46 EEPROM问题。嵌入式环境处于成本考虑,一般都不用之。如果RTL8019被搞成jmp model的话,大棵不比管他,信片的工作MODEL可以完全有PIN的连接方式决定 


发帖者IP:222.178.10.213
发表时间:2007年4月28日0:55:40
2007-4-28 0:55:40
  回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条



 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:  




老古开发网 asp.Net V2.0 设计:老古 2006年8月 执行时间:47毫秒 最大:7578毫秒 查询数据库11次 2008-8-29 4:05:06