Linux-DM9000C网卡移植(详解)

2023-11-13

上一节 我们学习了:  

网卡驱动介绍以及制作虚拟网卡驱动:  http://www.cnblogs.com/lifexy/p/7763352.html

接下来本节,学习网卡芯片DM9000C,如何编写移植DM9000C网卡驱动程序。

 


 

1.首先来看DM9000C原理图

如下图所示:

 

  (#:表示低电平有效)

  • SD0~15: 16位数据线,有CMD引脚决定访问类型
  • CMD:      命令线,当CMD为高,表示SD 传输的是数据,CMD为低表示传输的是地址
  • INT:         中断引脚,接在2440的GPF7脚上
  • IOR#:      读引脚,接在2440的nOE脚上
  • IOW#:     写引脚,接在2440的nWE脚上
  • CS#:       片选,放在2440的bank4的片选上面

1.1其中2440手册的bank4地址区间如下图:

 

bank4的区间位于: 0X20000000~0X28000000,当我们访问这个区间的地址,内存控制器便会使能网卡DM9000C的使能脚,所以我们的DM9000C的io基地址=0X20000000

其中DM9000C的CMD引脚接在bank4的LADDR2上面

比如当在地址0X2000 0000上读写数据时,表示读写的数据是DM9000C的地址

访问的地址0X2000 0004上读写数据时,表示读写的数据是DM9000C的数据

 

1.2 DM9000C收发过程

当DM9000C收到外部的数据后,会暂存到内部地址中,然后产生一个上升沿中断,等待2440读取数据

当DM9000C将2440的数据转发出去后,也会产生一个上升沿中断给2440

如下图所示,DM9000C的中断引脚位于pin34脚

 

接在2440的GPF7引脚上,使用的中断为EINT7

 

接下来便来修改厂家提供的DM9000C源代码

2.发现它的init_module()入口函数前有个条件编译

所以要注释掉 “#ifdef MODULE” 和 “#endif”

3.修改入口出口函数名,并修饰它们(修改函数名避免与内核的其它函数重名)

 

 

4.修改驱动的硬件相异性(设置基地址,寄存器,中断等)

4.1先来找找代码在哪里初始化DM9000C硬件的

进入dm9000c_init()

       -> dmfe_probe()

其中dmfe_probe()函数如下:

复制代码

struct net_device * __init dmfe_probe(void)
{
struct net_device *dev;

dev= alloc_etherdev(sizeof(struct board_info));          //分配一个net_device结构体
... ...

err = dmfe_probe1(dev);                                 //调用dmfe_probe1()函数
... ...

err = register_netdev(dev);                            //向内核注册net_device结构体
... ...
}

复制代码

显然dmfe_probe1()函数就是用来初始化DM9000C硬件和设置net_device结构体的成员用的

 

4.2 进入dmfe_probe1()函数

如下图,这个iobase 变量就是我们DM9000C的io基地址0x20000000

 

 

iobase的作用:

如上图, 读一次DM9000C的VID低字节之前,需要先将地址赋为0x20000000,也就是将DM9000C的CMD置0,然后向0x20000000写入要读的DM9KS_VID_L地址值

最后再将地址+4,也就是赋为0x20000100,将CMD置1,然后读出0x20000100的值,也就是DM9000C的VID低字节

DM9000C的读写方式都是这样的,先将CMD置0,写入DM9000C的地址,然后再将CMD置1,来读写数据

 

4.3所以在init函数中便重新设置iobase 变量,其中iobase是int型

 

并在exit出口函数中,添加iounmp()

 

4.4 继续进入dmfe_probe1()函数,往下看

如下图所示,屏蔽红框里的代码,该代码用来核对版本,我们的DM9000C版本号不一样,所以要屏蔽

4.5 在init函数中,修改中断名,将irq改为IRQ_EINT7

 

4.6 修改中断

当使用了register_netdev()注册了网卡驱动net_device后,在内核中使用ifconfig就会进入net_device->open成员函数申请中断,激活队列等

所以我们要修改open成员函数的申请中断函数,将触发中断改为“IRQT_RISING”,上升沿触发

 

5.接下来便开始设置2440的存储控制寄存器

设置2440的bank4的硬件位宽,时序,因为不同的硬件,涉及的数据收发都不同,

5.1设置BWSCON总线宽度控制寄存器

我们只设置BANK4的内容,所以只有下面3个(BANK0的位宽由OM[1:0] 硬件设置)

 

设置ST4=0,不使用UB/LB(UB/LB:表示高字节与低字节数据是否分开传输)

设置WS4=0,其中WAIT引脚为PE4,而我们DM9000C没有引脚接入PE4,所以禁止

设置DW4=0x01,我们的DM9000C的数据线为16位

5.2设置BANKCON4控制寄存器

 

 设置这些时序之前,首先来看DM9000C芯片手册时序图和2440的时序图

 

参考上图,得出BANKCON4 寄存器设置如下(HCLK=100MHZ,1个时钟等于10ns)

  • 设置Tacs=0,因为CS和CMD可以同时结束(bank4地址(也就是CMD)稳定多久后,CS片选才启动)
  • 设置Tcos=T1=0(CS片选后,多久才能使能读写)
  • 设置Tacc=T2>=10ns=1,表示2个时钟 (access cycle ,读写使能后,多久才能访问数据)
  • 设置Tcoh=T4>=3ns=1,表示1个时钟 ,因为当DM9000的写信号取消后,数据线上的数据还需要至少3ns才消失(nOE读写取消后,片选需要维持多长时间)
  • 设置Tcah=0,因为 CS和CMD可以同时结束 (CS片选取消后,地址(也就是CMD)需要维持多长时间)

 

代码如下图,在init入口函数中设置

 

 

(PS:若DM9000C无法驱动,可能是Tacc时间太短,导致读取不到数据,可以将Tacc设大一点)

与硬件相关的部分已经改好了,接下来开始编译

6.编译测试

编译之前,首先添加该驱动需要的内核头文件:

#include <asm/delay.h>
#include <asm/irq.h>
#include <linux/irq.h>
#include <asm/io.h>
#include <asm/arch-s3c2410/regs-mem.h>

 

编译无误后,便开始测试DM9000C驱动程序:

1) 把dm9dev9000c.c放到内核的drivers/net目录下,来替换原来内核的DM9000C

2) 修改drivers/net/Makefile 


obj-$(CONFIG_DM9000) += dm9000.o
改为(如下图所示)
obj-$(CONFIG_DM9000) += dm9dev9000c.o

 

 

3) make uImage

如下图,说明新的驱动已编译进内核

 

 

4) 使用新内核启动

ifconfig eth0 192.168.2.107

ping 192.168.2.1

如下图,可以ping通,说明移植成功

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux-DM9000C网卡移植(详解) 的相关文章

  • 有谁知道在哪里定义硬件、版本和序列号。 /proc/cpuinfo 的字段?

    我想确保我的 proc cpuinfo 是准确的 目前它输出 Hardware am335xevm Revision 0000 Serial 0000000000000000 我可以在代码中的哪里更改它以给出实际值 这取决于 Linux 的
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 如何在基于 Linux 的系统上的 C 程序中使用 mqueue?

    如何在基于 Linux 的系统上的 C 程序中使用 mqueue 消息队列 我正在寻找一些好的代码示例 可以展示如何以正确且正确的方式完成此操作 也许是一个操作指南 下面是一个服务器的简单示例 该服务器接收来自客户端的消息 直到收到告诉其停
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • NUMA 在虚拟内存中是如何表示的?

    有许多资源 https en wikipedia org wiki Non uniform memory access从硬件角度描述NUMA的架构性能影响 http practical tech com infrastructure num
  • 如何查询X11显示分辨率?

    这似乎是一个简单的问题 但我找不到答案 如何查询 通过 X11 存在哪些监视器及其分辨率 查看显示宏 http tronche com gui x xlib display display macros html and 屏幕宏 http
  • 监控子进程的内存使用情况

    我有一个 Linux 守护进程 它分叉几个子进程并监视它们是否崩溃 根据需要重新启动 如果父进程可以监视子进程的内存使用情况 以检测内存泄漏并在超出一定大小时重新启动子进程 那就太好了 我怎样才能做到这一点 您应该能够从 proc PID
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • Python 脚本作为 Linux 服务/守护进程

    Hallo 我试图让 python 脚本作为服务 守护进程 在 ubuntu linux 上运行 网络上存在多种解决方案 例如 http pypi python org pypi python daemon http pypi python
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • vagrant ssh -c 并在连接关闭后保持后台进程运行

    我正在编写一个脚本来启动和后台流浪机器内的进程 似乎每次脚本结束和 ssh 会话结束时 后台进程也会结束 这是我正在运行的命令 vagrant ssh c cd vagrant src nohup python hello py gt he
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 安装Ubuntu遇到unable to find a medium containing a live file system解决方案

    安装unable to find a medium containing a live file system 搜了好几个帖子 说是重新烧录u盘 换usb2 0 都不好使 最后找到了 在启动页面点击e 可以进入启动写参数界面 将quiet
  • vue3+vite的项目中实现右键事件的神器

    前言 vue3 vite的项目中实现右键事件的神器 imengyu vue3 context menu 实现效果 使用步骤 1 安装 npm cnpm pnpm yarn 都可以 装上下面插件 imengyu vue3 context me
  • Linux操作系统——磁盘管理

    目录 一 理论基础 二 增加虚拟磁盘 2 1 添加硬盘 6 2 2 分区 2 3 格式化 6 2 4 文件的挂载与卸载 2 5 挂载永久化 6 3 磁盘相关命令 6 3 1 命令fdisk l 6 3 2 命令df 6 3 3 命令lsbl
  • 蓝桥杯 基础训练—数列排序  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200

    问题描述 给定一个长度为n的数列 将这个数列按从小到大的顺序排列 1 lt n lt 200 输入格式 第一行为一个整数n 第二行包含n个整数 为待排序的数 每个整数的绝对值小于10000 输出格式 输出一行 按从小到大的顺序输出排序后的数
  • Android屏幕适配(使用ConstraintLayout),2021年Android高级面试题总结

    2 然后拉一个imageView进入布局 选择自己要显示的图片 3 将此imageView的上下参照物设置为两参照线 并将左右参照物设置为父容器 将其宽设置为wrap content 高设置为mach constraint 也就是0dp 这
  • NVIDIA vGPU License服务器安装过程

    在vGPU场景下 NVIDIA vGPU License Server 是一个很重要的组件 一个vGPU虚拟机没有正常获取License的时候 功能会受到很大限制 因此正式生产环境或者POC测试环境中都建议搭建 在之前的文章介绍过VMwar
  • 【Ini格式文件】Ini格式文件的读写

    前言 在实际工作中 常常需要读写ini格式的文件 在Gitee上找到一份开源的代码 MIT证书 其使用了文件读写的标准库函数 但我当前的嵌入式环境对文件读写的标准库函数的支持存在问题 当调用文件读写的标准库函数时会导致系统宕机 为了解决这问
  • 如何与西门子200 PLC建立连接

    更多关于西门子S7 200PLC内容请查看 西门子200系列PLC学习课程大纲 与西门子200 PLC建立连接很简单 分为以下几步 1 给S7 200PLC通电 按下图1 1所示连接PLC端口 然后给PLC供电 有直流24V和交流220V两
  • 笔记本突然无线和有线都不能使用

    记录下 昨天突然电脑wifi和插网线均不能上网 或者说没有任何反应 后 查看驱动情况发现带黄色感叹号 于是 去官网下载各种驱动 或者还原驱动到最初版本均不能解决问题 遂认为有可能网卡坏了 然后JD买了外置网卡 也不能解决 后采用驱动精灵中找
  • casset setup驱动下载_如何安装驱动程序

    驱动程序到底是什么 这是一个跟自然世界很难找到对照的事物 实在要找的话好比是翻译 电脑的硬件设备跟软件之间的翻译 例如摄像头 需要安装驱动程序才能工作 摄像头作为硬件能识别的是很底层的硬件指令 而电脑操作系统应用软件处于系统的上层 他们之间
  • JAVA——形参和返回值

    形参和返回值 1 1 类名作为形参和返回值 方法的形参是类名 其实需要的是该类的对象 方法的返回值是类名 其实返回的是该类的对象 1 2 抽象类名作为形参和返回值 方法的形参是抽象类名 其实需要的是该抽象类的子类对象 方法的返回值是抽象类名
  • startThreadPool调用流程

    ProcessState self gt startThreadPool 1 startThreadPool 的主要作用是 ProcessState cpp 调用spawnPooledThread true 2 spawnPooledThr
  • CSND文章阅读数自动增加

    原理 通过不断刷新网页来实现阅读数增加 import time from selenium import webdriver 自动刷新网页 def refresh url 驱动要自己去下载 具体方法CSDN一堆 下载谷歌浏览器驱动后需要把驱
  • Python 第2章 基本数据类型课后习题参考答案

    第2章课后习题参考答案 一 单选题 Python 中 0 和 0 0 的区别是 答案为B A 大小不同 B 类型不同 C 进制不同 D 完全一样 以下不是 Python 数据类型名称的是 答案为D A int B float C list
  • 深度学习可视化工具FiftyOne介绍

    FiftyOne是用于构建高质量数据集和计算机视觉模型的开源工具 由Python语言实现 最新发布版本为v0 14 0 它的License是Apache 2 0 源码位于https github com voxel51 fiftyone F
  • 积分商城能给商家带来哪些帮助?

    说起积分商城 不少人都大概接触过 甚至使用过 最常见的 例如我们使用的手机号码就有积分商城的存在 通过充值话费 会累积一定的消费积分 而这些积分通常在手机营业厅APP上可以查询到其作用 早期的积分商城玩法较少 如今已经变得很成熟 常见的有积
  • python里object是什么类型_Python object类中的特殊方法

    python版本 3 8 class object The most base type del obj xxx或delattr obj xxx 时被调用 删除对象中的一个属性 def delattr self args kwargs re
  • (Ubuntu Linux)Conda安装Pytorch2.0-Python3.8-Cuda11.7

    Ubuntu Linux Conda安装Pytorch2 0 Python3 8 Cuda11 7 一 安装Anaconda 安装包下载 https repo anaconda com archive 1 选择合适的安装包 每个版本中对应不
  • AppScan安全漏洞报告

    1 会话cookie 中缺少HttpOnly 属性 修复任务 向所有会话cookie 添加 HttpOnly 属性 解决方案 过滤器中 Java代码 HttpServletResponse response2 HttpServletResp
  • Linux-DM9000C网卡移植(详解)

    上一节 我们学习了 网卡驱动介绍以及制作虚拟网卡驱动 http www cnblogs com lifexy p 7763352 html 接下来本节 学习网卡芯片DM9000C 如何编写移植DM9000C网卡驱动程序 1 首先来看DM90