学习笔记 --- DM9000网卡原理与基地址设置

前面有文章分析了网卡也是属于类内存总线的设备,类内存总线的设备有地址总线和数据总线,先来看下DM9000的管脚:

从上面可以看出DM9000的地址总线就一根,它不像CS8900那样地址总线和数据总线都齐全。而这里只有一根地址线(CMD),16跟数据线,所以可以确定位宽为16位,而地址线为什么只有一根,这是DM9000决定的,看手册可以知道CPU总线只访问它的两个地址,CMD管脚为0时,数据线送的是DM9000的寄存器地址,CMD管脚为1时,数据线上送的是16位的寄存器数据,所以对DM9000的操作至少需要两步:先写地址,再写(读)数据。他不像其他类内存总线那样直接把数据写到地址传输一次就可以了,而他要传输两次,因为他的总线地址就退化成了类似于NAND的ALE信号,就是地址和数据的区分信号了,而不是DM9000里面操作的寄存器地址。

上面的片选信号为:nLAN_CS,链接到S3C2440的CS4,对应BANK4,所以基地址为0X20000000,网上很多人讨论为什么有的开发板基地址设置为0X20000300,这个是没有任何作用的,之前分析了,DM9000对于CPU的地址线只认识一根线,只要这根线对应的CPU传送的地址的对应位匹配就可以了,上面接到LADDR2,也就是说:

传寄存器地址的时候操作的总线地址满足:

以基地址起头(0x20000000),偏移基地址LADDR2为0(低四位:0000),也就是写的时候总线地址为:0x20000000

传寄存器数据的时候操作的总线地址满足:

以基地址起头,偏移基地址LADDR2为1 (低四位:0100),也就是写的时候总线地址为:0x20000004

所以首先满足总线地址在BANK4里面(这样CS4才能自动选中),其次满足最后四位为0(传送寄存器地址)或4(传送数据)就可以了,满足这两个条件地址随便设

所以上面0x20000300这个多出的300H没任何意义,他满足上面条件,你设置为0x20000400,0x20000320,0x23456780这些地址都没任何影响


上面分析知道了基地址,位宽,再简要说下中断引脚:

这里的IRQ_LAN接的是S3C2440的ENT7,用的外部中断7,这个中断用于接收数据时触发的,中断服务函数处理接收数据,向协议层上报接收数据。这个中断号要和驱动里面的对应起来。


DM9000移植的要点:

1 基地址(看CS接口)

2 CPU的寄存器设置:位宽,时序等设置

3  设置中断号(看中断接口)
原文链接:https://blog.csdn.net/wangshuchangfrank/article/details/22588179?utm_source=blogxgwz7

 

 

上面的内容是转载的,下面补充本人理解的:

基地址的设置并不一定要0x2000 0000,只要满足在一定范围内,让片选使能;然后LADDR2为0则表示data线上传输的是地址,LADDR2为1表示data线上传输的是数据

 

主控芯片上面发出的地址,只不过决定了DM9000是否被片选,且ADDR2决定了是传输地址还是数据,仅此而已,而访问DM9000上某个寄存器所需的地址,是在数据线上传输的!!!!!!

在DM9000的厂家驱动程序里面,我们可以看到

		outb(DM9KS_VID_L, iobase); /* DM9000C的索引寄存器(cmd引脚为0) */		这里其实就是写 DM9KS_VID_L (0x28)这个值给DM9000,告诉他是地址(通过把ADDR2拉低的方式)id_val = inb(iobase + 4);  /* 读DM9000C的数据寄存器(cmd引脚为1) */	这里就是读取数据了(iobase + 4 表示传输的是数据),读出来到 id_val		这在第二个视频第二分钟的时候有讲到outb(DM9KS_VID_H, iobase);id_val |= inb(iobase + 4) << 8;outb(DM9KS_PID_L, iobase);id_val |= inb(iobase + 4) << 16;outb(DM9KS_PID_H, iobase);id_val |= inb(iobase + 4) << 24;

读DM9000上的寄存器的步骤如下:

把要读取的寄存器地址写到“索引寄存器”里面,然后再读数据寄存器。(怎么分辨操作的是索引寄存器还是数据寄存器呢?通过ADDR2的状态来决定)

 

CMD引脚一般都是接到主控的ADDR2引脚,包括DM9000的厂家程序也是默认如此,所以我们才不用改,如果我们不是把CMD接到ADDR2,而是ADDR1,那 iobase +4 就得改成 iobase + 2 了,但一般没有硬件工程师这么干,而是参照芯片厂家给出的参考电路图去设计的,所以大多数的开发板也都把主控的ADDR2接到DM9000的CMD引脚。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

静态VLAN的配置

在一台交换机上连接3台PC机&#xff0c;然后创建两个VLAN&#xff0c;分别为VLAN 10 和VLAN 20&#xff0c;把第一台PC机分配给VLAN 10&#xff0c;把其他两台分配给VLAN 20.然后测试他们的互通情况。 在这里命令我用的都是简化命令&#xff0c;想卡完整版命令&#xff0c;请到…

静态路由原理

1、路由器的工作原理 路由工作简单原理图 1&#xff09;主机1.1要发生数据包给主机4.1.因为IP地址不在同一网段&#xff0c;所以主机会将数据包发送给本网段的网关路由器。 2&#xff09;路由器A 接收到数据包&#xff0c;先查看数据包IP首部中的目标IP地址。再查找自己的路由表…

静态路由和默认路由

一、静态路由的配置 下边实验对该拓扑图进行配置 实验目标&#xff1a;配置静态路由&#xff0c;实现全网互通 1、配置路由器R1 进入接口f0/0&#xff0c;配置IP&#xff0c;并开启。 进入接口f0/1&#xff0c;配置IP&#xff0c;并开启。 设置静态路由。 查看PC1的路由表 2、配…

IP地址192.168.1.1/24中的/24是什么意思

/24是指子网掩码的位数。 子网掩码的位数总共有32个&#xff0c;写的的/24个就是24个1&#xff0c;其它8位都是0。 /24就可以写成子网掩码是&#xff1a;11111111 11111111 11111111 00000000 例如&#xff1a; /25&#xff0c;就代表有25个1&#xff0c;7个0&#xff0c;…

IP地址中A类、B类、C类地址的区别

区别如下&#xff1a; 1、IP地址表示方法不同&#xff1a; 一个A类IP地址是指&#xff0c; 在IP地址的四段号码中&#xff0c;第一段号码为网络号码&#xff0c;剩下的三段号码为本地计算机的号码。如果用二进制表示IP地址的话&#xff0c;A类IP地址就由1字节的网络地址和3字…

原始套接字简介

一 原始套接字概述 原始套接字&#xff0c;指在传输层下面使用的套接字。流式套接字和数据报套接字这两种套接字工作在传输层&#xff0c;主要为应用层的应用程序提供服务&#xff0c;并且在接收和发送时只能操作数据部分&#xff0c;而不能对IP首部或TCP和UDP首部进行操作&am…

TCP socket心跳包示例程序

TCP socket心跳包示例程序_xqhrs232的专栏-CSDN博客_setsockopt 心跳包 原文地址::TCP socket心跳包示例程序_神奕的专栏-CSDN博客_tcp心跳包 相关文章 1、Linux网络编程--服务端判断客户端断开的经验方法 ----Linux网络编程--服务端判断客户端断开的经验方法_志存高远-CSDN博…

sizeof()计算结构体的大小

原文链接&#xff1a;sizeof()计算结构体的大小_海月汐辰-CSDN博客_结构体的sizeof怎么计算 简要说明&#xff1a;结构体成员按照定义时的顺序依次存储在连续的内存空间&#xff0c;但是结构体的大小并不是简单的把所有成员大小相加&#xff0c;而是遵循一定的规则&#xff0c…

select、poll、epoll使用小结

转载&#xff1a;http://blog.csdn.net/kkxgx/article/details/7717125 Linux上可以使用不同的I/O模型&#xff0c;我们可以通过下图了解常用的I/O模型&#xff1a;同步和异步模型&#xff0c;以及阻塞和非阻塞模型&#xff0c;本文主要分析其中的异步阻塞模型。 一、select使用…

Qt报错:undefined reference to xxxxx

报错信息&#xff1a; 首先&#xff0c;要区分与undefined reference to xxxxx和 "xxxx was not declared in this scope"两种报错信息的差别&#xff0c;前者是因为编译器能找到函数的声明&#xff0c;但是找不到函数的定义&#xff0c;从而报错&#xff1b;而后者是…

对象的浅拷贝和深拷贝

对象的浅拷贝和深拷贝简要介绍代码实现简要介绍 浅拷贝&#xff1a;python拷贝一般都是浅拷贝。拷贝时&#xff0c;对象包含的子对象内容不拷贝。因此&#xff0c;源对象和拷贝对象引用同一个对象 深拷贝&#xff1a;使用copy模块的deepcopy函数&#xff0c;递归拷贝对象中包含…

用模板写单链表

转载自&#xff1a;http://blog.csdn.net/itcastcpp/article/details/39081953 为了加深对模板的理解&#xff0c;我们今天一起用模板写一个单链表&#xff0c;希望通过这个例子&#xff0c;能够帮助大家加深对模板的体会&#xff0c;具体如下&#xff1a; SList.hpp内容&#…

QT事件事件之一:Qt中的事件处理与传递

QT事件事件之一&#xff1a;Qt中的事件处理与传递前言一、简介二、QT中的事件三、事件的实现的方法前言 在QT中&#xff0c;事件是我们很常用的东西&#xff0c;以下是我用事件时总结和做法 一、简介 在QT中&#xff0c;事件作为一个对象&#xff0c;继承QEvent类&#xff0c…

linux下成功安装ffmpeg( 亲测有效 )

linux下成功安装ffmpeg&#xff08; 亲测有效 &#xff09;一、下载二、安装步骤1.安装yasm2.安装ffmpeg总结一、下载 ffmpeg 官网下载&#xff1a; http://ffmpeg.org/download.html 安装yasm 官网下载&#xff1a;http://yasm.tortall.net/Download.html 二、安装步骤 1.…

C++实现 简单 单链表

转自&#xff1a; http://blog.csdn.net/wonggonghong/article/details/21527577 我们首先建立一个<List.h>头文件&#xff0c;声明一个单链表结构&#xff1a; #include "List.h" [cpp] view plaincopy //创建一个单链表结构&#xff0c;包含一些常见的操作 …

ffmpeg音视频基础知识

ffmpeg音视频基础知识前言一、图像的基础知识二、视频编码基础知识1.视频和图片之间的关系2.为什么要编码&#xff1f;3.什么是编码&#xff1f;视频相关专业术语提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言…

Linux系统编程(一)

Linux系统编程&#xff08;一&#xff09;一、进程和程序二、内存布局内核空间用户空间三、进程状态四、环境变量五、进程共享一、进程和程序 程序&#xff1a;是指编译好的二进制文件&#xff0c;存储在磁盘中&#xff0c;不占用系统资源。 进程&#xff1a;是系统进行资源分…

Linux的SOCKET编程 简单演示

转载&#xff1a;http://blog.csdn.net/hguisu/article/details/7445768/ Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行&#xff0c;为保证两个相互通信的进 程之间既互不干扰又协调一致工作&a…

Unity(一)必然事件

【MonoBehaviour 类】&#xff08;一&#xff09;必然事件一、必然事件是什么&#xff1f;二、常用函数执行顺序1.Awake2.Start3.update4.FixedUpdate三、Awake和start区别一、必然事件是什么&#xff1f; 在Unity中必然事件也称脚本生命周期&#xff0c;是指在Unity脚本在唤醒…

Linux系统编程(二)孤儿进程和僵尸进程

Linux系统编程&#xff08;二&#xff09;一、exec函数族1.exec函数二、孤儿进程和僵尸进程三、wait和waitpid1.wait函数2.waitpid函数一、exec函数族 exec函数使用时&#xff0c;改程序的用户空间的代码和数据会被新程序给替代&#xff0c;会从新程序的启动例程开始。调用exe…