i.mx6ar8031寄存器操作

zengjf zengjf     2022-08-27     772

关键词:

/***************************************************************************
 *                         I.MX6 AR8031 寄存器操作
 * 说明:
 *     解读一下AR8031这颗PHY的寄存器要如何操作,了解PHY的MDIO是如何操作的。
 *
 *                                    2017-4-12 深圳 龙华民治樟坑村 曾剑锋
 **************************************************************************/

一、. 参考文档:
    DataShet:AR8031 Integrated 10/100/1000 Mbps Ethernet Transceiver

二、参考数据手册:4.1 Register Summary:
    Three types of registers are present on AR8031: 
    1. IEEE defined 32 MII registers, referred to as "registers" in this document
    – MII registers are accessed directly through the management frame.
    2. Atheros defined debug registers, referred to as "debug registers" in this document
    – Write debug offset address to 0x1D
    – Read/write the data from/to 0x1E
    3. IEEE defined MDIO Manageable Device (MMD) register, referred to as "MMD registers" in this document
    – MMD register access: refer to "MDIO Interface Register".
    Example: Writing 0x8000 to register 0 of MMD3.
        1. Write 0x3 to register 0xD: 0xD = 0x0003; (function = address; set the device address)
        2. Write 0x0 to register 0xE: 0xE = 0x0; (set the register offset address)
        3. Write 0x4003 to register 0xD:0xD=0x4003; (function = data; keep the device address)
        4. Read register 0xE:0xE == (data from register 0x0 of MMD3)
        5. Write 0x8000 to register 0xE: 0xE = 0x8000 (write 0x8000 to register 0x0 of MMD3)
        NOTE: Read operation follows the process 1 to 4.

三、Register Summary翻译
    AR8031有三种类型的寄存器:
    1. IEEE定义的32个MII寄存器,参考本文档的registers部分
    – MII寄存器可以寄存器直接访问;
    2. Atheros定义的debug寄存器,参考本文档的debug registers部分
    – 在MII寄存器的0x1D中写入debug寄存器的偏移地址
    – 在MII寄存器的0x1E中读/写debug寄存器的值
    3. IEEE defined MDIO Manageable Device (MMD) register, referred to as "MMD registers" in this document
    3. IEEE定义的MDIO设备管理寄存器,参考本文档的MMD registers部分
    – MMD寄存器访问,参考MDIO Interface Register
    示例:往MMD3,偏移地址0寄存器中写入0x8000:
        1. 将0x3写入0xD寄存器中;
        2. 将0x0写入0xE寄存器中;
        3. 将0x4003写入0xD寄存器中;
        4. 读取0xE寄存器的值;
        5. 将0x8000写入0xE寄存器中;
        注意:读操作过程只需要关注1到4中的步骤即可。

四、操作解析:
    1. MII Registers
        ...
        0x0D "MMD Access Control Register" on page 67
        0x0E "MMD Access Address Data Register" on page 67
        ...
        0x1D "Debug Port (Address offset set)" on page 80
        0x1E "Debug Port2 (R/W port)" on page 80
        ...
    2. 如上可知,Atheros定义的debug寄存器和MMD寄存器都是通过32个MII寄存器中的寄存器间接访问的。
    3. MMD Access Control Register(0x0D)(page 67, 4.2.19 MMD Access Control Register):
        1. 控制对应的数据寄存器是地址还是数据;
            1. 控制如果是地址,连续读取数据,地址会不会自动增加;
            2. 控制如果是地址,连续写入数据,地址会不会自动增加;
        2. MDIO 接口寄存器分成两组(page 87, 4.4 MDIO Interface Register):
            1. MMD3 – MDIO Manageable Device Address 3 for PCS
            2. MMD7 – MDIO Manageable Device Address 7 for Auto-Negotiation # 自动协商
    3. 示例解析:
        1. 将0x3写入0xD表示:选用MMD3接口寄存器,并且数据寄存器中存放的是地址;
        2. 将0x0写入0xE表示:往数据寄存器中写入地址数据0x0;
        3. 将0x4003写入0xD表示:选用MMD3接口寄存器,并且数据寄存器中存放的是数据,读写不自增;
        4. 读0xE进行读写:读取、写入数据寄存器;

五、i.MX6 ar8031_phy_fixup hacking
    static int ar8031_phy_fixup(struct phy_device *dev)
    {
        u16 val;

        /* Set RGMII IO voltage to 1.8V */
        // 这个电压寄存器找不到
        phy_write(dev, 0x1d, 0x1f);
        phy_write(dev, 0x1e, 0x8);

        /* disable phy AR8031 SmartEEE function. */
        phy_write(dev, 0xd, 0x3);
        phy_write(dev, 0xe, 0x805d);
        phy_write(dev, 0xd, 0x4003);
        val = phy_read(dev, 0xe);
        val &= ~(0x1 << 8);
        phy_write(dev, 0xe, val);

        /* To enable AR8031 output a 125MHz clk from CLK_25M */
        // page 112, Chapter: 4.4.77 CLK_25M Clock Select
        phy_write(dev, 0xd, 0x7);
        phy_write(dev, 0xe, 0x8016);
        phy_write(dev, 0xd, 0x4007);

        val = phy_read(dev, 0xe);
        val &= 0xffe3;      // mask 0b1111 1111 1110 0011
        val |= 0x18;        // 110 = 125 MHz from local PLL source
        phy_write(dev, 0xe, val);

        /* introduce tx clock delay */
        // page 83, Chapter: 4.3.2 SerDes Test and System Mode Control
        phy_write(dev, 0x1d, 0x5);
        val = phy_read(dev, 0x1e);
        val |= 0x0100;      // 1 = rgmii tx clock delay enable
        phy_write(dev, 0x1e, val);

        return 0;
    }

 

vserrormsb8031

1>C:ProgramFiles(x86)MSBuildMicrosoft.Cppv4.0V120Microsoft.CppBuild.targets(369,5):errorMSB8031:BuildinganMFCprojectforanon-Unicodecharactersetisdeprecated.YoumustchangetheprojectpropertytoUn 查看详情

单片机特殊功能寄存器

计数器从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。那么单片机中的计数器有多大的容量呢?8031单片机中有两个... 查看详情

关于visualstudio2013编译multi-bytecharactersetmfc程序出现msb8031错误的解决办法

VisualStudio2013编译旧的 multi-bytecharacterset MFC出现Error1errorMSB8031:UseofMBCSencodinginMFCprojectsrequireanadditionallibrarytobedownloadedandinstalled.Pleaseseehttp://go.microsoft.com/fwlink/?LinkId&# 查看详情

请教am335x千兆phyar8031的引脚lx问题

...05icmp_seq=1Destination.参考技术A很有可能是引脚接触不良,AR8031是QFN封装的,市面上有很多翻新的,这种产品翻新质量很差的,以前遇到过 查看详情

海思寄存器操作

如何查看和修改寄存器在程序中可以使用HI_SYS_ReadRegister,HI_SYS_WriteRegister接口进行寄存器的读写操作。在单板命令行下,使用工具。单板/usr/sbin目录下,有一系列寄存器操作相关的工具,分别介绍如下:工具参数功能备注himd参... 查看详情

c语言:寄存器操作(代码片段)

C语言:寄存器操作在对芯片进行开发时,我们对芯片的操作本质上就是对芯片底层寄存器进行操作,在C语言中对寄存器进行操作则是通过寄存器的地址进行数据的赋值,那这个过程是如何实现的呢?我们在学... 查看详情

复习之七种寻址

段寄存器:CS、DS、ES、SS1.指令指令由操作数码和操作数两部分构成操作码:说明计算机要执行的操作,如传送、运算、移位、跳转等操作,它是指令中不可缺少的组成部分。    操作数:是指令执行的参与者,即... 查看详情

/dev/mem直接操作硬件寄存器

/********************************************************************************/dev/mem直接操作硬件寄存器*说明:*在和左栋讨论如何处理iomux的时候,可以直接通过操作/dev/mem进行iomux的pin映射。**2017-9-27深圳龙华樟坑村曾剑锋*************************** 查看详情

msr和mrs指令操作cpsr寄存器

1.MSR和MRS指令介绍 MRS指令: 对状态寄存器CPSR和SPSR进行读操作。通过读CPSR可以获得当前处理器的工作状态。读SPSR寄存器可以获得进入异常前的处理器状态(因为只有异常模式下有SPSR寄存器)。MSR指令:  对状态寄存... 查看详情

考前自学系列·计算机组成原理·常见的数据寻址方式(地址码,操作数位置)

...在存储器中,指令中的地址码字段存放操作数的地址寄存器寻址:操作数在寄存器中,地址码字段给出寄存器的编号寄存器间接寻址操作数在存储器中,地址码中位寄存器编号,寄存器中为操作数地址变址寻... 查看详情

stm32用库函数操作和寄存器操作

之前用的51,现在买书,突然看到这个库函数和寄存器操作,脑子里面也没有什么概念,希望大神能够给我解释清楚。他们之间的关系和区别。是不是就是类似一个C语言一个类似汇编的关系?首先,两个都是C语言。从51过渡过来... 查看详情

leaq 的第一个操作数必须是内存地址,第二个操作数必须是寄存器吗?

...eaq的第一个操作数必须是内存地址,第二个操作数必须是寄存器吗?【英文标题】:Mustthefirstoperandofleaqbeamemoryaddressandthesecondoperandbearegister?【发布时间】:2018-10-2522:09:06【问题描述】:在ATT汇编语言中,使用leaq指令时,它的第... 查看详情

简述8086/8088各种寻址方式中,段寄存器和便宜地址的组合方式

...存放的地点有三处:存放在指令的地址码字段中;存放在寄存器中;存放在存储器的数据段、堆栈段或附加数据段中。与其对应的三种操作数是:立即操作数、寄存器操作数和存储器操作数。寻找这些操作数有三种基本寻址方式... 查看详情

c语言-常用寄存器位操作总结(代码片段)

STM32学习笔记-常用寄存器操作常用的寄存器位操作总结1.常用的位操作操作含义&与相同为1,不同为0|或不同为1,相同为0^异或相同为0,相异为1~取反0变1,1变0<<左移左移若干位,高位丢弃,低位补0>>右移右移若干位,... 查看详情

8086指令系统中的寻址方式

...据段中,偏移地址是3100H单元和3101H单元的内容复制一份到寄存器AX中。"[]"内用16位上述表示存放数据的偏移地址,数据的段基地址默认为数据段段重设段寄存器:[偏移地址]MOVAX,ES:[1200H]该指令中,表示将内存里附加段中,偏移地... 查看详情

修改寄存器的位操作方法

使用C语言对寄存器赋值时,我们常常要求只修改该寄存器的某几位的值,且其它的寄存器位不变,这个时候我们就需要用到C语言的位操作方法了。1.把变量的某位清零此处我们以变量a代表寄存器,并假设寄存器中本来已有数值... 查看详情

关于数据寄存器和指令寄存器?

书上说:数据寄存器可以保存一条正在译码的指令;指令寄存器用来保存当前正在执行的一条指令。当执行一条指令时,先把它从内存取到数据寄存器中,然后再传送到指令寄存器。指令寄存器中操作码字段的输出就是指令译码... 查看详情

stm32与stm8操作寄存器的区别

  在STM8中,由于STM8寄存器较少,在头文件中定义寄存器的时候不用采取任何形式的封装,所以操作寄存器的时候直接可以用如下方式处理:PB_DDR|=0x20;    但是在STM32中,由于其寄存器实在太多,不方便像STM8一样定义头文... 查看详情