dm9000网卡,uboot代码分析

2023-10-31

uboot移植(九)移植网卡DM9000

 

一、原理

TQ210 板载的网卡芯片是 DM9000A,接在 S5PV210 的 SROM 控制器的 BANK1 上。
S5PV210 的 SROM 控制器支持 8/16 位 NOR Flash/PROM/SRAM 内存。 分为 6 个 bank,每个 bank 寻
址空间达 128MB。 每个 bank 有一个片选信号 nGCS[5:0], 用来选通外接的内存芯片。 当发的地址在
bank1 的寻址范围内(0x88000000~0x8FFFFFFF)时,表示在访问 bank1, 此时 nGCS1 信号被拉低,
这就选中了接在 bank1 上的 DM9000A 网卡芯片。 S5PV210 手册给出了每个 bank 的地址空间

二、引脚控制

当对某个地址进行读操作时, S5PV210 的 Xm0OEn 信号被自动拉低,这个信号引脚接在 DM9000A 的
nIOR 上, 这就对 DM9000A 进行了读使能,可以从 DM9000A 读数据;

当对某个地址进行写操作时,S5PV210 的 Xm0WEn 信号被自动拉低,这个信号引脚接在 DM9000A 的 nIOW 上,这就对 DM9000A进行了写使能,可以向 DM9000A 写数据。

DM9000A 的 16 根数据线全部接在 S5PV210 的数据线上。

DM9000A 包含一系列可被访问的控制状态寄存器,这些寄存器是字节对齐的,他们在硬件或软件复
位时被设置成初始值。

DM9000A 有 2 个端口: DATA 和 INDEX(即地址)。 DM9000A 的地址和数据线复用, 当 CMD 引脚为低电平时,操作的是 INDEX 端口,当 CMD 引脚为高电平时操作的是 DATA 端口。CMD 引脚接在 S5PV210 的地址线 Xm0ADDR2 上。

三、读写操作

假设要读取 DM9000A 的寄存器 RSR(RX Status Register),需要分 2 步:
1) 向 INDEX 端口写入 RSR 寄存器的地址(0x06)
        条件: nGCS1 信号拉低、 Xm0WEn 信号拉低、 Xm0ADDR2 拉低, 或者说向下面的地址写数据 0x06
(0x88000000~0x8FFFFFFF) & ~(1 << 2)
2) 从 DATA 端口读取 RSR 寄存器的值
        条件: nGCS1 信号拉低、 Xm0OEn 信号拉低、 Xm0ADDR2 拉高, 或者说从下面的地址读数据
(0x88000000~0x8FFFFFFF) | (1 << 2)

假设要向 DM9000A 的寄存器 TCR(TX Control Register)写数据 0x56,同样需要 2 步
1) 向 INDEX 端口写入 TCR 寄存器的地址(0x02)
        条件: nGCS1 信号拉低、 Xm0WEn 信号拉低、 Xm0ADDR2 拉低, 或者说向下面的地址写数据 0x02
(0x88000000~0x8FFFFFFF) & ~(1 << 2)
2) 将要写入的数据(0x56) 写入 DATA 端口
        条件: nGCS1 信号拉低、 Xm0WEn 信号拉低、 Xm0ADDR2 拉高,或者说向下面的地址写数据 0x56
(0x88000000~0x8FFFFFFF) | (1 << 2)
有了这些理论知识就可以确定 DM9000A 的基地址了,在后面会用到。

四、DM9000移植

4.1、SROM 控制器

首先我们要初始化 S5PV210 的 SROM 控制器,设置相关时序。 针对 SROM 控制器的每一个 bank 只有
2 个寄存器: SROM_BW 和 SROM_BC,我要配置的是 bank1,所以只需配置 SROM_BW 和 SROM_BC1
在 SROM_BW 寄存器中,我们只关心与 bank1 相关的域

上面分析过, DM9000A 的 16 根数据线全部接在 S5PV210 的数据线上,所以 DataWidth1 设置为 1
DM9000A 的地址是按字节存取的,所以 AddrMode1 设置为 1,通过查看原理图,没有使用 Xm0WAITn
和 Xm0BEn 引脚,所以 WaitEnable1 和 ByteEnable1 均设置为 0
SROM_BW[7:4]=0x3

4.2、SROM 控制器读时序和 DM9000A 的读时序

下面分析时序,设置 SROM_BC1 寄存器

上面 2 个时序图分别为 S5PV210 的 SROM 控制器读时序和 DM9000A 的读时序
Tacs:地址发出后等多长时间发片选, DM9000A 中 CS 和 CMD(地址)同时发出,所以 Tacs=0ns
Tcos:发出片选信号后等多长时间发出读使能信号(nOW、 IOR),在 DM9000A 的时序图上对应 T1,
最小为 0,我们稍微设置大点 Tcos=5ns
Tacc:读使能信号持续时间,在 DM9000A 的时序图上对应 T2,我们设置为设置 Tacc=15ns
Tcoh:读使能信号结束后,片选信号保持时间,在 DM9000A 的时序图中对应 T5,所以可以设置
Tcoh=5ns
Tcah:片选结束后,地址保存时间, DM9000A 中片选和地址同时结束,所以 Tcah=0
Tacp:页模式,不管
PMC:页模式,不管
S5PV210 的 SROM 控制器使用 MSYS 域提供 HCLK 时钟,为 200MHz,一个 clock 为 5ns。
u-boot 已经自带了 DM9000A 的驱动,另外,在 u-boot 源码中的 dm9000x.c 的注释中有一段话

专门为 DM9000A 升级了该驱动。
通过跟踪代码进入到 board.c 中的 board_init_r 函数

如果定义了 CONFIG_CMD_NET,就调用 eth_initialize(gd->bd)进行网卡初始化。这个宏在
config_cmd_default.h 中定义,这个头文件又被单板配置文件 Louis210.h 所包含。

eth_initialize 函数在 u-boot-2014.04/net/eth.c 中定义

这里已经有注释,如果定义了单板相关的初始化函数就调用它,否则调用 CPU 相关的初始化函数。
我们继续看下__def_eth_init 函数,同样在 u-boot-2014.04/net/eth.c 中定义

这里用到了 gcc 的弱符号和别名属性, 前面分析过。 如果我们没有定义自己的 board_eth_init 函数,
则 board_eth_init 就和__def_eth_init 相同,调用 board_eth_init 就相当于调用__def_eth_init,现在就能明白上面的 if 判断语句了。
board_eth_init 在 u-boot-2014.04/board/samsung/Louis210/Louis210.c 中定义

这里通过配置宏来决定调用哪个网卡初始化函数, 同时在 Louis210.c 中还有个函数 smc9115_pre_init这个函数用来设置 SROM 控制器。我们使用的是 DM9000A,我们先查看下 DM9000A 的源码,看下使用哪个初始化函数
u-boot-2014.04/drivers/net/DM9000Ax.c

看到这个函数比较像,并且它需要一个 bd_t *类型参数,而 board_eth_init 也传进来一个 bd_t *的参
数,因此就调用这个 DM9000A 的初始化函数,在这个函数中 dm9000_get_enetaddr 从 EEPROM 加载
MAC地址,这个函数根据宏CONFIG_DM9000_NO_SROM 来决定是否从EEPROM 加载MAC地址, TQ210
上的 DM9000A 没有接 EEPROM,我们将在 Louis210.h 中定义这个宏,表示不从 EEPROM 加载 MAC
地址。 另外,我们还需要知道如何才能把 DM9000A 的驱动编译进 u-boo.bint,我们查看
u-boot-2014.04/drivers/net/Makefile

从 Makefile 得知,需要定义 CONFIG_DRIVER_DM9000 这个宏。
修改 board_eth_init 函数

同时我们看到在 Louis210.c 中的 board_init 函数还调用了 smc9115 的初始化,我们不需要,把它屏
蔽掉,然后仿照实现 dm9000_pre_init 函数,初始化 SROM

然后在配置文件 Louis210.h 中添加宏 CONFIG_DRIVER_DM9000,同时屏蔽掉 smc9111 的相关宏

现在编译 u-boot.bin,执行 make all,出错

没有定义 CONFIG_DM9000_BASEDM9000_DATA DM9000_IO
CONFIG_DM9000_BASE:DM9000A 的基地址
DM9000_DATA:DM9000A 的 DATA 端口地址
DM9000_IO:DM9000A 的 INDEX 端口地址


在前面分析过如何确定这些地址。另外,我们还需要添加一些 u-boot 的命令,比如 ping、 tftpboot。
ping 命令用来检查网络是否通畅, tftpboot 用来从 tftp 服务器下载文件。
如何知道 u-boot 支持哪些命令,查看头文件: u-boot-2014.04/include/config_cmd_all.h,该头文件的注释也说明, 该文件列出了所有可用的命令:

另外在 Louis210.h 中包含了头文件 config_cmd_default.h,里面定义了一些命令,这是 u-boot 默认
配置的命令,我们看下里面有没有我们需要配置的,如果没有,我们就需要自己配置

可以看到 CONFIG_CMD_NET 已经配置了,所以我们只需要配置 CONFIG_CMD_PING 命令。
在 smdkv210.h 中定义这些宏

这里的 DM9000_DATA 定义为基地址+0x4,刚好把 Xm0ADDR2 拉高,即把 CMD 拉高。
网上很多文章说什么基地址要加 0x300,全是无稽之谈,还解释得头头是道。
再次编译,成功生成 u-boot.bin,将 u-boot.bin 烧尽 SD 卡,从 SD 卡启动开发板

有的时候能读取到 DM9000A 的 ID,连续操作就能读取到 DM9000A 的 ID,但间隔一会操作就读取不
到 DM9000A 的 ID,通过调试,在 dm9000x.c 的 dm9000_reset 函数中加一句延时操作,就可以正
常读取 DM9000A 的 ID 了。

首先设置环境变量
ipaddr: u-boot 的 IP
ethaddr: u-boot 的 MAC 地址
serverip: u-boot 通过 tftpboot 从哪里下载文件的 PC 机的 IP
我的电脑的 IP 为 192.168.1.101,进行如下设置

可以 ping 通
下面使用 tftpboot 下载文件到内存,首先打开 tftp 服务器软件 tftpd32.exe

下载成功。
另外,我们可以在单板配置文件 smdkv210.h 中定义这些环境变量

再次编译,烧写到 SD 卡,启动后可以直接使用


 

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

dm9000网卡,uboot代码分析 的相关文章

  • 与ag-Grid一起使用的Vue组件

    ag Grid Vue组件 ag Grid Vue Component 现场演示 Live Demo https www ag grid com https www ag grid com 用Bower安装 Install with Bow
  • VMware虚拟机安装Windows Server 2008 R2

    想必同学们已经开学了 也都进入了军训阶段吧 而很多计算机网络专业的同学们要开始接触到Windows Server了 这也是计算机网络技术专业的专业基础课程 想当年我们实训课学习使用的好像是2008版的 也不晓得现在各个学校会用到哪个版本实操
  • matlab做三次拉格朗日插值多项式_MATLAB的插值与拟合

    一 插值 什么是插值 首先看一下 百度百科的定义 在离散数据的基础上补插连续函数 使得这条连续曲线通过全部给定的离散数据点 从古到今 百度百科的定义一直 欲哭无泪 这是啥意思 简而言之就是 我现在有n个点对应的函数值 但是我想知道 在这个区
  • 科研经验干货帖(包含文献阅读方法、论文书写和投递技巧以及回复审稿意见的注意事项)

    科研经验干货帖 科研小白自己整理科研大神国奖师兄的经验分享笔记 以便自己查看 科研的流程 发现问题 论文idea从这里开始 想要多产生idea要多阅读领域内最好的文章 重现他们的实验 然后解决这些文章存在的问题 因此后面会讲如何阅读文献 核

随机推荐

  • 用matlab画y=cos(x)函数(记录学习过程)

    初始代码 创建横坐标的数据点 x linspace 0 12 1000 计算纵坐标的数据点 y cos x 绘制曲线 plot x y r 设置坐标轴范围 xlim 0 12 ylim 1 1 给y坐标着色 set gca YColor g
  • python爬虫入门心得体会,python爬虫入门和实例

    爬虫不外乎是为了获取网络上的信息 要取得信息 你就得给给服务器发请求 然后服务器把信息发给你 这一步一般较为简单 服务器发给你的一般是一个html文件 拿到文件后 你可能会觉得这是什么乱七八糟的东西 怎么都看不懂 我觉得对于一个非计算机系的
  • 叉积

    叉积的计算是线段方法的核心 考虑如图33 1 a 所示的向量p1和p2 我们可以把叉积解释为由点 0 0 p1 p2 和 p1 p2 x1 x2 y1 y2 所构成的平行四边形的有向面积 另一种与之等价但更有效的叉积定义方式是将之看做矩阵行
  • 《算法不好玩》专题三:循环不变量

    3 1循环不变量 循环不变量 在循环的过程中保持不变的性质 循环不变式主要用来帮助我们理解算法的正确性 关于循环不变式 我们必须证明三条性质 初始化 循环的第一次迭代之前 它为真 保持 如果循环的某次迭代之前它为真 那么下次迭代之前它仍为真
  • 压缩图片网站

    https tinypng com 压缩图片网站
  • java入职写不出代码_各位程序员是怎么度过看懂代码但写不出来的时期?

    说实话 我自己就没经历过这样的时期 说看得懂代码的 大概是很少看开源代码 想看懂不仅自己水平要过硬 还要花挺大的精力把前前后后的东西都做充分的研究 我自己总是会有自己写一个功能很有思路 但是搞懂别人同样功能代码却感觉很费力的体验 我猜测题主
  • safari ajax timeout,Safari ajax提交表单无响应?

    两个项目均遇到了Safari ajax提交无响应了 表单里有text file字段 file字段用于上传封面图片 创建的时候没问题 当修改的时候 我不想修改封面图 只修改内容 结果Safari提交后无响应 一直在转圈 到最后超时提示 Fai
  • 2020年,Java 开发者必须了解的 16 个Java 顶级开源项目

    2020年 值得你关注的16个Java 开源项目 本文已经收录自笔者开源的 JavaGuide https github com Snailclimb JavaGuide Java学习 面试指南 一份涵盖大部分Java程序员所需要掌握的核心
  • linux qt读写文件,QT 文件读写操作

    include include 1 打开文件 QFile f fn fn可以是一个相对路径或绝对路径 f open IO 一般不要IO ReadWrite 很容易出现赃数据 如果要在文件的后面添加内容要IO WriteOnly IO App
  • C/C++动态分配内存的几种方法

    使用C C 编程时 会经常动态分配内存 以便合理使用内存 本文主要讲述动态内存分配的几种方法及一些原理 理解不深刻之处欢迎指教 引言 为什么要进行动态内存分配 以数组为例 数组元素在内存中存储的地址是连续的 声明一个数组后 该数组需要的内存
  • 微信小程序设置背景图片

    var src1 images index wx56 png let src11 wx getFileSystemManager readFileSync src1 base64 var src111 data image jpg base
  • IntelliJ IDEA查看指定文件的文件类型、修改文件类型、解决无法正确识别文件类型的问题

    如下图 有时候明明创建的文件后缀名为 xml 可是点进去确是文本文件 一开始实在是觉得匪夷所思 那如何让编辑器识别他是xml文件呢 首先File Settings 然后 这里我要把RoleMapper xml识别为xml文件 编辑器提示Ro
  • windows下prometheus+mysqld_exporter+granafa监控mysql

    一 安装prometheus 可以从官网下载 也可以从github下载 从github下载快一点 官网 https prometheus io download github https github com prometheus prom
  • Python记1(输入/出,字符,数据类型,运算符,语句,with

    目录 1 杂 2 输入 输出 3 特殊字符 转义字符 5 数据类型 5 1数据类型转化 6 运算符 7 语句 7 1 条件分支 if elif elif else 7 2 条件表达式 7 3 循环while for 7 4 上下文管理类型
  • React中组件懒加载的使用

    为什么要使用懒加载 减少了应用启动时间 页面的加载速度变快 提升用户体验 懒加载 页面首次打开 不加载在路由中设置为懒加载的组件 只有用户在实际使用中 使用到了这个组件 才会开始加载 实现代码 import React lazy from
  • VMware Workstation Player与VMware Workstation Pro的区别

    linux开发与学习 免不了安装虚拟机 想想自己最开始只有一台电脑 为了体验最有滋味的linux 划重点 直接装了个双系统 之后就是各种苦不堪言 在ubuntu学着做着 为了个工具不得不关机重启回到windows 过了一分钟 切到windo
  • JS高级(4)函数高级 — 闭包

    闭包 循环遍历 给每个按钮都绑定上单击响应函数 var btns document getElementsByTagName button for var i 0 i lt btns length i 这样写会有一个问题 btns是一个伪数
  • 什么是区块链?区块链详解

    区块链简介 什么是区块链 目前没有看到很好的定义和介绍 网上要么是讲一些区块链意义的空泛文章 比如 区块链技术颠覆谁谁谁 又或 互联网已颠覆世界 区块链要颠覆互联网等等 要么就是通篇介绍比特币 矿工 挖矿等 那么区块链到底是个什么东西 它跟
  • python bottle 制作表单_使用Bottle(Python)的AJAX提交表单

    我在使用Bottle框架进行 AJAX通信时遇到了一些问题 这是我第一次使用AJAX 所以我可能只是错误的基础知识 希望瓶子 AJAX大师可以指出这个新手正确的方向 这是我正在使用的代码 usr bin env python from bo
  • dm9000网卡,uboot代码分析

    uboot移植 九 移植网卡DM9000 一 原理 TQ210 板载的网卡芯片是 DM9000A 接在 S5PV210 的 SROM 控制器的 BANK1 上 S5PV210 的 SROM 控制器支持 8 16 位 NOR Flash PR