问题描述

  连接网线的情况下,每次进行软件"reboot",网口的LINK LED能够正常的熄灭,而ACTIVE LED却是亮的。

reboot重启之后,LINK的灯正常变亮,而ACTIVE的灯却灭了.在有数据传输的时,能够正常的闪烁。

将网线拔了,LINK灯灭,ACTIVE灯亮。

如果一直插上网线,每次reboot之后,ACTIVE的灯的没数据通信时,一次是亮的,下一次reboot又灭了,这样交替出现。

                                         Tony Liu, 2016-6-8, Shenzhen

参考链接

  Bone A6 (and others) PHY LEDs after reboot

  AM335x: Cannot set PRM_RSTTIME register under Linux

  Not so warm restart of AM3358 via software?

  DM8168复位问题疑问

  [U-Boot] am335x_evm: Fix Ethernet LED issue on BeagleBone

  Not asserting RESETIN_OUT on beaglebone

  AM335X Watchdog Reset

  beagleboard.org

  M3352 resetin_out

  AM335x Warm Reset Output Falling time

问题分析

  初步分析phy芯片没有复位。测量复位引脚。

  

  由于LAN8710的nRST引脚需要保持低电平时间最小为100us才能够复位。

而连接的AM335x的nRESTIN_OUT引脚输出低电平的时间为700ns左右。

经过SN74LVC1G07DBV开漏输出缓冲器之后,时间也才1us,远没有达到复位的要求,导致复位异常。

解决方法

  在datasheet中有提及可以是指寄存器来延长nRESTIN_OUT低电平的时间。

Technical Reference Manual的8.1.7.4 Global Warm Reset有详细介绍。

PRM_RSTTIME.RSTTIME1设置即可

8.1.13.5.2 PRM_RSTTIME Register

  在uboot中设置,进行验证

OK335X# md 0x44e00f04 4
44e00f04: 00001fff 00000003 78000017 00000003 ...........x....
OK335X# mw 0x44e00f04 0xffff
OK335X# md 0x44e00f04 4
44e00f04: 00001fff 00000003 78000017 00000003 ...........x....
OK335X# reset

  这样最大的信号已经延长到12us左右,但是远没有达到100us,但是ACTIVE LED正常。

  可是这样的设置并没有kernel中生效。最后定位到,reboot命令,调用的am335x的 omap_prcm_arch_reset函数

reboot操作启动设置PRM_RSTCTRL Register的RST_GLOBAL_COLD_SW,将其置1,这样一来直接设置的寄存器值都覆盖为默认值,设置就没有效果。

更改为设置RST_GLOBAL_WARM_SW即可,只会讲一部分的寄存器设置为默认值,我设置的PRM_RSTTIME的值并没有因为reboot命令而设置为默认值。

arch/arm/mach-omap2/prcm.c

void (*arch_reset)(char, const char *) = omap_prcm_arch_reset;

static void omap_prcm_arch_reset(char mode, const char *cmd)
{
s16 prcm_offs = 0;
unsigned int val;
if (cpu_is_omap24xx()) {
omap2xxx_clk_prepare_for_reboot(); prcm_offs = WKUP_MOD;
} else if (cpu_is_am33xx()) {
prcm_offs = AM33XX_PRM_DEVICE_MOD;
/* add by Tony, 2016-6-7 */
//将PRM_RSTTIME.RSTTIME1寄存器的值设置成最大0xff,这样一来复位时就会延长低电平波形的长度,延长至12us左右。
omap2_prm_set_mod_reg_bits(0xff,
prcm_offs, AM33XX_PRM_RSTTIME_OFFSET); //omap2_prm_set_mod_reg_bits(OMAP4430_RST_GLOBAL_COLD_SW_MASK,
// prcm_offs, AM33XX_PRM_RSTCTRL_OFFSET);
//更改
omap2_prm_set_mod_reg_bits(OMAP4430_RST_GLOBAL_WARM_SW_MASK,
prcm_offs, AM33XX_PRM_RSTCTRL_OFFSET);
} else if (cpu_is_omap34xx()) {
prcm_offs = OMAP3430_GR_MOD;
omap3_ctrl_write_boot_mode((cmd ? (u8)*cmd : 0));
} else if (cpu_is_omap44xx()) {
omap4_prminst_global_warm_sw_reset(); /* never returns */
} else {
WARN_ON(1);
}
......
}

当然这不是长远之计,正确的做法是:

  1. 采用GPIO引脚来控制phy的reset,只要reboot时保证对应的gpio为低电平。
  2. 将nRST直接上拉,不进行复位。
  3. 采用硬件上的更改,想详情请留意参考链接第一条。

am335x phy led problem的更多相关文章

  1. 转:AM335x启动流程(BootRom->MLO->Uboot)

    http://blog.chinaunix.net/uid-28458801-id-3486399.html 参考文件: 1,AM335x ARM Cortex-A8 Microprocessors ...

  2. 常用PC服务器LSI阵列卡配置

    通常,我们使用的DELL/HP/IBM三家的机架式PC级服务器阵列卡是从LSI的卡OEM出来的,DELL和IBM两家的阵列卡原生程度较高,没有做太多封装,可以用原厂提供的阵列卡管理工具进行监控:而HP ...

  3. [TI-Sitara]启动流程

    前段时间在准备AM437x启动相关的一些事情,对MLO.SPL等事情也是有些糊涂,于是分享下面这篇文章 转自:http://blog.csdn.net/psvoldemort/article/deta ...

  4. AM335x内核模块驱动之LED

    在Ubuntu的任意可操作的文件才建立text目录 在text中建立zyr-hello.c: #include<linux/kernel.h> #include<linux/modu ...

  5. am335x -- led 控制

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...

  6. am335x gpio分析

    /************************************************************************ * am335x_gpio * 本文主要记录am33 ...

  7. arm Linux 驱动LED子系统 测试

    Linux内核在3.0以上引入了设备树概念(具体哪个版本不清楚)在编译内核后需要将与之对应的dtb文件也下载人板子上才能使内核与硬件关联起来. dtb文件是有dts文件编译后生成的:例如 /* * C ...

  8. csuoj 1507: 超大型LED显示屏

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1507 1507: 超大型LED显示屏 时间限制: 1 Sec  内存限制: 128 MB 提交:  ...

  9. 转!!MAC和PHY的区别

    一块以太网网卡包括OSI(开方系统互联)模型的两个层,物理层和数据链路层.物理层定义了数据传送与接收所需要的电与光信号.线路状态.时钟基准.数据编码和电路等,并向数据链路层设备提供标准接口.数据链路层 ...

随机推荐

  1. 三极管工作区在Spectre中的表示

    三极管的工作区在Spectre中通过静态工作点的region字段表示,具体表示如下: region: 0:off 1:fwd 2:rev 3:sat 4:breakdown 可在终端中输入 : ”sp ...

  2. 使用 bat cmd命令杀掉 删掉运行的程序

    删掉所有xx.exe开启的进程 taskkill /f /im xx.exe 开启xx.exe start xx.exe 根据标题栏信息删除 taskkill /f /FI "windows ...

  3. 使用xtrabackup(innobackupex)实现MySQL的热备

    mysql 的热备http://www.178linux.com/10139http://www.linuxidc.com/Linux/2014-04/99671.htmhttp://634871.b ...

  4. .net程序调试一:快速定位异常

    作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重 ...

  5. UVA 1264 - Binary Search Tree(BST+计数)

    UVA 1264 - Binary Search Tree 题目链接 题意:给定一个序列,插入二叉排序树,问有多少中序列插入后和这个树是同样的(包含原序列) 思路:先建树,然后dfs一遍,对于一个子树 ...

  6. HDU 4670 Cube number on a tree ( 树的点分治 )

    题意 : 给你一棵树 . 树的每一个结点都有一个权值 . 问你有多少条路径权值的乘积是一个全然立方数 . 题目中给了你 K 个素数 ( K <= 30 ) , 全部权值都能分解成这k个素数 思路 ...

  7. seajs加载jquery插件

    假设有如下一个名为get-data的jq插件: (function($) { $.fn.getData= function() { console.log($(this).attr('data')) ...

  8. linux命令(31):more

    一.more命令 more功能类似 cat ,cat命令是整个文件的内容从上到下显示在屏幕上. more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按 ...

  9. ny36 最长公共子序列

    最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最 ...

  10. pairRDD中算子reduceByKeyLocally

    原型: def reduceByKeyLocally(func: (V, V) => V): Map[K, V] 该函数将RDD[K,V]中每个K对应的V值根据映射函数来运算,运算结果映射到一个 ...