xilinx uboot网卡驱动分析和一些概念扫盲

合集下载

网卡驱动——精选推荐

网卡驱动——精选推荐

⽹卡驱动⼀、配置菜单Device Drivers[*] Network device support --->⽹络设备驱动、⽹卡驱动< > Bonding driver support功能:多⽹卡绑定具体操作为:将多个以太⽹通道绑定为⼀个,也就是两块⽹卡具有相同的IP地址并且聚合成⼀个逻辑链路⼯作,可以⽤来实现负载均衡或硬件冗余< > Dummy net driver support功能:哑接⼝⽹络使⽤环境:使⽤SLIP或PPP传输协议(如ADSL⽤户)的需要它具体操作:设置⼀个虚拟⽹络。

虚拟⽹络(dummy network)就像⽹络中的/dev/null。

任何发送给虚拟⽹络的数据都会永久消失,因为它会发往/dev/null。

IP地址没有设置。

⽤户可以定义他们的⽹络相当于/dev/null)< > EQL (serial line load balancing) support功能:串⾏线路的负载均衡具体操作:如果有两个MODEM和两条电话线⽽且⽤SLIP或PPP协议,该选项可以让您同时使⽤这两个MODEM以达到双倍速度(在⽹络的另⼀端也要有同样的设备)< > Generic Media Independent Interface device support功能:通⽤媒体独⽴接⼝设备⽀持背景介绍:MII是⼀种⽤于最⾼速度为100Mbit/s以太⽹的接⼝。

以太⽹线缆⽤于连接到PHY ceiver,是⼀种以太⽹收发器< > Ethernet team driver support (EXPERIMENTAL) --->功能:team⽹卡组⽀持背景介绍:通过虚拟接⼝组织许多以太⽹设备< > MAC-VLAN support (EXPERIMENTAL)功能:允许⽤户在特定的MAC地址和某个接⼝上映射数据包具体操作:基于MAC地址的VLAN,⼀种根据报⽂的源MAC地址来确定untagged报⽂所属VLAN的划分⽅法< > Network console logging support⽹络远程命令⽀持,远程登录⽤注意:内核发送给⽹络的消息可任意通过这个特性记录下来。

uboot移植与源码分析总结(6)-Nand驱动

uboot移植与源码分析总结(6)-Nand驱动

uboot移植与源码分析总结(6)-Nand驱动uboot移植与源码分析总结(6)-Nand驱动2013-06-29 11:32:17分享:有关nand flash的特性描述,可以见我之前写的这篇文章《NandFlash结构与分析》。

从功能上来说,nand flash与norflash 并无太大差异,主要区别在于操作接口和方式。

Nand基于非sram总线接口,使用nand接口,所以一般需要mcu具有nand控制器才可与其连接。

在读取时,以页为单位;擦除和写入时,以块为单位。

将nand视作一个MTD设备uboot将nand视作一个mtd设备,所以使用mtd机制对nand 设备进行管理。

单个nand设备用nand_info_t来描述。

而nand_info_t实际上就是mtd结构。

最多支持的nand设备数CONFIG_SYS_MAX_NAND_DEVICE可由开发者自行配置。

不过一般目标板上只有一块Nand设备,所以取值通常为1。

但是仅使用mtd结构来描述不够,因为MTD只是一个通用的存储描述结构,而Nand设备特定的某些属性,如ECC布局等不能简单的添加到mtd结构中。

所以,uboot定义了nand_chip结构。

int (*verify_buf)(struct mtd_info *mtd, const uint8_t *buf, int len);void (*select_chip)(struct mtd_info *mtd, int chip);int (*block_bad)(struct mtd_info *mtd, loff_t ofs, int getchip);int (*block_markbad)(struct mtd_info *mtd, loff_t ofs);void (*cmd_ctrl)(struct mtd_info *mtd, int dat, unsigned int ctrl);int (*init_size)(struct mtd_info *mtd, struct nand_chip *this, u8 *id_data);int (*dev_ready)(struct mtd_info *mtd);void (*cmdfunc)(struct mtd_info *mtd, unsigned command, int column,int page_addr);int(*waitfunc)(struct mtd_info *mtd, struct nand_chip *this);void (*erase_cmd)(struct mtd_info *mtd, int page);int (*scan_bbt)(struct mtd_info *mtd);int (*errstat)(struct mtd_info *mtd, struct nand_chip *this, int state,int status, int page);int (*write_page)(struct mtd_info *mtd, struct nand_chip *chip,const uint8_t *buf, int page, int cached, int raw);int chip_delay;unsigned int options;int page_shift;int phys_erase_shift;int bbt_erase_shift;int chip_shift;int numchips;uint64_t chipsize;然后,分配了CONFIG_SYS_MAX_NAND_DEVICE个nand_chip 结构。

uboot到底是干嘛的-

uboot到底是干嘛的-

uboot到底是干嘛的?1.为什么要有uboot1.1、计算机系统的主要部件1.2、PC机的启动过程1.3、典型嵌入式1.4、1.5、总结:uboot到底是干嘛的2.1、uboot从哪里来的?2.2、uboot的发展历程2.3、uboot的版本号问题2.4、uboot的可移植性的正确理解3.1、自身可开机直接启动3.2、能够引导操作系统内核启动并给内核传参3.3、能提供系统部署功能3.4能进行soc级和板级硬件管理3.5、uboot的“生命周期”总结:一切都是为了启动内核4.1、从裸机程序镜像uboot.bin说起4.2、uboot的命令式shell界面4.3、掌握uboot使用的2个关键点:命令和环境变量5.1、类似linux终端的行缓冲命令行5.2、命令中的特殊符号(譬如单引号)5.3、有些命令是一个命令族(譬如movi)7.1、开发板运行linux下和主机Windows 的ping通7.2、开发板运行linux下和虚拟机ubuntu的ping通7.3、开发板运行uboot下和主机Windows的ping通7.4、开发板运行uboot下和虚拟机ubuntu的ping通8.1、tftp下载指令:tftp9.1、SD卡/iNand操作指令movi9.2、NandFlash操作指令nand9.3、内存操作指令:mm、mw、md9.4、启动内核指令:bootm、go10.1、环境变量如何参与程序运行11.1、自动运行命令设置:bootcmd11.2、uboot给kernel传参:bootargs11.3、新建、更改、删除一个环境变量的方法12.1、uboot阶段Flash的分区12.2、uboot阶段DDR的分区(1)DDR的分区和Flash的分区不同,主要是因为Flash是掉电存在的,而DDR是掉电消失,因此可以说DDR是每次系统运行时才开始部署使用的。

(2)内存的分区主要是在linux内核启动起来之前,linux内核启动后内核的内存管理模块会接管整个内存空间,那时候就不用我们来管了。

UBOOT源码分析

UBOOT源码分析

UBOOT源码分析UBOOT是一种开放源码的引导加载程序。

作为嵌入式系统启动的第一阶段,它负责初始化硬件设备、设置系统环境变量、加载内核镜像以及跳转到内核开始执行。

Uboot的源码是开放的,让我们可以深入了解其内部工作机制和自定义一些功能。

Uboot源码的文件组织结构非常清晰,主要分为三个大类:目录、文件和配置。

其中目录包含了一系列相关的文件,文件存放具体的源码实现代码,配置文件包含了针对特定硬件平台的配置选项。

Uboot源码的核心部分是启动代码,位于arch目录下的CPU架构相关目录中。

不同的CPU架构拥有不同的启动代码实现,如arm、x86等。

这些启动代码主要包括以下几个关键功能:1. 初始化硬件设备:Uboot首先需要初始化硬件设备,例如设置时钟、中断控制器、串口等设备。

这些初始化操作是在启动代码中完成的。

通过查看该部分代码,我们可以了解硬件的初始化过程,以及如何配置相关寄存器。

2. 设置启动参数:Uboot启动参数存储在一个称为"bd_info"的数据结构中,它包含了一些关键的设备和内存信息,例如DRAM大小、Flash 大小等。

这些参数是在启动代码中设置的,以便内核启动时能够正确识别硬件情况。

3. 加载内核镜像:Uboot负责加载内核镜像到内存中,以便内核可以正确执行。

在启动代码中,会通过读取Flash设备或者网络等方式,将内核镜像加载到指定的内存地址处。

加载过程中,可能会进行一些校验和修正操作,以确保内核数据的完整性。

4. 启动内核:在内核镜像加载完成后,Uboot会设置一些寄存器的值,并执行一个汇编指令,跳转到内核开始执行。

此时,Uboot的使命即结束,控制权交由内核处理。

除了启动代码,Uboot源码中还包含了许多其他功能模块,如命令行解析器、存储设备驱动、网络协议栈等。

这些功能模块可以根据需求进行配置和编译,以满足不同平台的需求。

例如,可以通过配置文件选择启用一些功能模块,或者自定义一些新的功能。

Linux SD卡驱动分析

Linux SD卡驱动分析
d v l p n Be a s o is h r c e i tc S e e 0 i g. c u e f t c a a t r si , D c r a d h Li ux p -r tn s se w ih t s p r o p r o r nc o e e d d e c s a d n t e n o e a i g y t m t i s u e i r e f - ma e n mb d e d vi e
文章 编 号 : 6 2 3 9 ( 0 1 l ( 一0 1 — 2 1 7 - 7 1 2 1 ) 2 c 0 1 0 )
SD Ca d r Drv r i e An l i I Th Liu Op r to Sys e a yss n e nx e a in t m
Ho g i n L Qu l i a3 L
( ol e o nomain Wu iU iest。 i g n Ci , und n rvn e 5 9 2 ) C lg f Ifr t . y nvri Ja me t G ag o g Po i 2 0 0 e o y n y c
Ab ta t Wih h d v l p n o h r wa e f o ut r n t e n r a i o d t . h r q i e nt f t r g d v c i a s s r c : t t e e e o me t f a d r o c mp e a d h i c e s ng f a a t e e u r me o s o a e e i e s lo
d r ve An s me o i w i h t e C r Co e a t o t r l t -o s i . - i r。 d o f t t h a e, r p r f he e a i n h p

xilinx驱动方案

xilinx驱动方案

xilinx驱动方案Xilinx是一家全球领先的可编程逻辑器件(FPGA)和深度学习处理器(ACAP)供应商。

作为一家创新型的半导体公司,Xilinx致力于为客户提供高性能、低功耗和高适应性的解决方案。

在这篇文章中,我们将探讨Xilinx的驱动方案以及其在不同领域的应用。

一、什么是Xilinx驱动方案Xilinx驱动方案是基于Xilinx平台的硬件和软件集成开发环境,为开发人员提供丰富的工具和资源,以便设计、构建和部署高性能的应用解决方案。

这些方案主要包括:1. Vivado开发套件:Vivado是一套完整的设计环境,支持FPGA的设计、仿真和综合。

它提供了直观而强大的界面,使设计人员能够快速创建和调试复杂的电路。

2. PetaLinux嵌入式开发套件:PetaLinux是一个基于Linux的嵌入式开发工具,专为基于Xilinx器件的嵌入式系统设计而开发。

它提供了完整的Linux源码、驱动程序和工具链,方便开发人员进行软件开发和系统集成。

3. SDSoC开发环境:SDSoC是一个面向系统设计者的开发环境,可以将C/C++代码转化为高性能的硬件加速器。

它通过自动化的编译和优化过程,使开发人员能够更轻松地使用FPGA来加速应用程序的运行。

4. SDAccel开发环境:SDAccel是一个面向开发者的加速应用程序开发环境,结合了软件编程模型和硬件加速技术。

它支持OpenCL编程模型,使开发人员能够使用高级语言进行开发,并在FPGA上实现高性能计算加速。

二、Xilinx驱动方案的应用Xilinx驱动方案广泛应用于各个领域,下面将介绍其中几个典型的应用案例:1. 通信与网络:Xilinx驱动方案在通信与网络领域中发挥着重要的作用。

例如,在5G通信中,Xilinx的FPGA可以通过高速数据传输和实时处理来提供更高的带宽和低延迟。

此外,Xilinx还提供了各种网络接口协议的IP核,如Ethernet、PCIe等,用于实现高性能的数据传输。

网卡驱动原理

网卡驱动原理

网卡驱动原理
网卡驱动是一种软件程序,它充当操作系统和计算机网络之间的桥梁,使得计算机可以与网络进行通信。

网卡驱动的主要功能是控制和管理网卡硬件,并提供相应的接口,使操作系统能够利用网卡进行数据的发送和接收。

网卡驱动的工作原理可以分为以下几个步骤:
1. 硬件识别:当计算机启动时,操作系统会进行硬件检测和识别,其中也会包括网卡硬件。

通过与网卡进行交互,操作系统可以获取网卡的型号和特性等信息。

2. 驱动加载:一旦操作系统成功识别了网卡硬件,它会自动加载相应的网卡驱动。

这个过程中,操作系统会根据网卡的型号和特性选择合适的驱动程序,并将其加载到内存中。

3. 驱动初始化:一旦驱动程序被加载到内存中,操作系统会调用驱动中的初始化函数,对网卡进行初始化设置。

这些设置可能包括网卡的工作模式、传输速率、MAC地址等。

4. 数据传输:一旦网卡经过初始化设置,就可以开始进行数据的收发工作了。

当操作系统需要发送数据时,它会将数据传递给网卡驱动,驱动会负责将数据打包成网络数据包,并通过网卡硬件发送到网络上。

当网卡接收到其他设备发送的数据包时,驱动会接收到数据包,并将其解析成操作系统可识别的格式,然后将数据传递给操作系统。

5. 错误处理:在数据传输过程中,可能会出现一些错误,比如传输中断、丢包等情况。

网卡驱动会监测这些错误,并根据情况采取相应的处理措施,比如重新发送数据、请求重传等。

综上所述,网卡驱动是连接操作系统和网卡硬件之间的桥梁,它通过控制和管理网卡硬件,使得计算机可以与网络进行通信。

通过驱动程序的加载和初始化,数据的传输和错误处理等步骤,网卡驱动能够实现数据在计算机和网络之间的传输和交换。

UBOOTPHY驱动分析及调试方法

UBOOTPHY驱动分析及调试方法

UBOOTPHY驱动分析及调试⽅法UBOOT版本:2017.11⼀、PHY 简介M edia I ndependent I nterface ( MII ),介质独⽴接⼝,起初是定义 100M 以太⽹(Fast Ethernet)的MAC层与PHY 芯⽚之间的传输标准。

MAC 与 PHY 之间的 MII 连接可以是可插拔的连接器,或者是同⼀块 PCB 上 MAC 与 PHY 之间的⾛线。

MDIO与MDCLK是 MII 接⼝的⼀部分,⼆者可称为SMI (Serial Management Interface) 串⾏管理接⼝,⽤于在 MAC 和 PHY 之间传递配置信息。

在 MDIO 规范中定义 PHY 地址为5 bit,即同⼀组MDIO最多可配置 2^5 = 32个 PHY。

MII 接⼝图如下所⽰:能够和MII相提并论的还有RMII(精简MII)、SMII(串⾏MII)、GMII(千兆MII)、RGMII(精简GMII)等接⼝,它们与普通MII相⽐较,仅是传输速率与数据传输⽅式不同等,这⾥不做过多的介绍。

⼆、PHY 设备创建及驱动匹配以 rockchip 为例,当它的 mac 驱动 gmac_rockchip 成功的被匹配时,会调⽤到 gmac_rockchip_probe ,mac 相关我们不做分析,直接进⼊主题 designware_eth_probe 函数中。

⾸先会获取到对应的 regulator ,并会做⼀些电源配置,1 device_get_supply_regulator(dev, "phy-supply",2 &phy_supply);3 regulator_set_enable(phy_supply, true);UBOOT 中引⼊了 DM 驱动模型,相关的设备与驱动事先已经绑定过,如这⾥通过 phandle 进⽽找出其对应的,驱动在 rk8xx.c 中定义:1 U_BOOT_DRIVER(rk8xx_switch) = {2 .name = "rk8xx_switch",3 .id = UCLASS_REGULATOR,4 .ops = &rk8xx_switch_ops,5 .probe = rk8xx_switch_probe,6 };接下来要初始化 mdio 总线,并将其注册到系统的 mii_devs 中,在获取某个控制器时,即可通过 miiphy_get_dev_by_name 来获取:1 dw_mdio_init(dev->name, dev);2 priv->bus = miiphy_get_dev_by_name(dev->name);电源以及 MDIO 总线已初始化完毕,万事俱备,接下来就正式的对 phy 进⾏操作了,⼀起来看 dw_phy_init 函数:1static int dw_phy_init(struct dw_eth_dev *priv, void *dev)2 {3struct phy_device *phydev;4int mask = 0xffffffff, ret;56 #ifdef CONFIG_PHY_ADDR7 mask = 1 << CONFIG_PHY_ADDR;8#endif910 phydev = phy_find_by_mask(priv->bus, mask, priv->interface);11if (!phydev)12return -ENODEV;1314 phy_connect_dev(phydev, dev);1516 phydev->supported &= PHY_GBIT_FEATURES;17if (priv->max_speed) {18 ret = phy_set_supported(phydev, priv->max_speed);19if (ret)20return ret;21 }22 phydev->advertising = phydev->supported;2324 priv->phydev = phydev;25 phy_config(phydev);2627return0;28 }我们主要来看 phy_find_by_mask ,这⾥是核⼼,其它细节配置不去分析以免喧宾夺主。

uboot pcie驱动原理

uboot pcie驱动原理

uboot pcie驱动原理摘要:1.介绍uboot pcie 驱动2.详述uboot pcie 驱动的原理3.总结uboot pcie 驱动的重要性正文:1.介绍uboot pcie 驱动Uboot 是一种通用的bootloader,广泛应用于各种嵌入式系统中。

它可以从NAND flash、NOR flash 或硬盘启动系统,并支持多种文件系统。

在嵌入式系统中,PCIe(Peripheral Component Interconnect Express)是一种常见的高速串行计算机扩展总线标准,用于连接主板上的中央处理器(CPU)和各种外部设备,如显卡、声卡、硬盘等。

Uboot pcie 驱动就是用于支持PCIe 设备的驱动程序。

2.详述uboot pcie 驱动的原理Uboot pcie 驱动的原理主要基于PCIe 协议。

PCIe 协议是一种点对点(peer-to-peer)的串行通信协议,通过数据传输和数据校验来实现设备之间的通信。

Uboot pcie 驱动的工作流程如下:(1)初始化:首先,Uboot 将PCIe 设备添加到系统中,并初始化相关硬件资源。

(2)配置:Uboot 根据PCIe 设备的类型和配置空间,生成相应的配置空间表。

配置空间表包含了设备的基本信息,如设备类型、设备地址、设备配置空间等。

(3)数据传输:Uboot 通过PCIe 协议,实现与PCIe 设备的数据传输。

数据传输过程中,Uboot 将设备所需的启动代码、设备驱动等文件传输到PCIe 设备中。

(4)设备启动:Uboot 将PCIe 设备的控制权交给操作系统,由操作系统完成后续的设备驱动加载和设备启动。

3.总结uboot pcie 驱动的重要性Uboot pcie 驱动在嵌入式系统中具有重要作用,主要表现在以下几点:(1)支持PCIe 设备的启动:Uboot pcie 驱动支持各种PCIe 设备的启动,使得嵌入式系统能够兼容更多的外部设备。

U-Boot启动内核分析

U-Boot启动内核分析

U-Boot启动内核分析先来引用一下这篇介绍“ARM Linux内核启动要求”的文章ARM Linux Kernel Boot Requirements,是ARM Linux内核的维护者Russell King写的。

∙CPU register settingso r0 = 0.o r1 = machine type number.o r2 = physical address of tagged list in system RAM.∙CPU modeo All forms of interrupts must be disabled (IRQs and FIQs.)o The CPU must be in SVC mode. (A special exception exists forAngel.)∙Caches, MMUso The MMU must be off.o Instruction cache may be on or off.o Data cache must be off and must not contain any stale data.∙Deviceso DMA to/from devices should be quiesced.∙The boot loader is expected to call the kernel image by jumping directly to the first instruction of the kernel image.大致就是以上条件了,请特别关注一下第一条,这个基本上就是U-Boot的go 命令和bootm命令之间的本质区别所在了。

先来看看bootm命令的实现,在是在这个文件内实现的(extern)。

可想而知,这个函数的实现应该是和体系结构相关的,具体到arm体系结构的实现就是在lib_arm/armlinux.c这个文件当中。

uboot讲义

uboot讲义

1嵌入式Linux软件结构与分布一般情况下嵌入式Linux系统中的软件主要分为以下几部分:1)引导加载程序:其中包括内部ROM中的固化启动代码和BootLoader两部分。

内部固化ROM是厂家在芯片生产时候固化的,作用基本上是引导BootLoader。

有的芯片比较复杂,比如Omap3在flash中没有代码的时候有许多启动方式:USB、UART或以太网等等。

而S3C24x0则很简单,只有Norboot和Nandboot。

drive e rs。

2)Linux kernel和driv3)文件系统。

包括根文件系统和建立于Flash内存设备之上的文件系统(EXT4、UBI、CRAMFS等等)。

它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好运行环境及载体。

4)应用程序。

用户自定义的应用程序,存放于文件系统之中。

在Flash存储器中,他们的分布一般如下:BootLoader(被挂载到根文件系统或者作为2在嵌入式Linux中BootBootL L o a d er的必要性Linux内核的启动除了内核映像必须在主存的适当位置,CPU还必须具备一定的条件:1.CPU寄存器的设置:R0=0;R1=Machine ID(即Machine Type Number,定义在linux/arch/arm/tools/mach-types);R2=内核启动参数在RAM中起始基地址;2.CPU模式:必须禁止中断(IRQs和FIQs);CPU必须SVC模式;3.Cache和MMU的设置:MMU必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭;但是在CPU刚上电启动的时候,一般连内存控制器都没有初始化过,根本无法在主存中运行程序,更不可能处在Linux内核启动环境中。

为了初始化CPU及其他外设,使得Linux内核可以在系统主存中运行,并让系统符合Linux内核启动的必备条件,必须要有一个先于内核运行的程序,他就是所谓的引导加载程序(Boot Loader)。

U-BOOT中文文档

U-BOOT中文文档

U_BOOT_VERSION
u_boot_logo
IH_OS_U_BOOT
u_boot_hush_start
The "official" name of this project is "Das U-Boot". The spelling
"U-Boot" shall be used in all written text (documentation, comments
u_boot_logo u_boot_hush_start
Versioning: =========== 版本 U-Boot uses a 3 level version number containing a version, a sub-version, and a patchlevel: "U-Boot-2.34.5" means version "2", sub-version "34", and patchlevel "4". uboot的3级版本数字包含一个主版本,子版本,补丁级别:uboot-2.34.5表示主版本2, 子版本34,补丁级别4。
<u-boot-users@>. There is also an archive of previous traffic on the mailing list - please search the archive before asking FAQ's. Please see /lists/listinfo/u-boot-users/ 如果你对U-Boot有疑问,或者想为U-Boot贡献,你应该向U-Boot邮件列表<u-boot-users@lists. >发送消息。在提问前,请搜索邮件列表的历史记录:http://lists.sourceforg /lists/listinfo/u-boot-users/

uboot 命令详解

uboot 命令详解

u-boot 技术文档1.U boot 命令详解1.1查看帮助命令使用help 或者?1.2环境变量打印环境变量:printenv设置环境变量:setenv(不会保存)保存环境变量:saveenv这个时候就有了1.3nandflash命令使用nand查看nandflash 所有指令擦除nand erase1.4norflash命令查看Flash信息命令: flinfo加/解写保护命令: protect擦除命令: erase1.5内存命令nm1.5USB指令使用help usb 查看usb具体指令使用usb 启动使用usb tree查看信息f atls usb 0 罗列u盘信息1.5.1实例演练usb指令烧写1.6实例演练ftp指令烧写环境变量中体现了开发板上的IP地址为192.168.0.2,网关为192.168.0.1,要求电上的tftp 服务器的IP为192.168.0.1;运行电脑上tftp服务器,指定好根目录,将内核和根文件系统放在根目录下。

注:线接上后,电脑上的本地连接可能是显示网络电缆没插好,这很正常!在使用过程中它们会自动去连接!<2>分别下载内核和根文件系统到内存0x30008000开始的空间先检查坏块nand bad再擦除坏块清理某个区域0x560000 0x3b22c00将根文件系统加载到0x30008000然后再将根文件系统写到0x560000 0x3b22c00这个位置然后重启:重复上面的步骤:nand erase 0x60000 0x267000将内核文件保存到0x60000 0x267000这块区域运行1.8系统重启指令2.U boot 内核移植在cpu/arm920t/start.S中添加以下代码在修改并添加为以下代码在include/configs/mini2440.h修改为如下:将以下代码修改为:将以下代码修改为:将以下代码修改为:在drivers/mtd/nand/s3c2410_nand.h 在最后下面代码上添加如下带码:。

uboot分析和笔记

uboot分析和笔记

uboot一、uboot是ppcboot和armboot合并而成,现在主流的bootloader为uboot和redboot二、bootm addr_kernel addr_initrd三、移植uboot时最好(一定)要找到一个自己板子的原形(即自己的板子是在这个板子上做一些修改而来的)的版本,这样就可以事半功倍。

这样要修改的地方就比较少,也比较容易了。

uboot支持很多平台,与一个具体平台相关的主要有三个地方:1、./include/configs/xxxxx.h, 主要定义了flash、sdram的起始地址等信息,一般要修改flash的起始地址、大小,有时候会有位宽等。

2、./board/xxxxx/*,这个目录下主要有两三个.c文件,主要为该平台的初始化和flash操作的函数。

有时候flash的操作需要修改,不过一般都是找一个现有的支持该flash的驱动,一般情况在uboot 别的./board/平台下就会有现成的,拷贝过了就可以了。

3、./cpu/xxxxxx/arch_xxx/xxxxxx/*, 一般是此cpu的初始等函数。

四、具体移植的时候最多涉及到的会是./include/configs/xxxx.h,如果有现成的平台(uboot现在支持绝大部分我们常用的平台),可能只需要对着原来的xxxx.h文件,修改几个我们在硬件上修改了的地方,一般会是flash的起始地址、大小;内存大小(内存的起始地址应该都是0);uboot设置信息保存的地址和长度;console 口和它的波特率;默认的设置;uboot的入口地址等(具体情况可能会有一些变化),如果不是从相同的平台移植,可能会比较麻烦,因为这时候要修改一些和此cpu相关的一些寄存器、频率和内存等硬件方面的东西了(也在这个xxxx.h中),虽然这时改动的地方也不多,但是会很痛苦,因为经常不知道要改哪里或者改为多少。

所以可能需要参考cpu的datasheet和到网上找一些资料了并且慢慢试了。

嵌入式Arm—Linux系统的网卡驱动程序的分析与实现

嵌入式Arm—Linux系统的网卡驱动程序的分析与实现
息 。该 n t d vc 结 构正是 网络驱 动层 的核 心 , 一 e e ie 有 个 完整 的描 述 。 个 网络设备 都具 有这 样 的一个 结 构 , 每
一一一 Ⅺ 一

包 括 实 际 的设 备 ( 网卡 ) 虚 拟 设 备 ( 虚 拟 局 域 如 和 如
网) 。网络设 备可 分为 不 同的类 型 , 以太 网 和令 牌 环 如
作 。 因此 , 编写驱 动程序 , 要 首先 要对设 备具 有准确 的
a a y i g h Li u n t r d i e s r c u e e e r h n a d e l i g h wo k n p i cp e n k y n l z n t e n x e wo k rv r t u t r ,r s a c i g n r a i n t e z r i g rn i l a d e t c n lge f e h o o is o Ar Li u e wo k d v c m a i g o t e e a mp r a t p r s o e e a n t r rv r m- n x n t r e ie, k n u s v r l i o t n a t f g n r l e wo k d i e s r c u e, i h i c u e t e d vc e it a i n,I i a ii g e c e i e t u t r wh c n l d h e ie r g s r to n t l n a h d v c ,mo u e u l a i g,t ed vc t o s i z d l n o d n h e ie me h d ( p n, t p, e d n n e ev n ) I d ii n,i t r u to s i t o u e o e p a n t e p o e s o e e v n o e s o s n i g a d r c i i g . n a d to n e r p in i n r d c d t x li h r c s fr c ii g i f r t n F n l r v d e wo k i t r a e s a d r b s d o h r e . n o ma i . i a l we p o i e a n t r n e f c t n a d, a e n Et e n t o y Ke r s n t r e ie d i e , mb d e o t r Ar — i u CS 9 0 y wo d : e wo k d v c r r e e d d s fwa e, m L n x, 8 0 v

UBOOT——MMC驱动分析

UBOOT——MMC驱动分析

UBOOT——MMC驱动分析1:MMC驱动初始化是在start_armboot函数中#if defined(CONFIG_X210)#if defined(CONFIG_GENERIC_MMC)puts ("SD/MMC: ");///* //lqm maskedmmc_exist = mmc_initialize(gd->bd);if (mmc_exist != 0){puts ("0 MB\n");}//*/#endif#if defined(CONFIG_CMD_NAND)puts("NAND: ");nand_init();#endif#endif /* CONFIG_X210 */实际上是调⽤了 mmc_initialize(gd->bd);这个函数来进⾏初始化的struct mmc *mmc;这⾥定义了⼀个struct mmc类型的结构体指针;这个struct mmc类型的结构体⾮常重要,我们说的驱动主要就是构建这个结构体;在这个结构体中构建了⼀些列变量、函数指针等;这些变量记录了mmc的⼀些信息,函数指针所指向的函数是⽤来向sd卡中发送命令、或者发送数据、直接操作最底层的特殊功能寄存器;1struct mmc {2struct list_head link;3char name[32];4void *priv;5uint voltages;6uint version;7uint f_min;8uint f_max;9int high_capacity;10uint bus_width;11uint clock;12uint card_caps;13uint host_caps;14uint ocr;15uint scr[2];16uint csd[4];17uint cid[4];18ushort rca;19uint tran_speed;20uint read_bl_len;21uint write_bl_len;22 u32 capacity;23struct mmc_ext_csd ext_csd; /* mmc v4 extended card specific */24 block_dev_desc_t block_dev;27void (*set_ios)(struct mmc *mmc);28int (*init)(struct mmc *mmc);29 };接下来就是cpu_mmc_init(bis);这个函数:1int cpu_mmc_init(bd_t *bis)2 {3 #ifdef CONFIG_S3C_HSMMC4 setup_hsmmc_clock();5 setup_hsmmc_cfg_gpio();6return smdk_s3c_hsmmc_init();7#else8return0;9#endif10 }这个函数的作⽤是把mmc与Soc相关的初始化⼯作完成了;mmc的初始化化分两个部分 (1)与SoC有关的部分包括:初始化时钟、初始化相关GPIO、初始化与SoC有关的mmc控制器; (2)与外部sd卡有关的部分:初始化mmc卡中的芯⽚控制器等;第⼀部分的mmc时钟初始化以及gpio初始化我们放在cpu_s5pc11x⽂件夹;与SoC有关的控制器放在drivers/mmc⽂件夹下;与mmc内部控制器有关的初始化函数为mmc_init,这个函数也在drivers/mmc⽂件夹下;上⾯⼏点表⾯:关于mmc的驱动是分离的,时钟、GPIO⼀部分;SoC内部控制器⼀部分;SoC外部控制器⼀部分;这样做的⼀个好处就是减轻移植代码的⼤量⼯作;⽐如说mmc没有变,⽽更换了⼀个SoC,我们只需要更改SoC相关的那⼀部分代码即可,同样SoC没有变⽽mmc卡变了,我们则只需要更改mmc卡相关的那部分初始化代码即可;下⾯我们来详细看⼀下这些初始化函数setup_hsmmc_clock:选择时钟源、分频1void setup_hsmmc_clock(void)2 {3 u32 tmp;4 u32 clock;5 u32 i;67/* MMC0 clock src = SCLKMPLL */8 tmp = CLK_SRC4_REG & ~(0x0000000f);9 CLK_SRC4_REG = tmp | 0x00000006;1011/* MMC0 clock div */12 tmp = CLK_DIV4_REG & ~(0x0000000f);13 clock = get_MPLL_CLK()/1000000;14for(i=0; i<0xf; i++)15 {16if((clock / (i+1)) <= 52) {17 CLK_DIV4_REG = tmp | i<<0;18break;19 }20 }2122 #ifdef USE_MMC123/* MMC1 clock src = SCLKMPLL */24 tmp = CLK_SRC4_REG & ~(0x000000f0);25 CLK_SRC4_REG = tmp | 0x00000060;28 tmp = CLK_DIV4_REG & ~(0x000000f0);29 CLK_DIV4_REG = tmp | i<<4;30#endif3132 #ifdef USE_MMC233/* MMC2 clock src = SCLKMPLL */34 tmp = CLK_SRC4_REG & ~(0x00000f00);35 CLK_SRC4_REG = tmp | 0x00000600;3637/* MMC2 clock div */38 tmp = CLK_DIV4_REG & ~(0x00000f00);39 CLK_DIV4_REG = tmp | i<<8;40#endif4142 #ifdef USE_MMC343/* MMC3 clock src = SCLKMPLL */44 tmp = CLK_SRC4_REG & ~(0x00000f00);45 CLK_SRC4_REG = tmp | 0x00000600;4647/* MMC3 clock div */48 tmp = CLK_DIV4_REG & ~(0x00000f00);49 CLK_DIV4_REG = tmp | i<<12;50#endif51 }setup_hsmmc_cfg_gpio:初始化相关GPIO可以对数据⼿册来看⽐较简单;1void setup_hsmmc_cfg_gpio(void)2 {3ulong reg;45/* MMC channel 0 */6/* 7 pins will be assigned - GPG0[0:6] = CLK, CMD, CDn, DAT[0:3] */7 reg = readl(GPG0CON) & 0xf0000000;8 writel(reg | 0x02222222, GPG0CON);9 reg = readl(GPG0PUD) & 0xffffc000;10 writel(reg | 0x00002aaa, GPG0PUD);11 writel(0x00003fff, GPG0DRV);12 #ifdef USE_MMC0_8BIT13 reg = readl(GPG1CON) & 0xf0000fff;14 writel(reg | 0x03333000, GPG1CON);15 reg = readl(GPG1PUD) & 0xffffc03f;16 writel(reg | 0x00002a80, GPG1PUD);17 writel(0x00003fc0, GPG1DRV);18#endif1920 #ifdef USE_MMC121/* MMC channel 1 */22/* 7 pins will be assigned - GPG1[0:6] = CLK, CMD, CDn, DAT[0:3] */23 reg = readl(GPG1CON) & 0xf0000000;24 writel(reg | 0x02222222, GPG1CON);25 reg = readl(GPG1PUD) & 0xffffc000;26 writel(reg | 0x00002aaa, GPG1PUD);27 writel(0x00003fff, GPG1DRV);28#endif2932/* 7 pins will be assigned - GPG2[0:6] = CLK, CMD, CDn, DAT[0:3] */33 reg = readl(GPG2CON) & 0xf0000000;34 writel(reg | 0x02222222, GPG2CON);35 reg = readl(GPG2PUD) & 0xffffc000;36 writel(reg | 0x00002aaa, GPG2PUD);37 writel(0x00003fff, GPG2DRV);38 #ifdef USE_MMC2_8BIT39/* 4 pins will be assigned - GPG3[3:6] = DAT[4:7] */40 reg = readl(GPG3CON) & 0xf0000fff;41 writel(reg | 0x03333000, GPG3CON);42 reg = readl(GPG3PUD) & 0xffffc03f;43 writel(reg | 0x00002a80, GPG3PUD);44 writel(0x00003fc0, GPG3DRV);45#endif46#endif4748 #ifdef USE_MMC349/* MMC channel 3 */50/* 7 pins will be assigned - GPG0[0:6] = CLK, CMD, CDn, DAT[0:3] */51 reg = readl(GPG3CON) & 0xf0000000;52 writel(reg | 0x02222222, GPG3CON);53 reg = readl(GPG3PUD) & 0xffffc000;54 writel(reg | 0x00002aaa, GPG3PUD);55 writel(0x00003fff, GPG3DRV);56#endif57 }下⾯来看⼀下smdk_s3c_hsmmc_init函数这个函数实际是调⽤的s3c_hsmmc_initialize 这个函数int smdk_s3c_hsmmc_init(void){int err;#ifdef USE_MMC0err = s3c_hsmmc_initialize(0);if(err)return err;#endif#ifdef USE_MMC1err = s3c_hsmmc_initialize(1);if(err)return err;#endif#ifdef USE_MMC2err = s3c_hsmmc_initialize(2);if(err)return err;#endif#ifdef USE_MMC3err = s3c_hsmmc_initialize(3);if(err)return err;return -1;}s3c_hsmmc_initialize 这个函数是对SoC中mmc控制器的初始化:在这个函数中主要是把我们最早定义的struct mmc中的变量以及函数指针进⾏了初始化;⽽真正的操作寄存器的函数是s3c_hsmmc_send_commands3c_hsmmc_set_ioss3c_hsmmc_init发送命令发送数据初始化三个函数,这三个函数是最底层的直接操作GPIO、特殊功能寄存器的函数;⽽这三个函数以及⼀些变量被封装在struct mmc结构体中,我们操作系统对mmc设备进⾏操作的时候,只到封装以后的这个结构体中进⾏操作即可;1static int s3c_hsmmc_initialize(int channel)2 {3struct mmc *mmc;45 mmc = &mmc_channel[channel];6// printf("sdcard channel: %\n", channel);7 sprintf(mmc->name, "S3C_HSMMC%d", channel);8 mmc->priv = &mmc_host[channel];9 mmc->send_cmd = s3c_hsmmc_send_command;10 mmc->set_ios = s3c_hsmmc_set_ios;11 mmc->init = s3c_hsmmc_init;12//yan13 mmc->voltages = MMC_VDD_32_33 | MMC_VDD_33_34;14 mmc->host_caps = MMC_MODE_4BIT | MMC_MODE_HS_52MHz | MMC_MODE_HS;15#if defined(USE_MMC0_8BIT) || defined(USE_MMC2_8BIT)16 mmc->host_caps |= MMC_MODE_8BIT;17#endif1819 mmc->f_min = 400000;20// mmc->f_max = 26000000;//52000000;21 mmc->f_max = 52000000;2223 mmc_host[channel].clock = 0;2425switch(channel) {26case0:27 mmc_host[channel].ioaddr = (void *)ELFIN_HSMMC_0_BASE;28break;29case1:30 mmc_host[channel].ioaddr = (void *)ELFIN_HSMMC_1_BASE;31break;32case2:33 mmc_host[channel].ioaddr = (void *)ELFIN_HSMMC_2_BASE;34break;35 #ifdef USE_MMC336case3:37 mmc_host[channel].ioaddr = (void *)ELFIN_HSMMC_3_BASE;38break;39#endif40default:41 printk("mmc err: not supported channel %d\n", channel);4344return mmc_register(mmc);最后我们看⼀下mmc_init这个函数这个代码中是调⽤了struct mmc 中的函数进⾏了⼀些时序操作 1int mmc_init(struct mmc *host)2 {3int err;45 err = host->init(host);67if (err)8return err;910/* Reset the Card */11 err = mmc_go_idle(host);1213if (err)14return err;1516/* Test for SD version 2 */17 err = mmc_send_if_cond(host);1819/* Now try to get the SD card's operating condition */20 err = mmc_send_app_op_cond(host);2122/* If the command timed out, we check for an MMC card */23if (err == TIMEOUT) {24 err = mmc_send_op_cond(host);2526if (err)27return UNUSABLE_ERR;28 } else29if (err)30return UNUSABLE_ERR;3132return mmc_startup(host);33 }。

uboot pcie驱动原理

uboot pcie驱动原理

uboot pcie驱动原理摘要:1.PCIe驱动概述2.Uboot中PCIe驱动的实现3.PCIe驱动的应用场景和优势4.总结正文:【1】PCIe驱动概述PCIe(Peripheral Component Interconnect Express)是一种高速串行计算机扩展总线标准,主要用于连接主板上的中央处理器(CPU)和各种外部设备,如显卡、声卡、网卡等。

PCIe驱动程序是操作系统中用于控制和管理PCIe设备的软件模块,它负责实现设备与CPU之间的数据传输和通信。

【2】Uboot中PCIe驱动的实现Uboot是一种通用的bootloader程序,广泛应用于嵌入式系统。

在Uboot中,PCIe驱动程序主要包括以下几个部分:1.设备树(Device Tree):描述了系统中PCIe设备的基本信息和配置。

2.PCIe设备驱动框架:提供了一组通用的API,用于实现PCIe设备的访问和控制。

3.具体设备驱动:根据不同PCIe设备的特性,编写相应的设备驱动模块。

4.初始化与退出:在系统启动时,初始化PCIe设备并提供相应的驱动;在系统退出时,正确地卸载和关闭设备。

【3】PCIe驱动的应用场景和优势1.应用场景:PCIe驱动广泛应用于服务器、工作站、嵌入式设备等领域,支持多种硬件设备和外设的接入。

2.优势:- 高带宽:PCIe总线支持多种数据传输速率,如Gen1(2.5 GT/s)、Gen2(5.0 GT/s)和Gen3(8.0 GT/s)等,满足高性能设备的需求。

- 热插拔:PCIe设备支持热插拔,方便用户在不关机的情况下更换或升级硬件设备。

- 兼容性:PCIe驱动程序遵循统一的规范,可在不同操作系统和硬件平台上运行。

- 稳定可靠:PCIe总线采用差分信号传输,具有抗干扰能力强、传输稳定等特点。

【4】总结PCIe驱动程序是嵌入式系统中不可或缺的一部分,它为用户提供了高性能、稳定可靠的硬件设备访问手段。

通过Uboot中PCIe驱动的实现,我们可以更好地管理和控制各类PCIe设备,满足不同应用场景的需求。

uboot中dm驱动模型理解

uboot中dm驱动模型理解

uboot中dm驱动模型理解在 U-Boot(Universal Boot Loader)中,DM 表示设备模型(Device Model)。

DM 是 U-Boot 的一个架构,旨在提供一个通用的、可扩展的设备驱动框架,使 U-Boot 能够更容易地支持多种硬件平台和设备。

DM 的基本概念包括设备、设备驱动、设备树和设备模型。

下面是对这些概念的简要解释:1.设备(Device):设备是硬件或软件实体,例如存储设备、网络接口、显示器等。

在 U-Boot 的 DM 模型中,每个设备都由一个唯一的设备 ID(通常是字符串)来标识。

2.设备驱动(Device Driver):设备驱动是用于控制和管理特定设备的软件组件。

每个设备都有一个与之关联的设备驱动。

设备驱动负责初始化设备、处理设备的请求和提供对设备的访问接口。

3.设备树(Device Tree):设备树是一种描述硬件架构的数据结构,以树状结构表示。

它描述了系统中各个设备及其在地址空间中的位置、中断等信息。

在 U-Boot 中,设备树用于描述系统硬件,并提供给设备模型使用。

4.设备模型(Device Model):设备模型是 U-Boot 中用于管理和连接设备的框架。

DM 提供了一种机制,通过该机制,设备可以根据设备树中的描述进行实例化、连接和操作。

设备模型的引入使 U-Boot 的代码更加模块化、可扩展,并支持更广泛的硬件平台。

DM 的使用涉及到设备的注册、设备的连接、设备的操作等步骤。

通过设备模型,U-Boot 可以更容易地适应不同的硬件配置,使得在支持新硬件平台时变得更为灵活。

请注意,具体的 DM 实现可能会有一些变化,因为 U-Boot 本身在不同版本中可能有一些更新和改进。

要深入了解最新版本的 U-Boot 中 DM 的具体实现和使用方法,建议查阅 U-Boot 的官方文档或代码。

uboot知识全知道

uboot知识全知道

uboot知识全知道转载自互联网•1 U-Boot简介•U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。

从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。

其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。

但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。

其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。

这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。

这两个特点正是U-Boot项目的开发目标,即支持尽可能多的嵌入式处理器和嵌入式操作系统。

就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。

其它系列的处理器和操作系统基本是在2002年11 月PPCBOOT改名为U-Boot后逐步扩充的。

从PPCBOOT 向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk[以下简称W.D]本人精湛专业水平和持着不懈的努力。

当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。

uboot常见DDR问题详解教程

uboot常见DDR问题详解教程
突发的第一次访问是垃圾
这通常表示与DQS时序相关的问题。在硬件级别,您可能需要检查DQS和数据信号的飞行时间,以确保偏差在规范范围内。
这也可能与DDR PHY的内部计时有关。DDR PHY控制寄存器的“read latency”字段可以增加1以提供更多的余量。旁注:这个“read latency”字段与PHY本身有关,与DDR规范中的JEDEC“read latency(RL)”无关。以下是有关此字段的其他信息:
•因此,更改DDR PHY读取延迟不会影响DDR总线上观察到的任何波形。严格来说,这是从DQS域到DDR PHY时钟域的数据传输的一个内部时钟数据。
•特别是,您可以检查偏差报告,以确保DQS满足所有要求。您可能还希望查看信号完整性,可能是通过高质量范围和/或使用IBIS模型进行模拟。
•大多数较新的设备(例如支持DDR3的设备)能够调整DQS时间。如果您还没有执行调平/训练以确定最佳值,那么下一步将是一个很好的步骤,因为这将调整DQS时间。
数据变化无处不在!
极端温度下的故障
可能有多个参与者:
1.在高温下,确保您仍在DDR指定的温度范围内。在某些温度下,您需要将刷新率提高一倍(请参阅DDR数据手册)。
2.这可能与边缘时间/布局有关,因为计时会随温度变化。
3.这可能与PLL有关。验证是否观察到预期的DDR时钟频率。如果PLL的配置不符合规范(中频不符合规范等),或者PLL电源出现问题,极端温度会导致PLL失去锁定。
•DDR_PHY_CTRL_1中的读取延迟是针对DDR PHY的。这不应与DDR设备数据表中的RL混淆。这两者都是不同的。
•DDR PHY的读取延迟用于将读取数据从DQS时钟域传输到其内部时钟域。DDRPHY有一个伪同步FIFO,它将读取的数据从DQS时钟域传输到其内部时钟域。DDR PHY读取延迟定义了在读取期间DQS时钟写入FIFO之后,DDR PHY在使用内部时钟读取FIFO之前应等待的时间。DDR PHY读取延迟数由系统的往返延迟定义(IO延迟+板延迟+CL)。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

xilinx uboot网卡驱动分析和一些概念扫盲
1、MAC控制器、网卡、PHY、MDIO、mii、gmii、rgmii概念扫盲
网卡在功能上包含OSI模型的两个层,数据链路层和物理层。

物理层定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。

数据链路层则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。

网卡中负责数据链路的芯片叫做MAC控制器,负责物理层的芯片叫做PHY。

所以,一个网卡由MAC控制器和PHY组成。

MAC控制器与PHY连接使用MII(Medium independent interface)媒体独立接口,这个接口是IEEE-802.3定义的以太网行业标准定义的接口,包括一个数据接口和一个MAC和PHY之间的管理接口即MDIO。

MII标准接口用于连接MAC和PHY,媒体独立表示不对MAC硬件重新设计或替换的情况下,任何类型的PHY设备接到当前MAC控制器上都可以正常工作。

MII支持10M和100M的网络速率,由于网卡的速率不同,所以在其他速率下工作的与MII等效的接口有:AUI(10M以太网)、GMII(Gigabit以太网)和XAUI(10-Gigabit 以太网)。

此外还有RMII、RGMII、SMII、SGMII等。

所有这些接口都是由MII而来。

MII支持10兆和100兆的操作,一个接口由14根线组成。

RMII是简化的MII接口,在数据的收发上它比MII接口少了一倍的信号线。

SMII是由思科提出的一种媒体接口,它有比RMII更少的信号线数目,S表示串行的意思。

因为它只用一根信号线传送发送数据,一根信号线传输接受数据,所以在时钟上为了满足100的需求,它的时钟频率很高,达到了125兆,为什么用125兆,是因为数据线里面会传送一些控制信息。

GMII采用8位接口数据,工作时钟125MHz,因此传输速率可达1000Mbps。

同时兼容MII所规定的10/100 Mbps工作方式。

RGMII又是GMII接口的精简版。

SGMII又是GMII的串行版。

MAC控制器和PHY除了数据传输的交流外,MAC和PHY控制信息的交流通过MDIO(管理数据输入输出)接口来完成。

具体MAC控制器进行PHY检测、MAC控制器回去PHY 当前状态、MAC控制器控制PHY速率等操作就通过MDIO来完成。

相关文档
最新文档