Linux下网络设备驱动框架
Posted DS小龙哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux下网络设备驱动框架相关的知识,希望对你有一定的参考价值。
Linux下网络设备驱动
1.1 Linux下网络相关命令
1.1.1 ifconfig命令:设置网卡IP地址
- 功能ifconfig用于查看和更改网络接口的地址和参数,包括IP地址、网络掩码、广播地址,使用权限是超级用户。
- 语法:fconfig -interface [options] address
- 主要参数
-interface | 指定的网络接口名,如eth0和eth1。 |
up | 激活指定的网络接口卡。 |
down | 关闭指定的网络接口。 |
broadcast address | 设置接口的广播地址。 |
pointopoint | 启用点对点方式。 |
address | 设置指定接口设备的IP地址。 |
netmask address | 设置接口的子网掩码。 |
- 应用说明ifconfig是用来设置和配置网卡的命令行工具。为了手工配置网络,这是一个必须掌握的命令。使用该命令的好处是无须重新启动机器。要赋给eth0接口IP地址207.164.186.2,并且马上激活它,使用下面命令:
#fconfig eth0 210.34.6.89 netmask 255.255.255.128 broadcast 210.34.6.127 |
该命令的作用是设置网卡eth0的IP地址、网络掩码和网络的本地广播地址。若运行不带任何参数的ifconfig命令,这个命令将显示机器所有激活接口的信息。带有“-a”参数的命令则显示所有接口的信息,包括没有激活的接口。注意,用ifconfig命令配置的网络设备参数,机器重新启动以后将会丢失。
- 查看网卡的IP地址信息
# ifconfig //查看当前已经启动的网卡信息 # ifconfig -a//查看所有网卡的信息。包含未启动的网卡。 # ifconfig eth0 //查看eth0网卡的信息 |
- 关闭与启动网卡
# ifconfig eth0 up //激活名称为eth0的网卡 # ifconfig eth0 down //关闭名称为eth0的网卡 |
- 修改网卡MAC地址
修改网卡MAC地址 首先必须关闭网卡设备:ifconfig eth0 down 修改MAC地址:ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE 重新启用网卡:ifconfig eht0 up 这样网卡的MAC地址就更改完成了。每张网卡的MAC地址是惟一,但不是不能修改的,只要保证在网络中的MAC地址的惟一性就可以了。 |
- 在一张网卡上绑定多个IP地址
在Linux下,可以使用ifconfig方便地绑定多个IP地址到一张网卡。
例如,eth0接口的原有IP地址为192.168.0 .254,可以执行下面命令:
ifconfig eth0:0 192.168.0.253 netmask 255.255.255.0 ifconfig eth0:1 192.168.0.252 netmask 255.255.255.0 ...... |
1.1.2 ping命令
- 功能:ping检测主机网络接口状态,使用权限是所有用户。
- 语法:ping [-dfnqrRv][-c][-i][-I][-l][-p][-s][-t] IP地址
- 主要参数
-d | 使用Socket的SO_DEBUG功能。 |
-c | 设置完成要求回应的次数。 |
-f | 极限检测。 |
-i | 指定收发信息的间隔秒数。 |
-I | 网络界面使用指定的网络界面送出数据包。 |
-l | 前置载入,设置在送出要求信息之前,先行发出的数据包。 |
-n | 只输出数值。 |
-p | 设置填满数据包的范本样式。 |
-q | 不显示指令执行过程,开头和结尾的相关信息除外。 |
-r | 忽略普通的Routing Table,直接将数据包送到远端主机上。 |
-R | 记录路由过程。 |
-s | 设置数据包的大小。 |
-t | 设置存活数值TTL的大小。 |
-v | 详细显示指令的执行过程。 |
ping命令是使用最多的网络指令,通常我们使用它检测网络是否连通,它使用ICMP协议。但是有时会有这样的情况,我们可以浏览器查看一个网页,但是却无法ping通,这是因为一些网站处于安全考虑安装了防火墙。
- 使用实例
# ping 192.168.11.123 |
1.1.3 网卡启动与关闭
除了使用ifconfig配置之外,也可以使用ifup、ifdown命令来实现。
# ifup eth0 //开启eth0网卡 # ifdown eth0 //关闭eth0网卡 |
1.2 查看内核已经支持的网卡驱动
进入到内核配置菜单目录下: [root@wbyq linux-3.5]# make menuconfig
Device Drivers ---> [*] Network device support ---> ……………………………….. USB Network Adapters ---> //支持的USB网卡设备 <*> USB Pegasus/Pegasus-II based ethernet device support < > USB RTL8150 based ethernet device support (EXPERIMENTAL) <*> ASIX AX88xxx Based USB 2.0 Ethernet Adapters <*> Davicom DM9601 based USB 1.1 10/100 ethernet devices <*> Davicom DM9620 USB2.0 Fast Ethernet devices (开发板本身的自带网卡) < > SMSC LAN75XX based USB 2.0 gigabit ethernet devices < > SMSC LAN95XX based USB 2.0 10/100 ethernet devices < > GeneSys GL620USB-A based cables < > Prolific PL-2301/2302/25A1 based cables < > MosChip MCS7830 based Ethernet adapters |
1.3 移植ENC28J60网卡驱动
1.3.1 ENC28J60芯片介绍
ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网 控制器。它可作为任何配备有 SPI 的控制器的以太网接口。ENC28J60 符合 IEEE 802.3 的全部规范,采用了一系列包过滤机制以对传入数据包进行限制。 它还提供了一个内部 DMA 模块, 以实现快速数据吞吐和硬件支持的 IP 校验和计算。 与主控制器的通信通过两个中断引脚和 SPI 实现,数据传输速率高达 10 Mb/s。两个专用的引脚用于连接 LED,进行网络活动状态指示。ENC28J60 总共只有 28 脚,提供 QFN/TF。
的主要特点如下:
- 兼容 IEEE802.3 协议的以太网控制器
- 集成 MAC 和 10 BASE-T 物理层
- 支持全双工和半双工模式
- 数据冲突时可编程自动重发
- SPI 接口速度可达 10Mbps
- 8K 数据接收和发送双端口 RAM
- 提供快速数据移动的内部 DMA 控制器
- 可配置的接收和发送缓冲区大小
- 两个可编程 LED 输出
- 带7个中断源的两个中断引脚
- TTL 电平输入
- 提供多种封装:SOIC/SSOP/SPDIP/QFN 等。
ENC28J60 的典型应用电路如下图:
- ENC28J60 由七个主要功能模块组成: 1) SPI 接口,充当主控制器和 ENC28J60 之间通信通道。
2) 控制寄存器,用于控制和监视 ENC28J60。
3) 双端口 RAM 缓冲器,用于接收和发送数据包。
4) 判优器,当 DMA、发送和接收模块发出请求时对 RAM 缓冲器的访问进行控制。
5) 总线接口,对通过 SPI 接收的数据和命令进行解析。
6) MAC(Medium Access Control)模块,实现符合 IEEE 802.3 标准的 MAC 逻辑。
7) PHY(物理层)模块,对双绞线上的模拟数据进行编码和译码。
ENC28J60 还包括其他支持模块,诸如振荡器、片内稳压器、电平变换器(提供可以接受 5V 电压的 I/O 引脚)和系统控制逻辑。
引脚功能说明:
1.3.2 ENC28J60以太网模块介绍
ENC28J60 网络模块采用 ENC28J60 作为主芯片,单芯片即可实现以太网接入, 利用该模块,基本上只要是个单片机,就可以实现以太网连接。
模块实物图如下:
- 模块的主要引脚功能:
其中 GND 和 V3.3 用于给模块供电,MISO/MOSI/SCK 用于 SPI 通信,CS 是片选信号,INT 为中断输出引脚,RST 为模块复位信号。
1.3.3 查看内核已经支持的网卡源码
在内核linux-3.5/drivers/net/ethernet源码目录下可以查看已经支持的网卡源码。
ENC28J60网卡源码就存放在: /linux-3.5/drivers/net/ethernet/microchip目录下
[root@wbyq microchip]# pwd /work/Tiny4412/linux-3.5/drivers/net/ethernet/microchip [root@wbyq microchip]# ls enc28j60.c enc28j60_hw.h Kconfig Makefile |
1.3.4 配置内核SPI总线设备端
1. ENC28J60使用的是SPI总线通信,先查看内核SPI总线板级注册是否支持。
进入到内核配置菜单: [root@wbyq linux-3.5]# make menuconfig
Device Drivers ---> [*] SPI support ---> <*> Samsung S3C64XX series type SPI [*] Samsung S3C64XX Channel 0 Support./选中SP0总线支持*/ |
因为开发板引出的SPI接口只有SPI0,所以只能配置SPI0总线。
2. 修改SPI0总线板级注册信息
打开开发板底层板级配置文件:
[root@wbyq linux-3.5]# vim arch/arm/mach-exynos/mach-tiny4412.c +1449 |
修改SPI设备端名称:
1447 static struct spi_board_info spi0_board_info[] __initdata = 1448 1449 .modalias = "spidev_enc28j60", /*修改设备端名称*/ 1450 .platform_data = NULL, 1451 .max_speed_hz = 10*1000*1000, 1452 .bus_num = 0, 1453 .chip_select = 0, 1454 .mode = SPI_MODE_0, 1455 .controller_data = &spi0_csi[0], 1456 1457 ; |
SPI子系统匹配使用的是平台设备模型,驱动端与设备端的名称需要一致。
3. 修改完以上两步配置之后,再重新编译内核,烧写内核。
1.3.5 修改ENC28J60驱动代码
将/drivers/net/ethernet/microchip目录下的ENC28J60源码复制出来,单独修改。
- 编写Makefile文件,负责编译成模块
- 修改ENC28J60驱动源码里的名称与SPI总线设备端保持一致。
3. 修改驱动端的probe函数,增加对SPI模式配置与中断号获取,正常情况下可以直接在SPI设备端直接修改,驱动端直接获取信息即可。
static int __devinit enc28j60_probe(struct spi_device *spi) spi->irq=gpio_to_irq(EXYNOS4_GPX3(2)); /*获取中断号*/ /*配置SPI模式*/ spi->bits_per_word = 8; spi->mode = SPI_MODE_1; spi->max_speed_hz=50000;/*1*100000; //50000*/ if(spi_setup(spi)<0)//配置 printk("SPI配置失败!\\n"); …………………………. |
除了修改以上信息之外,其他信息不用修改,直接编译驱动安装即可。
1.3.6 驱动安装测试
[root@XiaoLong /code]# insmod enc28j60.ko [ 31.640000] SPI Probe函数匹配成功,SPI总线编号: 0 [ 31.640000] spidev_enc28j60 spi0.0: spidev_enc28j60 Ethernet driver 1.01 loaded [ 31.655000] spi->irq=442 [ 31.710000] net eth1: spidev_enc28j60 driver registered [root@XiaoLong /code]# ifconfig -a eth0 Link encap:Ethernet HWaddr 00:00:FF:FF:00:00 inet addr:192.168.10.123 Bcast:192.168.10.255 Mask:255.255.255.0 inet6 addr: fe80::200:ffff:feff:0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:2841 errors:0 dropped:0 overruns:0 frame:0 TX packets:1641 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2695524 (2.5 MiB) TX bytes:295408 (288.4 KiB) eth1 Link encap:Ethernet HWaddr CE:89:65:5A:91:93 //新生成的网卡名称 BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Interrupt:186 ip6tnl0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 NOARP MTU:1452 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) Linux——Linux驱动之玩转SPI(上)Linux下SPI驱动框架简析及SPI设备驱动代码框架实现步骤 Linux——Linux驱动之玩转SPI(上)Linux下SPI驱动框架简析及SPI设备驱动代码框架实现步骤 |