I.MX6 AR8031 寄存器操作
/***************************************************************************
* I.MX6 AR8031 寄存器操作
* 说明:
* 解读一下AR8031这颗PHY的寄存器要如何操作,了解PHY的MDIO是如何操作的。
*
* 2017-4-12 深圳 龙华民治樟坑村 曾剑锋
**************************************************************************/ 一、. 参考文档:
DataShet:AR8031 Integrated // Mbps Ethernet Transceiver 二、参考数据手册:4.1 Register Summary:
Three types of registers are present on AR8031:
. IEEE defined MII registers, referred to as "registers" in this document
– MII registers are accessed directly through the management frame.
. 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
. 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 of MMD3.
. Write 0x3 to register 0xD: 0xD = 0x0003; (function = address; set the device address)
. Write 0x0 to register 0xE: 0xE = 0x0; (set the register offset address)
. Write 0x4003 to register 0xD:0xD=0x4003; (function = data; keep the device address)
. Read register 0xE:0xE == (data from register 0x0 of MMD3)
. Write 0x8000 to register 0xE: 0xE = 0x8000 (write 0x8000 to register 0x0 of MMD3)
NOTE: Read operation follows the process to . 三、Register Summary翻译
AR8031有三种类型的寄存器:
. IEEE定义的32个MII寄存器,参考本文档的registers部分
– MII寄存器可以寄存器直接访问;
. Atheros定义的debug寄存器,参考本文档的debug registers部分
– 在MII寄存器的0x1D中写入debug寄存器的偏移地址
– 在MII寄存器的0x1E中读/写debug寄存器的值
. IEEE defined MDIO Manageable Device (MMD) register, referred to as "MMD registers" in this document
. IEEE定义的MDIO设备管理寄存器,参考本文档的MMD registers部分
– MMD寄存器访问,参考MDIO Interface Register
示例:往MMD3,偏移地址0寄存器中写入0x8000:
. 将0x3写入0xD寄存器中;
. 将0x0写入0xE寄存器中;
. 将0x4003写入0xD寄存器中;
. 读取0xE寄存器的值;
. 将0x8000写入0xE寄存器中;
注意:读操作过程只需要关注1到4中的步骤即可。 四、操作解析:
. MII Registers
...
0x0D "MMD Access Control Register" on page
0x0E "MMD Access Address Data Register" on page
...
0x1D "Debug Port (Address offset set)" on page
0x1E "Debug Port2 (R/W port)" on page
...
. 如上可知,Atheros定义的debug寄存器和MMD寄存器都是通过32个MII寄存器中的寄存器间接访问的。
. MMD Access Control Register(0x0D)(page , 4.2. MMD Access Control Register):
. 控制对应的数据寄存器是地址还是数据;
. 控制如果是地址,连续读取数据,地址会不会自动增加;
. 控制如果是地址,连续写入数据,地址会不会自动增加;
. MDIO 接口寄存器分成两组(page , 4.4 MDIO Interface Register):
. MMD3 – MDIO Manageable Device Address for PCS
. MMD7 – MDIO Manageable Device Address for Auto-Negotiation # 自动协商
. 示例解析:
. 将0x3写入0xD表示:选用MMD3接口寄存器,并且数据寄存器中存放的是地址;
. 将0x0写入0xE表示:往数据寄存器中写入地址数据0x0;
. 将0x4003写入0xD表示:选用MMD3接口寄存器,并且数据寄存器中存放的是数据,读写不自增;
. 读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 << );
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 ;
}
I.MX6 AR8031 寄存器操作的更多相关文章
- 直接对寄存器操作,实现usart的串口输出寄存器的配置
就像前面提到的,我用的板子是一款stm32f107系列的板子,在这块板子上,已经开发出了一套比较成熟的库函数,这也就意味着你可以不用直接去操作存储器来实现某些功能.比方说对于USART来说可以直接通过 ...
- STM32串口寄存器操作(转)
源:STM32串口寄存器操作 //USART.C /************************************************************************** ...
- STM32 下的库函数和寄存器操作比较
以 led闪烁中的flashLed函数例子: 库函数操作简单,但是效率不如寄存器操作的高: 寄存器操作很复杂,因为要熟悉上百个寄存器,但是程序效率很高 /**下面是通过直接操作库函数的方式实现IO控制 ...
- STM8L外部中断 为何 死循环 寄存器操作
STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册. 这是第一次使用STM8,实现功能不是很复杂就没想研究库函 ...
- I.MX6 Ar8031 device register hacking
/***************************************************************************** * I.MX6 Ar8031 device ...
- STM32---初学者用库函数好还是直接对寄存器操作比较好
引用:http://blog.csdn.net/u010349006/article/details/416 首先,两个都是C语言.从51过渡过来的话,就先说寄存器操作.每个MCU都有自己的寄存器,5 ...
- Blackfin DSP(二):寄存器操作与GPIO
BlackfinDSP的寄存器是通过指针操作的,与51.ARM等MCU一样,通过“或”操作来置1,通过“与”操作清零. 在DSP上最简单的外设非IO口莫属,但是由于其功能强大,远非一般IO口可比,因此 ...
- 射频识别技术漫谈(22)——RC系列射频芯片的寄存器操作
前面提到,RC系列内部64个寄存器的正确操作是软件编写的关键.正确设置寄存器首先要做到与寄存器正确通信,其次是要对寄存器写入正确的值. RC系列射频芯片与微控制器的接口有并口和SPI接口两种类型.显然 ...
- (二)miller指导查看主控板寄存器操作
Welcome to Command Shell!Username:admin Password:***** ROS>en ROS# ROS# ROS# ROS# ROS#^ada ROS(ad ...
随机推荐
- kmp模板 && 扩展kmp模板
kmp模板: #include <bits/stdc++.h> #define PB push_back #define MP make_pair using namespace std; ...
- $python正则表达式系列(4)——分组和后向引用
分组,即分组匹配,也称为捕获组,是正则中的一种比较重要的匹配方式.此外后向引用和分组相结合,可以写出很多复杂匹配场景的正则. 1. 分组 分组的方法:将子表达式用小括号括起来,如:(exp),表示匹配 ...
- Java基础_基本语法
Java基本语法 一:关键字 在Java中有特殊含义的单词(50). 二:标志符 类名,函数名,变量名的名字的统称. 命名规则: 可以是字母,数字,下划线,$. 不能以数字开头. 见名之意. 驼峰规则 ...
- 请求库之requests,selenium
requests模块 一.介绍 #介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3) #注意:reques ...
- Go语言学习之数据类型以及类型转换(The way to go)
生命不止,继续go go go 介绍来go中的变量和常量,今天介绍一下go中的基本类型. 可以分为四大类,现在一点点道来. Boolean Types 布尔类型,不用过多介绍来吧,就是true和fal ...
- shell-最近7天目录
#采用将最近7天的日期放入到数组中,遍历整个目录,将这7天的目录连接成一个字符串paths. #注意: .日期目录里面的文件只是做了简单的以part开头的匹配. # .path路径是日期的上一层,以/ ...
- 记一次网卡报错ERROR,some other host already uses address
提示IP地址冲突,但是此IP确实没有被其他Server占用 解决如下: 编辑此文件 搜索arping 将下面几行注释掉 保存退出 激活网卡 此时IP地址已生效 下面是我的系统版本 (一般应该不会出现这 ...
- java中线程状态-死亡
线程死亡: 线程会以如下3种方式结束,结束后就处于死亡状态. 1.run()或call()方法执行完成,线程正常结束. 2.线程抛出一个未捕获的Exception或Error 3.直接调用该线程的st ...
- spark集群安装
cd到conf中去 修改名字 mv spark-env.sh.template spark-env.sh 并且修改内容 添加: export JAVA_HOME=/root/java/jdk1.8 ...
- java基础(3)--8种基本类型
八种基本类型 数据类型分为两大类:基本类型,引用类型 基本类型有8种,除了基本类型(8种)以外任何类型都是引用类型.如: String 是引用类型 基本类型有8种(首字母是小写): 整数:byte, ...