荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: dean.bbs@bbs.zju.edu.cn (丁丁), 信区: Linux
标  题: Tulip网卡驱动简析(1)
发信站: 浙江大学海纳百川 (Mon Nov 17 13:10:36 2003)
转信站: SZU!news.ccie.net.cn!ZJUBBS

发信人: windprayer (逆风飞行), 信区: LinuxDev
标  题: zz: Tulip网卡驱动简析(1)
发信站: 飘渺水云间 (Tue Sep 30 23:34:14 2003), 转信

Tulip网卡驱动简析(1)
2.4.22
引子
要在Linux下驱动程序,遇到的最大困难就是缺乏足够的资料,一个
硬件往往有成千上万个register,虽然会有一些标准,比如显卡会
遵循VESA标准等等,但是只规定了不多的寄存器,比如standard registers,
而绝大多数寄存器的作用是无法知道的。所以需要hacker精神和对硬件
的充分了解。不过兴趣是最重要的:)
网卡是一种相对简单的硬件,试以tulip为例,做一个简单分析



Tulip.h
Tulip的rx和tx(接收和发送)支持ring和list两种buffer形式,看得出
在这个驱动中,使用的是ring buffer的方法。系统一般会分配一些内存
空间作为网卡rx和tx的buffer。发送数据包时,系统先把要发送的数据
存放在tx buffer中,然后告诉网卡tx buffer的地址,再发送指令让网卡
开始发送数据。网卡接收到数据时,把数据先放在rx buffer中,然后请求
一个中断,让上层系统来处理这些数据。当然,在这之前,系统告诉了网卡
rx buffer的地址,并且让它开始接收数据。

Tulip驱动中只有这一个.h文件,挑一些重要的解释一下,其实很多东西
我也不知道是干什么用的,毕竟我也只是刚开始入门的菜鸟:)

struct tulip_chip_table
存储tulip系列芯片的信息,参见Tulip_core.c。

enum chips
各个芯片对应一个值,为了在后面对不同芯片进行不同设置时使用。

enum tulip_offsets
CSR(Command and Status Registers)是芯片中最主要的一组register,对
芯片的大多数操作都是通过读写这些寄存器来实现的。这里记录着各个寄存
器的偏移地址(加上基地址就成为实际地址了,而基地址在各个系统中是不
确定的)。

enum status_bits
CSR5是存储网卡目前状态的一个寄存器,这里定义了它的各种状态。当我们
收一个interrupt时需要读取它来取得当前硬件的状态,进而判断出中断的原
因,比如RX buffer满了,或者发送一个包结束了等等。

struct tulip_rx_desc和struct tulip_tx_desc
描述rx buffer和tx buffer信息的结构

enum desc_status_bits
定义buffer的status

#define TX_RING_SIZE    16
#define RX_RING_SIZE    32
定义了tx和rx buffer的大小

struct tulip_private
是这个文件中最重要的结构,它存储着所有关于网卡的信息。

文件中定义了三个函数:
static inline void tulip_start_rxtx(struct tulip_private *tp)
static inline void tulip_stop_rxtx(struct tulip_private *tp)
static inline void tulip_restart_rxtx(struct tulip_private *tp)
它们通过IO(应该用的是MMIO)来启动、停止和重新启动网卡。


坐在电话边,挂着QQ等mm,今天这么迟了,估计等不到了,就写到这里吧。

--
 自制 沉默 秩序 果断 节俭 勤勉 诚恳 正义 节制 整洁 冷静 贞节

※ 来源:·飘渺水云间 Freecity.dhs.org·[FROM: 10.14.41.248]


--
※ 来源:·浙江大学海纳百川站 bbs.zju.edu.cn·[FROM: dean]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店