DM9000网卡驱动移植

2023-10-18 18:18
文章标签 驱动 移植 网卡 dm9000

本文主要是介绍DM9000网卡驱动移植,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先需要明白下面一点:
我们移植dm9000网卡驱动程序,要做的就是找出最小相异性,然后修改。这里的最小相异性是:基地址、位宽、中断引脚等信息

移植过程:
1、入口函数和出口函数改为: dm9000c_initdm9000c_exit,添加修饰函数: module_init(dm9000c_init);module_exit(dm9000c_exit);

2、修改基地址:dm9000c_init函数中添加 iobase = (int)ioremap(0x20000000, 1024);当然也要在dm9000c_exit函数中加上这么一句: iounmap((void *)iobase);
分析:我们的dm9000网卡接在2440的BANK4,所以其基地址是0x20000000

3、注释掉dmfe_probe1函数中的这一句: //if((db->chip_revision!=0x1A) || ((chip_info&(1<<5))!=0) || ((chip_info&(1<<2))!=1)) return -ENODEV;

4、设置中断号:dm9000c_init函数中添加下面一句: irq    = IRQ_EINT7; 
分析:当网卡收到数据时,会产生中断,在这个中断处理函数中,将会处理接收到的数据包。那么这个中断的中断号是什么呢?我们查看原理图发现使用的是外部中断7,所以加上这么一句。

5、注册中断处理函数:在dmfe_open函数中将:
if (request_irq(dev->irq,&dmfe_interrupt,0,dev->name,dev)) 
改为
if (request_irq(dev->irq,&dmfe_interrupt, IRQF_TRIGGER_RISING,dev->name,dev))

6、包含一下头文件:
#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/arch-s3c2410/regs-mem.h>

7、我们在dm9000c_init函数中加入如下代码:

volatile unsigned long *bwscon; 
volatile unsigned long *bankcon4;
unsigned long val;

bwscon   = ioremap(0x48000000, 4); //总线位宽和等待控制寄存器
bankcon4 = ioremap(0x48000014, 4); //存储器4控制寄存器

val = *bwscon;
val &= ~(0xf<<16);
val |= (1<<16);
*bwscon = val; //设置位宽、是否等待等信息,详见注释1

*bankcon4 = (1<<8)|(1<<6); //设置各种时间参数,详见注释2

  iounmap(bwscon);
iounmap(bankcon4);

注释1:
bswcon寄存器可以对bankcon0--bankcon7进行设置,我们要设置的是bankcon4
bit[16:17]:设置位宽,00:8位  01:16位  10:32位  11:保留。我们是16位的。
bit[18]     :使用/禁用存储器组的WAIT位,1表示使用,0表示禁用。我们禁止使用
bit[19]     :控制存储器组的UB/LB引脚输出信号,1:使 UB/LB与nBE[3:0]相连,0:使 UB/LB与与nWBE[3:0]相连。我们设为0

注释2:
关于时间参数的设置比较复杂,贴出几张截图先:
2440截图:
DM9000网卡驱动移植 - 小白 - 小白的博客
 
DM9000网卡驱动移植 - 小白 - 小白的博客
 
DM9000网卡驱动移植 - 小白 - 小白的博客

下面是dm9000芯片资料截图:
DM9000网卡驱动移植 - 小白 - 小白的博客
DM9000网卡驱动移植 - 小白 - 小白的博客
 
我们先来了解一下对dm9000寄存器的操作:
outb(DM9KS_VID_L, iobase); //将要操作的寄存器地址写入DM9000C的索引寄存器
id_val = inb(iobase + 4); //从 DM9000C的数据寄存器里读出数据
 那么怎么分辨是操作的索引寄存器还是数据寄存器呢?就是通过CMD引脚!我们看到CMD引脚接的是LADDR2,当LADDR2为0时表示操作的是索引寄存器,当LADDR2为1时,表示操作的是数据寄存器。
DM9000的地址线只有 LADDR2。

下面我们开始正式分析:

从上面的图中我们找到如下对应关系:
Tacs:表示发出片选信号之前,多长时间内要先发出地址信号,有dm9000时序图知她们可以同时发出,所以Tacs=0
Tcos:表示片选信号发出后需要多长时间才能发出读信号,它对应T1>=0ns,Tcos=0
Tacc:表示读信号的长度,对应T2>=10ns,Tacc=001
Tcoh:表示读信号接收后片选信号要保持的时间,对应T5>=0,我们取为10ns,Tcoh=01
Tcah:表示片选信号之后,地址信号保持的时间,她们可以同时,Tcah=0
Tacp:表示页模式下的访问周期,不用设置
PMC:表示页模式配置,PMC=00表示正常模式

所以:*bankcon4 = (1<<8)|(1<<6);

测试DM9000C驱动程序:
1. 把dm9dev9000c.c放到内核的drivers/net目录下
2. 修改drivers/net/Makefile 
obj-$(CONFIG_DM9000) += dm9000.o
改为
obj-$(CONFIG_DM9000) += dm9dev9000c.o
3. make uImage
使用新内核启动
4. 
使用NFS启动
ifconfig eth0 192.168.1.17
ping 192.168.1.1   

我们看到网卡可用了!很开心哦!
我们再来补充一点内存控制器的知识:
我们知道2440的cpu里面集成了内存控制器,内存控制器外接一些存储设备。我们来分析一下下面代码的执行情况
mov r1,#0
ldr R0,[R1]
这表示cpu要从0地址读4个字节的内容,如果外接存储设备的位宽为16,这怎么实现呢?这里内存控制器就发挥了很大的作用!
首先内存控制器已经知道了外接设备的位宽,它首先发出0地址,得到两个字节的数据。然后发出2地址,又得到两个字节的数据。将4个字节的数据交给cpu就可以了。为了实现这一点,外接存储设备的0地址要与cpu的1地址相连,以此类推。这样的话,发出2地址时,对外接设备来说是1地址,它会将1地址开始的2个字节数据交给cpu。

我们在来分析一下下面的代码:
mov R1,#3
ldb R0,[R1]
首先发出地址3,从外接设备的地址1读出2字节的数据。内存控制器取出高字节的8位,送给cpu

这篇关于DM9000网卡驱动移植的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234327

相关文章

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

驱动(RK3588S)第七课时:单节点设备树

目录 需求一、设备树的概念1、设备树的后缀名:2、设备树的语法格式3、设备树的属性(重要)4、设备树格式举例 二、设备树所用函数1、如何在内核层种获取设备树节点:2、从设备树上获取 gpio 口的属性3、获取节点上的属性只针对于字符串属性的4、函数读取 np 结点中的 propname 属性的值,并将读取到的 u32 类型的值保存在 out_value 指向的内存中,函数的返回值表示读取到的

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

UMDF驱动安装

VS2013 + WDF8.1,UMDF驱动选择User Mode Driver,不要选User Mode Driver 2.0,否则Win7安装有问题,如图 另外,在驱动安装时不要忘记WUDFUpdate_<主版本号><次版本号>.dll文件,具体文件名在INF中查找。此文件可在WDF的安装目录中找到。注意:在WDF的安装目录中会有3个WUDFUpdate_xxx.dll文件,x86,x6

Centos9 网卡配置文件

1、Centos stream 9 网络介结 Centos以前版本,NetworkManage以ifcfg格式存储网络配置文件在/etc/sysconfig/networkscripts/目录中。但是,Centos steam 9现已弃用ifcfg格式,默认情况下,NetworkManage不再创建此格式的新配置文件。从Centos steam 9开始采用密钥文件格式(基于INI文件),Netw

电脑驱动分类

电脑驱动程序(驱动程序)是操作系统与硬件设备之间的桥梁,用于使操作系统能够识别并与硬件设备进行通信。以下是常见的驱动分类: 1. 设备驱动程序 显示驱动程序:控制显卡和显示器的显示功能,负责图形渲染和屏幕显示。 示例:NVIDIA、AMD 显示驱动程序。打印机驱动程序:允许操作系统与打印机通信,控制打印任务。 示例:HP、Canon 打印机驱动程序。声卡驱动程序:管理音频输入和输出,与声卡硬件

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

麒麟系统安装GPU驱动

1.nvidia 1.1显卡驱动 本机显卡型号:nvidia rtx 3090 1.1.1下载驱动 打开 https://www.nvidia.cn/geforce/drivers/ 也可以直接使用下面这个地址下载 https://www.nvidia.com/download/driverResults.aspx/205464/en-us/ 1.1.3安装驱动 右击,

windows10 卸载网络驱动以及重新安装

右键桌面此电脑的图标,点击管理,设备管理器—网络适配器,找到下图中的驱动(不同的系统或者显卡会导致网卡驱动名称与下图不一样,多为Realtek开头),右键选择卸载设备,然后重启电脑,系统会自动重新安装驱动 新电脑首次安装驱动: 根据主板厂家,比如华硕,进入华硕官网,点击服务支持,点击下载中心,选择型号,点击右侧驱动程序和工具软件,选择windows版本,下载相应的驱动,下载完之后在对应文件中找