zhyxue
驱动牛犊
驱动牛犊
  • 注册日期2002-10-09
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:2819回复:3

请教以太网驱动开发的几个问题!

楼主#
更多 发布于:2002-10-18 09:50
我有几个问题不太明白,请那位高人不吝赐教.
1 MAC地址是从那里获得的。有的资料说从BSP得到,这样的话,使用同一个BSP开发的东东,MAC地址不就一样了吗?实际上好像我和几个同事各自有一个板子,上面的mac地址就一样。
  也有说是从eeprom得到的,难道每个mac芯片上必须挂一个eeprom吗?
2 mac寄存器中multicast寄存器怎么设定?根据什么?
motif
驱动牛犊
驱动牛犊
  • 注册日期2001-10-03
  • 最后登录2009-01-08
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-10-19 21:35
关于网卡驱动程序中与mac地址有关的部分如下:
1,在attach()或probe()函数中从网卡的eeprom读取该块网卡的唯一地址(在以下的文字中将它称为EthernetID)到驱动程序拥有的一个变量(在以下的文字中将它称为dev_addr)中,

2,在open()函数中,驱动程序将保存在dev_addr中的EthernetID复制到网卡I/O空间中的MAC寄存器,也有网卡在其进行hardware reset后,网卡硬件自动从eeprom中将EthernetID复制到MAC寄存器。

3,IP协议程序中的输出函数调用选路输出函数,选路输出函数利用ARP协议(IPv4)得到下一眺(next hop)的mac地址,然后构造ethernet帧头,将源和目的mac地址填充(在linux中调用的是ether_header),最后调用网卡的输出函数(在linux中是hard_start_xmit)。在驱动程序的输出函数中,ethernet帧头已经构造好了。

2中的MAC寄存器很关键。网卡硬件中的程序(microcode,fireware,硬件电路?具体的我不清楚了)就是根据MAC寄存器中的值来判断共享介质上的以太帧是否属于自己。而eeprom中的EthernetID可以被驱动程序忽略,甚至可以被擦写。

关于multicast寄存器的填写,需要参照网卡的datasheet和programming guide,一般是将你的multicast address通过一个hash函数,然后再在multicast寄存器的相应位置位,这个hash函数各种网卡可能不同。

[编辑 -  10/19/02 by  motif]
fromnight
驱动牛犊
驱动牛犊
  • 注册日期2002-10-14
  • 最后登录2004-09-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-10-21 17:01
1. 首先要问一下zhyxue兄用的是买来的网卡还是自己设计的网络适配?
如果是前者,一般网卡上都有一个eeprom用于存放MAC地址,系统启动时网卡从这儿读取。这个地址由网卡的生产商提供。driver也使用这个地址。当然写driver的时候可以覆盖这个地址,但是注意不要与网络中的其他设备的mac地址冲突。
如果自己设计硬件,自己可以指定一个地址(也要注意冲突问题,实际上mac地址是由某个机构分配的,开发的时候就马虎一点),一般也是把mac地址烧在某个rom地址上,一个产品的不同的板子要烧不同的mac地址。bsp在初始化的时候从这个地址读取这个值,这样相同的bsp运行在不同的板子上就会有不同的mac地址。
2. 关于mulicast寄存器的设定,基本如motif兄所说,该寄存器的作用像一个查找表,收到的mac帧的mac地址经过一个算法后,在这个表中查找以确定是否接受这个帧。
3. 欢迎送份......
xxxxx xxxxx x x x xxxx xxxx x x x x x x
motif
驱动牛犊
驱动牛犊
  • 注册日期2001-10-03
  • 最后登录2009-01-08
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-10-22 11:02
如果自己设计硬件,自己可以指定一个地址(也要注意冲突问题,实际上mac地址是由某个机构分配的,开发的时候就马虎一点),一般也是把mac地址烧在某个rom地址上,一个产品的不同的板子要烧不同的mac地址。bsp在初始化的时候从这个地址读取这个值,这样相同的bsp运行在不同的板子上就会有不同的mac地址。


如果是自己在rom中设的地址,一定要在网卡的驱动中将从rom中读取的地址写到网卡的MAC寄存器中,否则无法接收帧。
游客

返回顶部