一、原理

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_DATADM9000_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 卡,启动后可以直接使用

uboot移植(九)移植网卡DM9000相关推荐

  1. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  2. S5PV210 Uboot开发与移植02:Uboot配置与编译

    目录 1. uboot源码目录简介 2. uboot编译原理引入 2.1 功能模块配置 2.1.1 在.c文件中不编译相应的功能语句 2.1.2 在make时不编译相应的功能模块 2.2 跨平台编译环 ...

  3. S5PV210 Uboot开发与移植03:Uboot启动流程详解

    目录 1. start.S解析 1.1 uboot入口分析 1.2 头文件包含 1.2.1 config.h 1.2.2 version.h 1.2.3 asm/proc/domain.h 1.2.4 ...

  4. x210:uboot和系统移植

    注:本文是对朱老师uboot和系统移植课程的备忘引导性笔记,主要是为了能够在学完后快速回忆起相关内容.本文主要记录了一些关键易忘性知识点并包含少量理解性内容,遵循尽量精简的原则,以尽量少的篇幅概括整个 ...

  5. 嵌入式linux之Uboot和系统移植--基础

    <uboot和系统移植-第1部分-uboot学习前传> (观看朱友鹏老师视频后整理的笔记)   1.为什么要有uboot 2.为什么是uboot 3.uboot必须解决哪些问题 4.ubo ...

  6. omapl138移植uboot系列之移植板卡(第五篇)

    上节操作完成后,虽然uboot中有了我们自己的板卡,但并未进行移植,所以现在是还不能烧录的,本节将带领大家根据自己的板卡进行uboot移植. 2.4.1 图形界面下配置 命令行执行 make menu ...

  7. uboot和系统移植-第1部分-2.1 uboot学习前传

    uboot和系统移植-第1部分-2.1 uboot学习前传 第一部分.章节目录 2.1.1. 为什么要有uboot (1)uboot最主要作用是用来启动操作系统内核.因为操作系统内核本身不能自己启动自 ...

  8. uboot中IDE移植

    1.配置 首先要支持IDE需要在CONFIG_COMMANDS中添加CFG_CMD_IDE命令,然后要添加IDE的相关配置信息.不看代码就不知道需要哪些信息,可以先编译一下试试,如果出错就会提示哪些宏 ...

  9. 话说linux内核-uboot和系统移植第14部分-朱有鹏-专题视频课程

    话说linux内核-uboot和系统移植第14部分-5304人已学习 课程介绍         本课程为linux kernel移植的第1部分,主要内容是对linux内核有关的知识和概念的补充.认识清 ...

  10. Uboot UBI 的移植

    转载地址:http://blog.csdn.net/longfeey/article/details/5887007 作者 :longfeey 1.1         Uboot UBI 的移植 关于 ...

最新文章

  1. inodemac_校园网客户端Mac版-Inode7.0 for mac下载 V7.0-PC6苹果网
  2. OC中description、 SEL、类本质、self和super用法
  3. 【英文写作日知录 第2期】句式汇总 Sun, 04 July 2021
  4. 切换账号_在iOS 13在如何切换App Store账号
  5. Linux btrfs之文件系统转换
  6. python函数进阶小结_Python 函数3000字使用总结
  7. win11游戏窗口化如何设置 windows11游戏窗口化的设置方法
  8. OpenPLC:符合IEC 61131-3标准的用于网络安全研究的开源工业控制器
  9. 参数整定类毕业论文文献有哪些?
  10. 汇编语言简明教程习题答案
  11. 程序员工具箱--我常用的工具
  12. pythonwin7下载教程_如何在win7下安装Python及配置!python win7下载教程
  13. 使用web3.py获取zkSync中的数据
  14. Java实现邮箱激活验证
  15. 机器学习平台基础知识
  16. 【火炉炼AI】机器学习044-创建隐马尔科夫模型
  17. 服务器安装windows2016选择磁盘时报错不能将系统安装到此盘符
  18. JS中事件绑定的方式以及事件监听和事件的委托
  19. P6770 [USACO05MAR]Checking an Alibi 不在场的证明(spfa)
  20. 电路板之间接线的注意方法

热门文章

  1. ApacheCN 翻译活动进度公告 2019.4.23
  2. Windows server 2012 R2 DHCP主从热备配合华为交换机DHCP中继配置详解(非域控版本)
  3. python canopen_CAN与CANOPEN在电机控制中的应用
  4. HYNB Contest 7:2017 Asia HCMC Vietnam National Programming Contest
  5. 普联的路由器TL-WR842N和TL-WR845N还有 TL-WR847N哪一个更好,我是家用
  6. GDOI#345. 送礼物「JSOI 2015」01分数规划+RMQ
  7. 学生上课考勤系统jsp_jsp+ssm+mysql课堂考勤系统
  8. xss challenges闯关详细(6-10)
  9. 求知若饥,虚心若愚Stay Hungry, Stay Foolish--2005斯坦福大学05年毕业演讲
  10. JAVA intercupt_2016年CUPT竞赛参考文献.pdf