Linux下网卡驱动程序
- 格式:pdf
- 大小:538.09 KB
- 文档页数:34
linux安装网卡驱动教程在Linux系统中,网卡驱动是一个必需的组件,它允许计算机与网络相连,进行数据的传输和通信。
虽然大多数Linux发行版会自动安装一些常用的网卡驱动,但某些特殊型号的网卡可能需要手动安装对应的驱动程序。
下面是一个详细的Linux安装网卡驱动的教程,帮助你完成这个过程。
1. 首先,你需要确定你的网卡型号和型号。
可以通过以下命令获取:```lspci | grep Ethernet```这将列出系统中所有的以太网适配器,包括网卡的型号和型号。
2. 一旦你确定了网卡的型号和型号,你可以在厂商的官方网站或者第三方驱动程序网站上查找和下载对应的驱动程序。
确保选择与你的Linux发行版和内核版本兼容的驱动程序。
3. 下载驱动程序后,将其保存在你的计算机上的一个可访问的位置,比如家目录。
4. 打开终端,在命令行中输入以下命令以进入驱动程序所在目录:```cd ~/下载```这里假设你将驱动程序保存在`~/下载`目录下。
如果你将其保存在其他目录,请将命令中的路径替换为实际位置。
5. 解压驱动程序文件。
这可以通过以下命令完成:```tar zxvf 驱动程序文件名.tar.gz```这里的`驱动程序文件名`应该是你下载的驱动程序文件的实际名称。
6. 进入驱动程序文件夹。
这可以通过以下命令完成:```cd 驱动程序文件夹名```这里的`驱动程序文件夹名`是解压后的驱动程序文件夹的实际名称。
7. 阅读驱动程序的安装说明文档。
通常情况下,驱动程序的文件夹中都会包含一个README文件或者INSTALL文件,其中提供了安装驱动程序所需的具体步骤和说明。
8. 一般来说,安装驱动程序的第一步是编译驱动程序的源代码。
在终端中输入以下命令以编译驱动程序:```make```这将根据驱动程序的源代码编译出可执行的二进制文件。
9. 安装编译好的驱动程序。
在终端中输入以下命令以安装驱动程序:```sudo make install```这需要管理员权限,所以你可能需要输入管理员密码。
换了linux系统后发现无线不能使用,很是苦恼,于是在网上找到各位大神的做法,终于成功安装。
下面给大家介绍一下。
本例以安装Fedora 14无线网卡驱动为例。
参考文章/Linux/2011-05/35366.htm。
首先在/support/802.11/linux_sta.php 上下载32位的驱动,下载完成之后进入到下载的文件夹下#cd ~/Downloads按照readme的做法,新建一个文件夹,并且将该压缩文件移动到新建的文件夹当中#mkdri hybrid_wl#mv hybrid-portsrc-x86_32-v5.60.48.36.tar.gz hybrid_wl/进入文件夹,进行解压,#cd hybrid_wl/#tar -zxvf hybrid-portsrc-x86_32-v5.60.48.36.tar.gz由于自述文件当中的做法是指定解压目录,因此为了保险,再把这个压缩文件移动到上一级目录#mv hybrid-portsrc-x86_32-v5.60.48.36.tar.gz ../根据自述文件的说法(The cards with the following PCI Device IDs are supported with this driver.),查看支持的版本# lspci -n | grep 14e40c:00.0 0280: 14e4:4315 (rev 01)BRCM PCI PCI DellProduct Name Vendor ID Device ID Product ID------------- ---------- --------- -----------4311 2.4 Ghz 0x14e4 0x4311 Dell 13904311 Dualband 0x14e4 0x4312 Dell 14904311 5 Ghz 0x14e4 0x43134312 2.4 Ghz 0x14e4 0x4315 Dell 13954313 2.4 Ghz 0x14e4 0x4727 Dell 15014321 Dualband 0x14e4 0x4328 Dell 15054321 Dualband 0x14e4 0x4328 Dell 15004321 2.4 Ghz 0x14e4 0x43294321 5 Ghz 0x14e4 0x432a4322 Dualband 0x14e4 0x432b Dell 15104322 2.4 Ghz 0x14e4 0x432c4322 5 Ghz 0x14e4 0x432d43224 Dualband 0x14e4 0x4353 Dell 152043225 2.4 Ghz 0x14e4 0x4357发现确实是支持Dell这款无线网卡的4312 2.4 Ghz 0x14e4 0x4315 Dell 1395接下来就是对驱动进行编译了,在hybrid_wl目录下执行以下命令#make clean#make**注意,如果出现以下这样的error,则是因为内核源码的问题,1:查看自己是否安装了kernel-devel-2.6……包,如果没有装包先把包装上试试2:装完这个包还不行的话就需要你自己更新一下内核源码,编译更新的内核[root@ChinaUnix hybrid-wl]# make cleanKBUILD_NOPEDANTIC=1 make -C/lib/modules/`uname -r`/build M=`pwd` cleanmake: *** /lib/modules/2.6.35.6-45.fc14.i686/build: No such file or driectory. Stop.make: *** [clean] Error2[root@ChinaUnix hybrid-wl]# makeKBUILD_NOPEDANTIC=1 make -C /lib/modules/`uname -r`/build M=`pwd`make: *** /lib/modules/2.6.35.6-45.fc14.i686/build: No suchfile or driectory. Stop.make: *** [all] Error 2完成之后,可以在目录下看到wl.ko 文件,如果以前安装过驱动的话,那么还需要对安装过的驱动进行清理。
1.1下载驱动程序一、首先弄清楚当前使用的是什么版本的Linux,如:Redhat9.0、Freda core5等。
Linux用的是什么版本的内核,可以用uname –a得知内核版本号。
二、使用的是什么接口类型的无线网卡,常见的接口类型有PCI (台式机)、Cardbus/PCMCIA(笔记本)、USB(台式机、笔记本)等。
三、无线网卡使用的是哪一种类型的芯片,判断方法如下,到相关网站下载与其相对应的驱动程序。
常用的无线网卡驱动及其支持的芯片类型和接口类型如下表1所示。
PCMCIA卡:将无线网卡插入笔记本电脑中,用命令lspci可以看到芯片类型,如:Realtek Semiconductor Co.. Ltd, RTL8180L802.11b MAC (rev 20)其中RTL8180L即为网卡芯片类型,用参数v可以看到更详细的信息。
USB卡:用命令lsusb可以看到芯片类型(fc5没有此命令)。
通过其它方法查找。
驱动程序芯片类型接口类型官方网站下载页Linux-wlan-ng Prism2/2.5/3 Cardbus/PCI/USB /download.shtml Madwifi Atheros系列Cardbus/PCI /islsm ISL38XX USB/PCI http://jbnote.free.fr/prism54usb/index.html表1:网卡驱动程序有关信息1.2驱动程序的安装每款驱动的安装方法各不相同,阅读INSTALL文档,获得驱动程序的具体安装方法及系统内核要求。
阅读驱动程序附带的README文档,获得有关此驱动的详细信息,如驱动所支持的网络模式、接口类型、所包含的模块的功能及无线网卡的配置等。
下面是安装网卡驱动程序的一般步骤:编译网卡驱动程序#make安装驱动程序模块#make install加载模块#modprobe 主模块名安装好驱动后插入无线网卡,命令iwconfig可以查看驱动是否加载成功,如果出现新的设备名,则说明驱动已经装上并且能够识别出无线网卡。
linux下安装编译网卡驱动的方法你还在为不知道linux下安装编译网卡驱动的方法而不知所措么?下面来是小编为大家收集的linux下安装编译网卡驱动的方法,欢迎大家阅读:linux下安装编译网卡驱动的方法安装linux操作系统后发现没有网卡驱动,表现为system → Administration → Network下Hardware列表为空。
以下为安装编译网卡驱动的过程,本人是菜鸟,以下是我从网上找的资料进行整理,并实际操作的过程,仅供借鉴。
一.检测linux系统内核版本和网卡类型,相关命令如下:uname -r 查看linux内核版本(uname -a 可显示所有信息)lsmod 设备加载情况ls /usr/share/hwdata 查看硬件设备lspci 查看pci网卡设备ethernet controller 厂商和型号,modprobe **** ****为网卡型号,例如modprobe RTL8101E ,如果出错,说明模块不存在,该型号不识别我在这一步时查找不到网卡型号,无奈只能由同时采购的其他相同型号预装win7的电脑下查看网卡型号,是个笨办法,嘿嘿……找到网卡型号后就到驱动之家下载了相应网卡的linux驱动,这些需要根据自己的实际情况下载,不多说了,重点是后面。
二.下载网卡驱动Intel_e1000e-1.9.5.zip 为我下载的所需的网卡驱动,这个在linux下需自己编译.三.安装网卡驱动1.检测编译需要用到内核的源代码包和编译程序gcc。
所以如果没有的话,要先装。
[root@localhost ~]# rpm -qa|grep kernelkernel-xen-2.6.18-8.el5kernel-xen-devel-2.6.18-8.el5kernel-headers-2.6.18-8.el5[root@localhost ~]# rpm -qa|grep gccgcc-c++-4.1.1-52.el5libgcc-4.1.1-52.el5gcc-4.1.1-52.el5gcc-gfortran-4.1.1-52.el5如果缺少kernel-xen-devel-2.6.18-8.el5,可以去安装光盘的/Server/目录下,找到kernel-xen-devel-2.6.18-8.el5.i686.rpm 文件安装。
Linux网卡驱动程序编写©OldLinux论坛-- 有关早期Linux内核代码发展的论坛。
uz4$])Linux操作系统网络驱动程序编写%A一.Linux系统设备驱动程序概述u51.1 Linux设备驱动程序分类%Vp}1.2 编写驱动程序的一些基本概念*I二.Linux系统网络设备驱动程序"[`]K2.1 网络驱动程序的结构H2.2 网络驱动程序的基本方法U?+2.3 网络驱动程序中用到的数据结构IKo2.4 常用的系统支持v[ZEeu三.编写Linux网络驱动程序中可能遇到的问题/oY3.1 中断共享l@FZkg3.2 硬件发送忙时的处理pZw3.3 流量控制(flow control) $:p.3.4 调试W!07四.进一步的阅读]G_0Q五.杂项Z!h©OldLinux论坛 -- 有关早期Linux内核代码发展的论坛。
")e ©OldLinux论坛-- 有关早期Linux内核代码发展的论坛。
tej$©OldLinux论坛-- 有关早期Linux内核代码发展的论坛。
B12.2©OldLinux论坛-- 有关早期Linux内核代码发展的论坛。
c‘<ae一.Linux系统设备驱动程序概述c1.1 Linux设备驱动程序分类eiD)|wLinux设备驱动程序在Linux的内核源代码中占有很大的比例,源代码的长度日益增加,主要是驱动程序的增加。
在Linux内核的不断升级过程中,驱动程序的结构还是相对稳定。
在2.0.xx到2.2.xx的变动里,驱动程序的编写做了一些改变,但是从2.0.xx的驱动到2.2.xx 的移植只需做少量的工作。
ASyLinux系统的设备分为字符设备(char device),块设备(block device)和网络设备(network device)三种。
字符设备是指存取时没有缓存的设备。
块设备的读写都有缓存来支持,并且块设备必须能够随机存取(random access),字符设备则没有这个要求。
基于Linux 操作系统的网卡驱动程序及其安装刘金梅1周 彤1李紫薇2刘立军3(1.北华航天工业学院电子工程系,河北廊坊065000; 2.唐山建龙实业有限公司,河北唐山064200;3.廊坊开发区昂瑞自动化工程有限公司,河北廊坊065000)摘 要:本文介绍了Linux 操作系统中网络设备和驱动程序的工作原理,针对不同的网卡提出了配置T CP/IP 网络参数的方法,并重点对于网卡安装过程中出现的一些问题进行了分析,提出了相应的解决办法。
关键词:L inux ;网卡;驱动程序中图分类号:T P393 文献标识码:A 文章编号:1673-7938(2008)03-0019-04收稿日期:2008-03-28作者简介:刘金梅(1977-),女,助教,硕士,河北秦皇岛人,从事嵌入式系统研究与开发。
随着Linux 的迅速普及和发展,越来越多的企业和个人开始使用Linux 系统,而Linux 以其系统强大的功能、对多用户的支持和运行稳健的特性越来越多的应用在网络方面,很适合为Web Server 或网络数据库管理系统等服务提供操作系统平台[1]。
但网卡驱动程序的加载与配置比较特殊,Linux 的支持函数少,只能依赖内核中的函数,许多操作需要自己编写,而且调试也非常不方便,因此在Linux 下进行网卡的加载和配置的设计就显得十分重要。
1 Linu x 系统网络设备在Linux 系统中有3种类型的设备:字符设备、块设备和网络设备[2]。
其中前两种设备的驱动都是以文件形式存在于/dev 目录下,可以在用户进程中对其进行读写操作。
而网络设备驱动提供的网络界面并未存在于文件系统之中。
在使用网络设备时,用户进程不再是以文件读写的方式对设备进行操作,而是通过针对特定协议的界面与操作系统的网络协议软件进行通信。
首先,网络设备在Linux 下有其不同于其它设备的处理方式[3]。
Linux 对所有的网络设备进行了抽象并定义了一个统一的概念,称之为接口(inter -face)。
万方数据加压过滤机卸料原理及常见电气故障分析王建斌(神华准格尔能源有限公司选煤厂)中图分类号:TD928.2文献标识码:A文章编号:1009曲14】((2011)03—0081-011一料原理加压过滤机是通过排料闸板进行卸料的。
排料闸板包括2个闸板,一个上料仓,一个下料仓闸板由液压油缸推动。
起始位置时,上闸板关闭,下闸板打开,在上料舱内聚集煤饼。
延时5s下闸板Ls205关闭。
限位开关S12返回下闸板关闭信号后,下密封圈进行充气,密封圈充气,此时充气完毕。
排气阀PcV2ll关闭。
到位后0V212打开对中间仓进行充气。
中间仓气体压力与上料仓气体压力相等后,等待料位计LIs^20l达到设定料位值或设定时间。
如果料位值或设定时间满足条件则上密封圈排气,上密封圈排气压力pic214为零后,上闸板Ls204打开,上闸板限位开关s11返回打开信号。
此时上料仓内的物料落入中间仓。
延时5s后上闸板关闭。
当上闸板限位开关s12返回上闸板关闭到位信号后,上密封圈进行充气。
密封圈充气压力pic214达到6.0,迸气阀OV212关闭,到位后PcV211打开对中间仓进行排气。
中间仓气体压力等于大气压力,即与下料仓气体压力相等后,下密封圈排气。
当pic215压力为零时,下闸板Ls205打开,下闸板限位开关s11返回打开信号。
此时中间仓内的物料落入下料仓,卸料完成。
此后上下闸板将进行科学论坛N●I新的循环。
2常见电气故■分析l、限位开关故障:当限位开关故障时,将显示Ls204故障。
注:当下闸板打开限位开关s儿虚接时,即信号时有时无则上下闸板同时打开,故障停机.2、Pc、r211故障:现象为压力罐内压力低,可能是211阀定位计损坏或定位位置不对,或是阀体损坏。
现象为2儿阀排气速度慢(程序中设定2ll排气时,中间仓压力要在10s内降到02.bar以下),则可能是排气管堵,211定位计损坏或定位位置不对,或是0v212阀损坏使进气压力与排气压力达到一个平衡。
linux网卡驱动安装方法1、查找网卡芯片,确立网卡型号,并确立linux内核版本,到对应的网卡官网下载驱动。
2、安装步骤(这里以RTL8110为例)1)cd到网卡驱动所在文件夹,解压:# tar vjxf r8168-8.aaa.bb.tar.bz2//关于解压命令查看《Linux下软件包的解压方式大全》2)进入文件夹:# cd r8168-8.aaa.bb3)安装(需安装kernel-source,否则会失败):# make clean modules (as root or with sudo)# make install# depmod -a# insmod ./src/r8168.ko (or r8168.o in linux kernel 2.4.x)4)通过以下指令查看驱动是否已经启动.# lsmod | grep r8168# ifconfig -a如果能看到类似“ethX”的结果输出, 说明已成功驱动网卡.5)配置并激活ethX.# ifconfig ethX up,where X=0,1,2,...3、附realtek RTL8168B驱动readme文档:<Linux device driver for Realtek Ethernet controllers>This is the Linux device driver released for RealTek RTL8168B/8111Band RTL8168C/8111C, Gigabit Ethernet controllers with PCI-Expressinterface.<Requirements>- Kernel source tree (supported Linux kernel 2.6.x and 2.4.x)- For linux kernel 2.4.x, this driver supports 2.4.20 and latter.- Compiler/binutils for kernel compilation<Quick install with proper kernel settings>Unpack the tarball :# tar vjxf r8168-8.aaa.bb.tar.bz2Change to the directory:# cd r8168-8.aaa.bbIf you are running the target kernel, then you should be able to do :# make clean modules (as root or with sudo)# make install# depmod -a# insmod ./src/r8168.ko (or r8168.o in linux kernel 2.4.x)You can check whether the driver is loaded by using following commands.# lsmod | grep r8168# ifconfig -aIf there is a device name, ethX, shown on the monitor, the linuxdriver is loaded. Then, you can use the following command to activate the ethX.# ifconfig ethX up,where X=0,1,2,...<Set the network related information>1. Set manuallya. Set the IP address of your machine.# ifconfig ethX "the IP address of your machine"b. Set the IP address of DNS.Insert the following configuration in /etc/resolv.conf.nameserver "the IP address of DNS"c. Set the IP address of gateway.# route add default gw "the IP address of gateway"2. Set by doing configurations in /etc/sysconfig/network-scripts/ifcfg-ethX for Redhat and Fedora, or /etc/sysconfig/network/ifcfg-ethX for SuSE. There are two examples to set network configurations.a. Fix IP address:DEVICE=eth0BOOTPROTO=staticONBOOT=yesTYPE=ethernetNETMASK=255.255.255.0IPADDR=192.168.1.1GA TEWAY=192.168.1.254BROADCAST=192.168.1.255b. DHCP:DEVICE=eth0BOOTPROTO=dhcpONBOOT=yes<Modify the MAC address>There are two ways to modify the MAC address of the NIC.1. Use ifconfig:# ifconfig ethX hw ether YY:YY:YY:YY:YY:YY,where X is the device number assigned by Linux kernel, andYY:YY:YY:YY:YY:YY is the MAC address assigned by the user.2. Use ip:# ip link set ethX address YY:YY:YY:YY:YY:YY,where X is the device number assigned by Linux kernel, andYY:YY:YY:YY:YY:YY is the MAC address assigned by the user.<Force Link Status>1. Force the link status when insert the driver.If the user is in the path ~/r8168, the link status can be forcedto one of the 5 modes as following command.# insmod ./src/r8168.ko speed=SPEED_MODE duplex=DUPLEX_MODE autoneg=NWAY_OPTION,whereSPEED_MODE = 1000 for 1000Mbps= 100 for 100Mbps= 10 for 10MbpsDUPLEX_MODE = 0 for half-duplex= 1 for full-duplexNW AY_OPTION = 0 for auto-negotiation off (true force)= 1 for auto-negotiation on (nway force)For example:# insmod ./src/r8168.ko speed=100 duplex=0 autoneg=1will force PHY to operate in 100Mpbs Half-duplex(nway force).2. Force the link status by using ethtool.a. Insert the driver first.b. Make sure that ethtool exists in /sbin.c. Force the link status as the following command.# ethtool -s ethX speed SPEED_MODE duplex DUPLEX_MODE autoneg NWAY_OPTION,whereSPEED_MODE = 1000 for 1000Mbps= 100 for 100Mbps= 10 for 10MbpsDUPLEX_MODE = half for half-duplex= full for full-duplexNW AY_OPTION = off for auto-negotiation off (true force)= on for auto-negotiation on (nway force)For example:# ethtool -s eth0 speed 100 duplex full autoneg on本文出自:中国E动网[]中国领先互联网接入服务提供商!11年品质保障!-- 中国E动网[]。
Linux下8019网卡驱动程序福建鑫诺通信有限公司陈光平(chenggp_fj@)本文以S3C44B0的CPU为例,详细解析了linux下RTL8019网卡驱动程序工作原理,其间知识大多来源互联网络,特别是浙大潘纲的论文,在此不一一列出,此文目的只是让嵌入式linux爱好者得到更多网卡驱动的资料,并获得交流机会,不足之处请指正(一)、硬件相关部份1、CPU与网卡的连接方式(s3c44B0 CPU) (RTL 8019网卡)CPU与网卡接线图上图为S3c44b0CPU和网卡的接线图,此接法并非固定,如接法不同,则牵涉到很多相应的改动,下面会详细分析不同之处从硬件部门得到:网卡在CPU的存储空间上接BANK4,即0x08000000(看44B0手册)外部中断号为:EXTINT3 (irqs.h文件获得值为22)上面两个值可以查CPU手册,或询问硬件设计人员由上图可以知道以下数据:(1)、网卡与CPU地址线连接错开8位(A0接A8)(2)、总共连线,其实4根就足够用了,因为每根线可以译码4个地址空间,总共是16个地址空间,每个地址空间对应一个寄存器地址,而8019总共就是16个寄存器(3)、一般是跳线模式,不使用9346芯片1-1 基地址算法首先8019的基地址是300H(见RTL8019芯片资料:选择IO总线地址),但是有些硬件已在芯片中做过了偏移,比如我们的网卡已做了处理,基址已偏移到0x08000000,那么因为网卡A0接CPU的A8,表示基地址左移8位,下一个寄存器reg0的地址就是:0x08000100(0000,0000,0001 0001,0000,0000)还不理解的话我们看另一种接法:(S3C44B0 CPU ) (RTL8019芯片) 这种接法地址线只错开一位,我们来看(假如仍使用BANK4):A1 A0,为何A0不能接A0,因为8019是共用数据线和地址线的,如果A0接A0的话,无法配置8位和16位方式现在可以看到,基地址为300H 的话,左移一位(A0->A1),就是600H,于是算出基地址为: 0x08000600,下一个寄存器的地址就是0x08000602,因为都左移一位,相当于x2了2、8019网卡的工作原理本节主要讨论一下8019是怎么工作的,如下图:(本地DMA ) (远端DMA )(图2 与DMA 有关的寄存器 )2-1 远端DMA 和本地DMA首先解释一下远端DMA 和本地DMA 的区别,以发送为例,网络发送数据是下面这样一个流程:CPU 将数据先发送到网卡上的16KRAM 中,这之间必须要有一个数据通道,我们称为远端DMA ,而数据从网卡的RAM 中发出给链路,RTL8019控制器与RAM 之间的通道称为本地DMA2-2 CPU 读写数据到网络芯片先解释一下上面提到的几个重要的寄存器,我们从上面分阶段说明:RBCR0,RBCR1:存放要读写数据的长度RSAR0,RSAR1:存放数据到网络芯片(RAM)中存放的起始地址(而不是页号,但通常还是以某页的00为开始,如0x4000)CR:向命令寄存器发出Remote DMA开始指令上面的流程后面会详细解说2-3 网络芯片发数据到以太网CPU把数据用Remote DMA发到网络芯片之后,就可以用让网络芯片用Local DMA向外数据了,需要设置如下的控制器:TPSR:网络芯片要发送的数据在网络芯片RAM中的起始页号,所以发送的数据只能从某页的开头存放。
TBCR0,TBCR1:要发送的数据总长度CR:向命令寄存器发出发送数据包的指令CMD_XMIT然后程序就可以返回了,网络芯片会自动用Local DMA发数据包2-4 网络芯片从以太网读数据网络芯片在从以太网读数据过程中,会用到的寄存器如下:PSTART,PSTOP:网络芯片接收数据缓冲区的起始和终止页号。
形成一个接收缓冲环,每页256字节CURR:接收缓冲环写页指针,初始化=PSTARTBNRY:接收缓冲环读页指针,初始化=PSTART这四个寄存器在init函数里初始化,以后有数据包来到时,网络芯片会自动判断是否发给本机,是则用Local DMA存入数据,并自动修改读写指针RTL8019接收包帧结构:具体流程如下:有了上面的收发包的格式,如何发送和接收数据包呢?看下图:图3 发送缓冲区先将待发送的数据包存入芯片RAM,给出发送缓冲区首地址和数据包长度(写入TPSR,TBCR0,1),启动发送命令(CR=3E),即可实现8019发送功能.8019会自动按以太网协议完成发送并将结果写入状态寄存器。
那么8019是怎样接收数据的呢?请看下图:接收缓冲区构成一个循环FIFO队列,PSTART、PSTOP两个寄存器限定了循环队列的开始和结束页,CURR为写入指针,受芯片控制,BNRY为读出指针,由主机程序控制,根据CURR=BNRY+1?可以判断是否收到新的包,新收到的数据包按下图的格式存于以CURR 指出的地址为首址的RAM中当CURR=BNRY时芯片停止接收数据包总的说来,数据包是这样被主机写入芯片和从芯片RAM读出来的:主机设置好远端DMA 开始地址(RSAR0,1)和远端DMA数据字节数(RBCR0,1),并在CR中设置读写,就可以从远端DMA口寄存器读出芯片RAM里的数据或把数据写入RAM芯片,用个示例来说明一下(以发送为例):首先了解RBCR0,1中的远端DMA字节数在寄存器高低位上是怎么存储的?比如长度为600字节,如下:(十进制600=十六进制258)PG0W_RBCR0 = 600 & 0xff; //0x58PG0W_RBCR1 = 600 >> 8; //0x2同样道理写入地址:PG0W_RSAR0 = XMIT_START & 0xff;PG0W_RSAR1 = XMIT_START >> 8;然后发送:NIC_CR = (CR_PAGE0 | CR_DMA_WRITE | CR_START);此时CPU通过远端DMA发送了网卡RAM中的指定区域数据2-5网卡RAM的空间分配网卡RAM的空间分配(包括收缓冲区、发缓冲区、数据存储区),RAM空间原则上是随意分配的,看了资料很多的分配方案都是如下:RAM总共16k,可以用来存储数据的地址是0x4000-0x7FFF,为什么呢?看一下RAM的结构图7 网卡RAM结构图因为256个字节称为一页,所以0x4000-0x7FFF可以用页表示为0x40---0x7F,下面采用的也基本都是用页的地址,如:0x4000-0x40ff是一页,我们称该页为第0x40页(或页0x40),页码也就是16位地址的高8位. 0x4100-0x41ff 是一页,称为第0x41页.0x4000-0x7fff共16k字节的ram是网卡接收和发送数据包用的,该16k字节的ram实际上是双端口的ram,可以同时被网卡读/写和用户读/写,相互之间不影响,网卡读/写比用户读写的优先级高,举个例子:假如网卡收到一个数据包,需要放到0x5000开始的缓冲区,那么需要写入第0x50页.这时用户同时读取旧的数据包,该数据包放在0x4000开始的一段缓冲区,那么需要读第0x40页.网卡优先,它先写入一个字节,然后才读取一个字节到ISA总线上.内部总线的速度很快,是20Mhz,而ISA总线只有8Mhz, 网卡足够快进行同时读写数据,互不影响.既然如此,我们做如下定义:0x40---0x4B共12页做为网卡的发送缓冲区,刚好可以存储两个最大的网络包(约1.5k一个最大网络包),另外使用0x4C---0x7F为网卡的接收缓冲区,共52页,如下定义:Reg04=0x40;//参看RTL8019手册,04在寄存器页0发状态为TPSR,即发送首地址Reg01=0x4C;//参看RTL8019手册,01在寄存器页1写状态为PSTART,即接收首地址Reg02=0x80;//参看RTL8019手册,01在寄存器页2写状态为PSTOP,即接收尾地址2-6关于网卡MAC地址:0x00e0-0x00ff:52525454ABAB3D3D8E8E2C2C545446464C4C49494E4E404022222020575757 57 ,那么该网卡的地址是:5254AB3D8E2C,单地址和双地址的内容是重复的.一般使用偶数地址的内容,Prom是网卡在复位的时候从93C46里读出来的.如果你没有使用93C46,那么就不要使用Prom.,那么如何获得网卡的地址,有两种方法,一是直接读93C46,二是读Prom.网卡在工作的时候的网卡地址是由寄存器MAR0,MAR1,MAR2,MAR3,MAR4,MAR5决定,而不是93C46,也不是Prom. 而这几个寄存器的内容需要用户自己编写程序写入,一般可以读出Prom里的网卡地址,然后写入到这6个寄存器里.如果你没有使用93C46,那么Prom也是不可以使用的,这时要由你的程序自己指定一个网卡地址, 网卡地址不能跟别的网卡地址相同,写入到MAR0-MAR5里.例如使:MAR0=00MAR1=00MAR2=00MAR3=00MAR4=00MAR5=08那么网卡的地址就是:00:00:00:00:00:08所有发给00:00:00:00:00:08地址的数据包就可以被网卡收到.发送数据包的时候你的程序也要使用MAR0-MAR5的值作为发送的源地址.2-7 关于IO端口几乎每一种外设都是通过读写设备上的寄存器来进行的。
外设寄存器也称为“I/O端口”,通常包括:控制寄存器、状态寄存器和数据寄存器三大类,而且一个外设的寄存器通常被连续地编址。
CPU对外设IO端口物理地址的编址方式有两种:一种是I/O映射方式(I/O-mapped),另一种是内存映射方式(Memory-mapped)。
而具体采用哪一种则取决于CPU的体系结构。
有些体系结构的CPU(如,PowerPC、m68k等)通常只实现一个物理地址空间(RAM)。
在这种情况下,外设I/O端口的物理地址就被映射到CPU的单一物理地址空间中,而成为内存的一部分。
此时,CPU可以象访问一个内存单元那样访问外设I/O端口,而不需要设立专门的外设I/O指令。
这就是所谓的“内存映射方式”(Memory-mapped)。
而另外一些体系结构的CPU(典型地如X86)则为外设专门实现了一个单独地地址空间,称为“I/O地址空间”或者“I/O端口空间”。
这是一个与CPU的RAM物理地址空间不同的地址空间,所有外设的I/O端口均在这一空间中进行编址。
CPU通过设立专门的I/O指令(如X86的IN和OUT指令,linux的outb,inb等,后面代码有用到)来访问这一空间中的地址单元(也即I/O端口)。