荔园在线

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

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


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

发信人: adoal (U+963F U+8C46), 信区: LinuxDev
标  题: zz: Tulip网卡驱动简析(2)
发信站: 飘渺水云间 (Wed Oct  1 22:48:20 2003), 转信


Tulip网卡驱动简析(2)

国庆第一天,玩得累了,本来懒得写,但是觉得会荒废掉,而且是纪念和
mm认识半年而写,总要有点诚意的。

补充一些基本知识,计算机里很多设备都是通过PCI总线连接的,比如网卡
和显卡。显卡的问题比较复杂,它有专门的AGP,但是也会有一个PCI的信息。
开机时,BIOS得到所有设备的信息,分配地址给它们,在32位系统中,内存
最高为4G,BIOS在这4G中分配一段或几段地址给某个设备用。这些地址往往
比较高,以区别真正的内存地址。比如说:一块显卡会有两段地址,MMIO和
frame buffer。解释一下MMIO(memory map IO),以前的设备只有普通的IO地
址,但是随着寄存器数目的增加,IO不够用了,所以现在的设备一般都会有
MMIO,也就是把IO映射到内存地址上。frame buffer就是常说的显存,它也有
自己的一段地址,这样cpu就可以像访问普通内存一样,用地址访问所有设备
的寄存器和存储。PCI设备都有一个PCI table来存储信息,比如厂家编号,
(vendor id)和设备编号(device id)。还会有若干个基地址,用来存放比如
MMIO的基地址,或者EEPROM的基地址。现在的网卡都会有一个EEPROM,存储一
些信息,比如mac address,还有一些代码,可以改变网卡的工作方式等等。
标  题: zz: Tulip网卡驱动简析(2)
发信站: 飘渺水云间 (Wed Oct  1 22:48:20 2003), 转信


Tulip网卡驱动简析(2)

国庆第一天,玩得累了,本来懒得写,但是觉得会荒废掉,而且是纪念和
mm认识半年而写,总要有点诚意的。

补充一些基本知识,计算机里很多设备都是通过PCI总线连接的,比如网卡
和显卡。显卡的问题比较复杂,它有专门的AGP,但是也会有一个PCI的信息。
开机时,BIOS得到所有设备的信息,分配地址给它们,在32位系统中,内存
最高为4G,BIOS在这4G中分配一段或几段地址给某个设备用。这些地址往往
比较高,以区别真正的内存地址。比如说:一块显卡会有两段地址,MMIO和
frame buffer。解释一下MMIO(memory map IO),以前的设备只有普通的IO地
址,但是随着寄存器数目的增加,IO不够用了,所以现在的设备一般都会有
MMIO,也就是把IO映射到内存地址上。frame buffer就是常说的显存,它也有
自己的一段地址,这样cpu就可以像访问普通内存一样,用地址访问所有设备
的寄存器和存储。PCI设备都有一个PCI table来存储信息,比如厂家编号,
(vendor id)和设备编号(device id)。还会有若干个基地址,用来存放比如
MMIO的基地址,或者EEPROM的基地址。现在的网卡都会有一个EEPROM,存储一
些信息,比如mac address,还有一些代码,可以改变网卡的工作方式等等。

给mm打完电话,接着写:)

Tulip_core.c
先来看一下Linux模块的相关部分:

MODULE_AUTHOR("The Linux Kernel Team");
MODULE_DESCRIPTION("Digital 21*4* Tulip ethernet driver");
MODULE_LICENSE("GPL");
MODULE_PARM(tulip_debug, "i");
MODULE_PARM(max_interrupt_work, "i");
MODULE_PARM(rx_copybreak, "i");
MODULE_PARM(csr0, "i");
MODULE_PARM(options, "1-" __MODULE_STRING(MAX_UNITS) "i");
MODULE_PARM(full_duplex, "1-" __MODULE_STRING(MAX_UNITS) "i");

MODULE_DEVICE_TABLE(pci, tulip_pci_tbl);

module_init(tulip_init);
module_exit(tulip_cleanup);

都是设置各种参数和驱动的信息。
这部分可以看Linux Device Driver,我不多讲了。其实看一下也就大概
明白了。



static int __devinit tulip_init_one (struct pci_dev *pdev,
                          const struct pci_device_id *ent)

硬件初始化工作都是在这个函数里面做的。一般需要做几件事情:检查
vendor id和device id;设置registers,要根据不同的硬件做不同的设置;
初始化rx buffer和tx buffer,并且把地址传给网卡等等。这个函数很大,
是因为要根据不同芯片做不同设置,还要根据环境不同(x86,sparc...)来
设置。

dev->open = tulip_open;
dev->hard_start_xmit = tulip_start_xmit;
dev->tx_timeout = tulip_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT;
dev->stop = tulip_close;
dev->get_stats = tulip_get_stats;
dev->do_ioctl = private_ioctl;
dev->set_multicast_list = set_rx_mode;

这一段代码是设置Linux下网卡驱动需要实现的几个函数。分别是:打开、发送
数据、发送数据时超时的处理函数、超时的时间、关闭、取得网卡状态、ioctl、
设置接收模式(比如全双工,半双工)。

static void tulip_init_ring(struct net_device *dev)

是初始化rx tx buffer的函数。值得注意的是,这些buffer一般都有一个alignment
的问题,也就是说它的起始地址必须是某些特定的值,比如8byte的倍数,或者
32byte的倍数等等。


static int
tulip_start_xmit(struct sk_buff *skb, struct net_device *dev)

这是上层要发送数据时调用的函数。skb指向要发送的数据包,大家在这个函数
里面可以看到tx ring buffer的操作和发送指令让网卡把数据发出去。


今天就写到这里了,这个文件里还有一些关于ring buffer的操作和对于硬件的
操作,相信大家可以基本看懂大概。因为缺少相关档案,很多涉及到硬件的操作
我也只能知其然而不知其所以然。另外,好好看看驱动程序里goto的用法:)不

这是上层要发送数据时调用的函数。skb指向要发送的数据包,大家在这个函数
里面可以看到tx ring buffer的操作和发送指令让网卡把数据发出去。


今天就写到这里了,这个文件里还有一些关于ring buffer的操作和对于硬件的
操作,相信大家可以基本看懂大概。因为缺少相关档案,很多涉及到硬件的操作
我也只能知其然而不知其所以然。另外,好好看看驱动程序里goto的用法:)不
要认为goto是洪水猛兽,真正把事情搞糟的,是人类。
明天再分析一下Interrupt.c就差不多了。

mm,赶快回杭州吧,想你了:(

--
  ╭════╮╭════╮╭════╮╭════╮╭══╮

  ║╔      ║║╔      ║║╔      ║║╔      ║║╔  ║

  ║║╭═╮║╰╮  ╭╮║║║  ╭╮║║║╭═╮║║║  ║

  ║  ╰═╯║  ║  ║║║║    ║║║║  ╰═╯


今天就写到这里了,这个文件里还有一些关于ring buffer的操作和对于硬件的
操作,相信大家可以基本看懂大概。因为缺少相关档案,很多涉及到硬件的操作
我也只能知其然而不知其所以然。另外,好好看看驱动程序里goto的用法:)不

这是上层要发送数据时调用的函数。skb指向要发送的数据包,大家在这个函数
里面可以看到tx ring buffer的操作和发送指令让网卡把数据发出去。


今天就写到这里了,这个文件里还有一些关于ring buffer的操作和对于硬件的
操作,相信大家可以基本看懂大概。因为缺少相关档案,很多涉及到硬件的操作
我也只能知其然而不知其所以然。另外,好好看看驱动程序里goto的用法:)不
要认为goto是洪水猛兽,真正把事情搞糟的,是人类。
明天再分析一下Interrupt.c就差不多了。

mm,赶快回杭州吧,想你了:(

--
  ╭════╮╭════╮╭════╮╭════╮╭══╮

  ║╔      ║║╔      ║║╔      ║║╔      ║║╔  ║

  ║║╭═╮║╰╮  ╭╮║║║  ╭╮║║║╭═╮║║║  ║

  ║  ╰═╯║  ║  ║║║║    ║║║║  ╰═╯║║    ╰═╮

  ║  ╭═╮║╭╯  ╰╯║║    ╰╯║║  ╭═╮║║        ║

  ╰═╯  ╰╯╰════╯╰════╯╰═╯  ╰╯╰════╯


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


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


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

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