【Linux高级驱动】如何分析并移植网卡驱动
dm9000的驱动分析
platform_driver_register();
db);
db);
);
;
id_val ;
id_val ;
/* 获取芯片型号 */
id_val = ior(db, DM9000_CHIPR);
ether_setup(ndev);
/*设置操作方法*/
ndev->netdev_ops = &dm9000_netdev_ops;
/*注册网络设备*/
register_netdev(ndev); //register_chrdev
cs8900a网卡驱动分析
/*识别芯片*/
/*操作方法的设置*/
dev->netdev_ops = &net_ops;
/*注册网络设备*/
register_netdev(dev);
static const struct net_device_ops dm9000_netdev_ops = {
.ndo_open = dm9000_open, //必须的
.ndo_stop = dm9000_stop, //必须的
.ndo_start_xmit = dm9000_start_xmit, //必须的
.ndo_tx_timeout = dm9000_timeout, //必须的
.ndo_set_multicast_list = dm9000_hash_table,
.ndo_do_ioctl = dm9000_ioctl,
.ndo_change_mtu = eth_change_mtu,
.ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr,
#ifdef CONFIG_NET_POLL_CONTROLLER
.ndo_poll_controller = dm9000_poll_controller,
#endif
};
网卡驱动的数据接收发送流程?
初始化设备
writeb(NCR_RST, db);
/* dm9000的初始化,芯片厂商会支持 */
dm9000_init_dm9000(dev);
/* 启动发送队列 */
netif_start_queue(dev);
}
数据接收流程
(db->inblk)(db->io_data, rdptr, RxLen); //dm9000_inblk_16bit //读真正的有效数据(MAC头,TCP头,IP头,网络数据)
dev->stats.rx_bytes += RxLen;
/* Pass to upper layer,去掉MAC头 */
skb->protocol = eth_type_trans(skb, dev);
/* 将数据上报到上层 */
netif_rx(skb);
dev->stats.rx_packets++;
数据发送流程
dm9000_start_xmit
);
)
dm9000_send_packet(dev, db);
/*启动发送:数据发送完成,产生中断*/
iow(dm, DM9000_TCR, TCR_TXREQ); /* Cleared after TX complete */
netif_wake_queue(dev);
/* Re-enable interrupt mask */
iow(db, DM9000_IMR, db->imr_all);
/* Restore previous register address */
writeb(reg_save, db->io_addr); //恢复为自动增加
怎么写网卡驱动
1.cs89x0.c
1.1 分配一个net_device结构体
alloc_etherdev
1.2 设置
dev->stop = net_close;
dev->tx_timeout = net_timeout;
dev->watchdog_timeo = HZ;
dev->hard_start_xmit = net_send_packet;
dev->get_stats = net_get_stats;
dev->set_multicast_list = set_multicast_list;
dev->set_mac_address = set_mac_address;
1.3 注册
register_netdev
2. DM9000.c
2.1 分配一个net_device结构体
ndev = alloc_etherdev(sizeof (struct board_info));
2.2 设置
ndev->open = &dm9000_open;
ndev->hard_start_xmit = &dm9000_start_xmit;
ndev->tx_timeout = &dm9000_timeout;
ndev->watchdog_timeo = msecs_to_jiffies(watchdog);
ndev->stop = &dm9000_stop;
ndev->get_stats = &dm9000_get_stats;
ndev->set_multicast_list = &dm9000_hash_table;
2.3 注册
ret = register_netdev(ndev);
任何设备的核心都是收发数据
1. 发数据:
上层要发送数据时,构造一个sk_buff,然后调用net_device的hard_start_xmit来发送
2. 收数据:
网卡收到数据后,发生中断
在中断服务程序里:
从硬件上读出数据,然后构造一个sk_buff,上报:
a. 分配一个sk_buff结构体:
dev_alloc_skb
b. 使用硬件上得到数据填充这个结构体
c. 上报:netif_rx
测试方法
1. 编译/安装驱动 farsight_net_1.c
ifconfig fs_net0 ...
ping ... 成功,证明ping自己的话,不经过硬件
ping ... 多次调用fsnet_hard_start_tx
PING ... (...) data bytes
fsnet_hard_start_tx
fsnet_hard_start_tx
再次ifconfig发现fs_net0的rx/tx都是0
2. 编译/安装驱动 farsight_net_2.c: 添加统计信息
3. 编译/安装驱动 farsight_net_3.c: 设MAC地址
ifconfig fs_net0
ifconfig 可以看到MAC地址
4. 编译/安装驱动 farsight_net_4.c: 构造ping的返回包
ifconfig fs_net0 up
ifconfig fs_net0 192.188.1.1
ping 192.188.1.2 成功
怎么移植网卡驱动
网卡基本上都是内存接口(ram-like)
1. 根据原理图确定访问地址, 在驱动里修改相应项
2. 为了能通过这些地址访问网卡,对于2410还要设置memory controller
比如设置位宽、时间参数
3. 根据原理图确定中断号, 在驱动里修改相应项(包括中断号、中断触发方式(高/低有效))
@成鹏致远
(blogs:http://lcw.cnblogs.com)
(email:wwwlllll@126.com)
)
【Linux高级驱动】如何分析并移植网卡驱动的更多相关文章
- 26.Linux-网卡驱动介绍以及制作虚拟网卡驱动(详解)
1.描述 网卡的驱动其实很简单,它还是与硬件相关,主要是负责收发网络的数据包,它将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送, 并将接收到的数据包传递给上层协议. 网卡设备与字符设备和块 ...
- X-010 FriendlyARM tiny4412 uboot移植之移植网卡驱动TFTP用起来
<<<<<<<<<<<<<<<<<<<<<<<<< ...
- tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动【转】
本文转载自:http://blog.csdn.net/fengyuwuzu0519/article/details/74160686 一.思路 上一节我们通过DNW将内核.文件系统.设备树文件烧入到内 ...
- 二十、网卡框架分析、虚拟网卡驱动和DM9621驱动分析
一.网络设备驱动的结构 网卡设备不同于字符设备和块设备, 网络设备并不对应于/dev目录下的文件,它存放在/sys/class/net目录下. Linux系统对网络设备驱动定义了四个层次: 1. 网络 ...
- linux 内核启动流程分析,移植
分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...
- Linux高级网络设置——将多个网卡设置成一个网卡
Linux下可以设置网卡模式 模式0:负载均衡 模式1:主备模式,不提高网络带宽 模式3:多网卡同时发送相同的数据 准备实验环境: Redhat 6.4 企业版64位,最小化安装. 给虚拟机添加网卡 ...
- Linux内核循环链表经典分析和移植
为什么说这个链表做的经典呢,哥哥我从Linux内核里边儿扣出来的,要么怎么说内核不是一般人能写的,这代码太TM优美了! 这里有一篇参考文章:http://isis.poly.edu/kulesh/st ...
- AM335x(TQ335x)学习笔记——Nand&&网卡驱动移植
移植完成声卡驱动之后本想再接再励,移植网卡驱动,但没想到的是TI维护的内核太健壮,移植网卡驱动跟之前移植按键驱动一样简单,Nand驱动也是如此,于是,本人将Nand和网卡放在同一篇文章中介绍.介绍之前 ...
- Linux网卡驱动框架及制作虚拟网卡
1.概述 网卡驱动与硬件相关,主要负责收发网络的数据包,将上层协议传递下来的数据包以特定的媒介访问控制方式进行发送,并将接收到的数据包传递给上层协议. 网卡设备与字符设备,块设备不同,网络设备驱动程序 ...
随机推荐
- Python图形编程探索系列-01-初级任务
设计任务 设计一个主窗口,在其中添加三个标签和三个按钮,当点击按钮时,对标签的内容和色彩进行修改. 代码初步设计 import tkinter as tk root = tk.Tk() def f1( ...
- [POI2011]Rotacje na drzewie (2)/[BZOJ3702]二叉树
[POI2011]Rotacje na drzewie (2) 题目大意: 一棵有\(n\)个叶子结点的二叉树,每个叶子结点有一个权值,恰好是\(1\sim n\)的一个排列,你可以任意交换每一对子结 ...
- [HDU5963]朋友
[HDU5963]朋友 题目大意: 给定一棵\(n(n\le40000)\)个点的树,边权只能是\(0\)或\(1\).一局游戏开始时,会确定一个结点作为根.AB轮流操作.当一方操作时,他们需要先选择 ...
- [HAOI2016]食物链
OJ题号:BZOJ4562.洛谷3183 思路:记忆化搜索. 本体可以转化成“求有向图中入度为0的结点到出度为0的结点的路径数”. 每次加边时记录每个结点的入度和出度,然后从入度为0的结点开始搜索,搜 ...
- 部分手机(如三星)的Listview列表会自动加上黑线解决办法
部分手机(如三星)的Listview列表会自动加上黑线,这里将其去掉部分手机(如三星)的列表会自动加上黑线. 因为三星手机会自动加上分割线. // 部分手机(如三星C9 Pro)的设置项列表会自动加上 ...
- BZOJ4122 : [Baltic2015]File paths
对于在$o$点的某个询问,有两种情况: 情况1:走到任意一个点$x$然后超链接跳到$o$的某个祖先$y$再走到$o$. 枚举所有$y$看看是否存在$x$即可. 时间复杂度$O(nm)$. 情况2:走到 ...
- Java中的ReentrantLock和synchronized两种锁定机制
原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...
- android:碎片的使用方式
介绍了这么多抽象的东西,也是时候应该学习一下碎片的具体用法了.你已经知道,碎 片通常都是在平板开发中才会使用的,因此我们首先要做的就是新建一个平板电脑的模拟 器.由于 4.0 系统的平板模拟器好像存在 ...
- Spring AOP获取拦截方法的参数名称跟参数值
注意:这种方式需要JDK1.8版本支持 开始:http://www.cnblogs.com/wing7319/p/9592184.html 1.aop配置: <aop:aspectj-autop ...
- 系统编码、文件编码与python系统编码
在linux中获取系统编码结果: Windows系统的编码,代码页936表示GBK编码 可以看到linux系统默认使用UTF-8编码,windows默认使用GBK编码.Linux环境下,文件默认使用U ...