rafael_wl

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl  发布于  2016-05-20 16:38:42
采纳率 0%
12个问答
16911

[已解决]hi3531在uboot中添加ar8035

 
本帖最后由 rafael_wl 于 2016-5-23 11:40 编辑

uboot有个工具叫mii

mii info
mii device 可以查看phy 设备

mii  read /write 可以读 phy的寄存器,这一步已经通了

现在出现这种情况,怎么破,大家指点一下


hisilicon # ping 127.0.0.1
eth_init gmac_inited = 1
get_phy_device phy_id = 0x4dd072
get_phy_device phy_id = 0x4dd072
get_phy_device phy_id = 0xffffffff
eth_init GMAC0_PHY = mdio0,GMAC0_PHY_ADDR = 0
get_phy_device phy_id = 0x4dd072
MAC:   00-00-23-34-45-66

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

Abort
ping failed; host 127.0.0.1 is not alive
我来回答
回答15个
时间排序
认可量排序

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-20 21:39:22
认可0
本帖最后由 rafael_wl 于 2016-5-20 22:03 编辑

hisilicon # ping 192.168.1.2
get_phy_device phy_id = 0x4dd072
get_phy_device phy_id = 0x4dd072
get_phy_device phy_id = 0xffffffff
eth_init GMAC0_PHY = mdio0,GMAC0_PHY_ADDR = 0
get_phy_device phy_id = 0x4dd072
MAC:   00-0C-1C-88-88-00

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

ARP Retry count exceeded; starting again

Abort
ping failed; host 192.168.1.2 is not alive

大家支下招,mii和rgmii都 试过了

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-21 06:52:42
认可0
把代码传上来

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-21 13:26:53
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=30407&ptid=11380]ngswfx 发表于 2016-5-21 06:52[/url]
把代码传上来[/quote]

改了下 PHY 地址,测试了几个AR8035的寄存器
uboot下使用的是stmmac,
现在ping 电脑可以看到灯在闪,说明什么问题?但是提示还是上面的信息

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-21 14:24:56
认可0
本帖最后由 ngswfx 于 2016-5-21 14:28 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=30412&ptid=11380]rafael_wl 发表于 2016-5-21 13:26[/url]
改了下 PHY 地址,测试了几个AR8035的寄存器
uboot下使用的是stmmac,
现在ping 电脑可以看到灯在闪,说 ...[/quote]

根据我网上查资料来看,这个千兆东西,最难的地方是要设置一个什么延迟寄存器,你可以看看文档。否则即便所有都对,还是不能传数据

另外你把你mii info结果发出来,你给的信息太少,我的也不通,看咱们的是否一样,也想简单调一下。我有个想法,找个8035能用的板子,直接把所有寄存器读出来,然后自己仿照这写应该可以。

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-21 15:41:39
认可0
本帖最后由 ngswfx 于 2016-5-23 08:18 编辑

///////////////读取XM板子上的U-boot环境下,网通时的PHY寄存器值
/////////////////////////////////后面成功后,研究发现,这些值和插入的网线,连接的交换机100M还是1000M有关系,下面的值是连接千兆的结果
0- 3100
1- 796D
2- 004D
3- D072
4- 1DE1
5- C5E1
6- 000F
7- 2801
8- 0000
9- 0200
A- 3C00        
B- 0000
C- 0000
D- 0000
E- 0000
F- A000
10-0862
11-BC5C      
12-0000
13-7400
14-082C
15-0000
16-04E8
17-0000
18-3200
19-3000
1A-0000
1B-063E
1C-0000
1D-0005
1E-0100           
1F-8100

//我看了我自己的,主要是1E区别很大   0xA  0x11也稍有区别

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-21 16:03:30
认可0
hisilicon # mii dump 0 0
0.     (3100)                 -- PHY control register --
  (8000:0000) 0.15    =     0    reset
  (4000:0000) 0.14    =     0    loopback
  (2040:2000) 0. 6,13 =   b01    speed selection = 100 Mbps
  (1000:1000) 0.12    =     1    A/N enable
  (0800:0000) 0.11    =     0    power-down
  (0400:0000) 0.10    =     0    isolate
  (0200:0000) 0. 9    =     0    restart A/N
  (0100:0100) 0. 8    =     1    duplex = full
  (0080:0000) 0. 7    =     0    collision test enable
  (003f:0000) 0. 5- 0 =     0    (reserved)

hisilicon # mii read 0 0
3100
hisilicon #

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-21 16:04:17
认可0
本帖最后由 rafael_wl 于 2016-5-21 16:08 编辑

hisilicon # mii read 0 5
CDE1

hisilicon # mii read 0 A
2000

hisilicon # mii read 0 11
7C1C

hisilicon # mii read 0 13
F400

hisilicon # mii read 0 1B
063D

hisilicon # mii read 0 1D
0000

hisilicon # mii read 0 1E
82EE

好多不一样,我手动设置一边看看

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-21 16:16:16
认可0
本帖最后由 rafael_wl 于 2016-5-21 16:20 编辑

5- C5E1  ReadOnly
A- 3C00  ReadOnly      
11-BC5C  ReadOnly     
13-7400  R
1B-063E  Reserved
1D-0005  Debug port address
1E-0100  Debug port data         

也就1D 和 1E 能改?!

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-21 18:56:14
认可0
本帖最后由 ngswfx 于 2016-5-21 19:01 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=30424&ptid=11380]rafael_wl 发表于 2016-5-21 16:16[/url]
5- C5E1  ReadOnly
A- 3C00  ReadOnly      
11-BC5C  ReadOnly     
[/quote]

咱俩的板子不同,我这个: PHY地址是2,模式7

hisilicon # mii info                                                            
PHY 0x02: OUI = 0x1374, Model = 0x07, Rev = 0x02, 1000baseX, FDX               
hisilicon # mii device                                                         
MII devices: '0:2'                                                              
Current device: '0:2'                                                           
hisilicon # mii dump 2 0  

/////////////////////////////////我已經尝试写的一模一样了,还是不行,可能我的STMAC 3535部分还没有搞对

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-23 05:50:19
认可0
本帖最后由 ngswfx 于 2016-5-23 10:32 编辑

哎,终于搞定了,这个鸟东西,费劲死了。
////////////////////////////////////////////////////////////
rgmii模式,可以不用管,代码默认就是这个模式
PHY地址根据mii info的结果直接在hi3535.h里面修改设置即可。
///////////////////////////////////////////////////////
就是按照803x.c的流程写mii PHY寄存器,和XM板子上的U-boot环境下对比,参考了XM这个板子网通时的PHY寄存器值。

//最费解的是,如果插入网线接入百兆交换机,不通,千兆通,调试下来,郁闷而死。:lol
//这是我调试下来,发现最关键的一个问题,默认被设置成千兆了,否则早通了。:curse:

////////////////////////////////////最主要是:
/home/ngs/Hi3535_SDK_V1.0.2.0/osdrv/uboot/u-boot-2010.06/common/miiphyutil.c
文件中的miiphy_speed函数,对8035的判断失效了,判断不准,不论插入100M网络还是1000m网络,都返回了1000M的结果,为此需要针对8035做特殊判断。

我这边8035的mii接口,0xa寄存器,如果是百兆,这个值为0,如果是千兆,寄存器里面有数据,3C00,可以研究用正规的方法,判断更加准确一些。

但由于这个原因的存在,导致调试异常费劲。
////////////////////////////////////////////////////////////miiphy_speed的结果,将直接导致对3535 STMMAC寄存器配置成百兆还是千兆,这就使得无法通讯。
//当然,上述仅仅是针对百兆千兆,一个关键点。

int miiphy_speed (char *devname, unsigned char addr)
{
        u16 bmcr, anlpar;
        u16 btsr, val;

        //针对8035判断当前连接是100M还是1000M 0xa的值在千兆百兆时比较特殊,如果百兆,这个值可能是0或者1
        //应该有更优雅准确的判断方法,这是临时写的,当然,直接按照8035的文档,判断才会准确
       //也可以仔细研究miiphy_speed内部的流程判断,针对8035做调整
        miiphy_read(devname,addr,PHY_1000BTSR,&val);
        if(val==0x0||val==0x1)
           return _100BASET;

/////////////////////////////////////////////////////////////////////////////////////
        miiphy_read(devname,addr,PHY_BMSR,&val);
        if(val & BMSR_ESTATEN){
                //或者将下面这几行取消掉
                //if (miiphy_is_1000base_x (devname, addr)) {
                //        printf ("PHY 1000BASE-X status\n");
                //        return _1000BASET;
                //}

                /*
                 * No 1000BASE-X, so assume 1000BASE-T/100BASE-TX/10BASE-T register set.
                 */
                /* Check for 1000BASE-T. */
                if (miiphy_read (devname, addr, PHY_1000BTSR, &btsr)) {
                        printf ("PHY 1000BT status\n");
                        goto miiphy_read_failed;
                }
                if (btsr != 0xFFFF &&(btsr & (PHY_1000BTSR_1000FD | PHY_1000BTSR_1000HD))) {
                        return _1000BASET;
                }
        }
....................................
//////////////////////////////////////////////
这个百兆千兆,如果没有判断对,将直接导致无法通信,因为8035芯片本身自己会判断(也就是插入100M或者千兆网线,好多寄存器不一样)。但此时3535可不知道(必须主动读取,然后判断)。如果判断错误,8035按照网口百兆交互,3535按照千兆,造成通信不对。

stmmac.c当中,stmmac_net_adjust_link函数内,会读取PHY芯片的寄存器判断是什么网络类型,然后,会写3535的寄存器,写入的数据是不一样的。

千兆写入:

writel(0x280c, ld->iobase_gmac + MAC_CTRL_REG);

百兆写入:
#ifdef CONFIG_TNK
                                newval |= 0x3;
#endif
                                writel(0xe80c, ld->iobase_gmac + MAC_CTRL_REG);

所以调试这个8035,一定连接一个千兆交换机调试,否则采用海斯默认的SDK uboot修改的话,累死你,也找不到原因。我这边正好2种交换机都有,所以尝试了一下,发现了问题。

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-23 09:10:52
认可0
本帖最后由 ngswfx 于 2016-5-23 09:46 编辑

///////////////////mdio.c当中,找到8035 PHY后,需要配置一下,下面的代码仅供参考,有些寄存器配置可能没有实际意义,并非关键值。


////////////////////////////////////////////////
#define BIT(x)        (1 << (x))
#define AT803X_WOL_ENABLE                        0x01
#define AT803X_INTR_ENABLE                      0x12
#define AT803X_INTR_ENABLE_AUTONEG_ERR          BIT(15)
#define AT803X_INTR_ENABLE_SPEED_CHANGED        BIT(14)
#define AT803X_INTR_ENABLE_DUPLEX_CHANGED       BIT(13)
#define AT803X_INTR_ENABLE_PAGE_RECEIVED        BIT(12)
#define AT803X_INTR_ENABLE_LINK_FAIL            BIT(11)
#define AT803X_INTR_ENABLE_LINK_SUCCESS         BIT(10)
#define AT803X_INTR_ENABLE_WIRESPEED_DOWNGRADE  BIT(5)
#define AT803X_INTR_ENABLE_POLARITY_CHANGED     BIT(1)
#define AT803X_INTR_ENABLE_WOL                  BIT(0)
#define AT803X_INTR_STATUS                      0x13
#define AT803X_SMART_SPEED                      0x14
#define AT803X_INTR_ENABLE                        0x12
#define AT803X_WOL_ENABLE                        0x01
#define AT803X_DEVICE_ADDR                        0x03
#define AT803X_LOC_MAC_ADDR_0_15_OFFSET                0x804C
#define AT803X_LOC_MAC_ADDR_16_31_OFFSET        0x804B
#define AT803X_LOC_MAC_ADDR_32_47_OFFSET        0x804A
#define AT803X_MMD_ACCESS_CONTROL                0x0D
#define AT803X_MMD_ACCESS_CONTROL_DATA                0x0E
#define AT803X_FUNC_DATA                        0x4003
#define AT803X_DEBUG_ADDR                       0x1D
#define AT803X_DEBUG_DATA                       0x1E
#define AT803X_DEBUG_REG_0                      0x00
#define AT803X_DEBUG_RX_CLK_DLY_EN              BIT(15)
#define AT803X_DEBUG_REG_5                      0x05
#define AT803X_DEBUG_TX_CLK_DLY_EN              BIT(8)

#include "mdio.h"
#include "ctrl.h"
#include "stmmac.h"
struct stmmac_mdio_local stmmac_mdio_local_device;


static int at803x_debug_reg_read( unsigned char phyaddr,u16 reg)
{
        int ret;
        ret = stmmac_mdio_write(&stmmac_mdio_local_device,phyaddr, AT803X_DEBUG_ADDR, reg);
        if (ret < 0)
                return ret;
        return stmmac_mdio_read(&stmmac_mdio_local_device,phyaddr, AT803X_DEBUG_DATA);
}
static int at803x_debug_reg_mask( unsigned char phyaddr,u16 reg,u16 clear, u16 set)
{
        u16 val;
        int ret;
         ret = at803x_debug_reg_read(phyaddr,reg);
        if (ret < 0)
                return ret;
        val = ret & 0xffff;
        val &= ~clear;
         val |= set;
        return stmmac_mdio_write(&stmmac_mdio_local_device,phyaddr, AT803X_DEBUG_DATA, val);
}
static inline int at803x_enable_rx_delay( unsigned char phyaddr)
{
         return at803x_debug_reg_mask(phyaddr, AT803X_DEBUG_REG_0, 0, AT803X_DEBUG_RX_CLK_DLY_EN);
}

static inline int at803x_enable_tx_delay( unsigned char phyaddr)
{
         return at803x_debug_reg_mask(phyaddr,AT803X_DEBUG_REG_5, 0,AT803X_DEBUG_TX_CLK_DLY_EN);
}
static int at803x_init(char *devname, unsigned char phyaddr)
{
        printf("at803x_init!\n");
        const u8 *mac;
        int ret;
        //const u8 *devname="0:2";
        //const u8 phyaddr=0x02;

        unsigned int offsets[] = {
                AT803X_LOC_MAC_ADDR_32_47_OFFSET,
                AT803X_LOC_MAC_ADDR_16_31_OFFSET,
                AT803X_LOC_MAC_ADDR_0_15_OFFSET,
        };
#if 1
        printf("config device  %s \n",devname);
        int i=0;
        for (i = 0; i < 3; i++) {
                miiphy_write(devname, phyaddr, AT803X_MMD_ACCESS_CONTROL,AT803X_DEVICE_ADDR);
                miiphy_write(devname, phyaddr, AT803X_MMD_ACCESS_CONTROL_DATA,offsets);
                miiphy_write(devname, phyaddr, AT803X_MMD_ACCESS_CONTROL,AT803X_FUNC_DATA);
                miiphy_write(devname, phyaddr, AT803X_MMD_ACCESS_CONTROL_DATA,mac[(i * 2) + 1] | (mac[(i * 2)] << 8));
        }
        short unsigned int value;
        miiphy_read(devname, phyaddr, AT803X_INTR_ENABLE, &value);
        value |= AT803X_INTR_ENABLE_WOL;
        value |= AT803X_INTR_ENABLE_AUTONEG_ERR;
        value |= AT803X_INTR_ENABLE_SPEED_CHANGED;
        value |= AT803X_INTR_ENABLE_DUPLEX_CHANGED;
        value |= AT803X_INTR_ENABLE_LINK_FAIL;
        value |= AT803X_INTR_ENABLE_LINK_SUCCESS;

        ret = miiphy_write(devname, phyaddr, AT803X_INTR_ENABLE, value);
        //miiphy_write(devname, phyaddr, AT803X_INTR_ENABLE, AT803X_WOL_ENABLE);
        //miiphy_write(devname, phyaddr, AT803X_SMART_SPEED, context->smart_speed);

        //下面这2句非常关键,必须有,否则不通,由于我的mii info 里面信息显示的是模式7,如果其他的模式5情况,下面2行是否需要执行,需要验证
      //由于这个代码来自kernel驱动803x.c,这个代码执行条件,就是和rgmii模式相关的。如果加上网反而不通,就需要判断mii info得到的那个模式。
        //////////hisilicon # mii info                                                            
        ////////  PHY 0x02: OUI = 0x1374, Model = 0x07, Rev = 0x02, 1000baseX, FDX      
        at803x_enable_rx_delay(phyaddr);
             at803x_enable_tx_delay(phyaddr);

       
#endif

#if 0
        miiphy_write(devname, phyaddr,0xA,0x3C00);
        miiphy_write(devname, phyaddr,0xD,0x0000);
        miiphy_write(devname, phyaddr,0xE,0x0000);
        miiphy_write(devname, phyaddr,0x11,0xBC5C);
        miiphy_write(devname, phyaddr,0x1E,0x0100);   //2D47
#endif
        return 0;
}

////////////////////////我这里放到了get_phy_device里面

unsigned int get_phy_device(char *devname, unsigned char phyaddr)
{
        u32 phy_id;
        u16 id1, id2;
        printf("get_phy_device devname: %s phyaddr:%x \n",devname,phyaddr);

        miiphy_read(devname, phyaddr, PHY_PHYIDR1, &id1);
        miiphy_read(devname, phyaddr, PHY_PHYIDR2, &id2);

        phy_id = (id1 & 0xffff) << 16;
        phy_id |= (id2 & 0xffff);

        /* If the phy_id is all Fs, there is no device there */
        if (0xffffffff == phy_id || 0 == phy_id|| phy_id == 0xFFFF || phy_id == 0xFFFF0000)
                return 1;
        printf("get_phy_device devname: %s phy_id:0x%x \n",devname,phy_id);
       
        if(phy_id==0x4dd072){
                at803x_init(devname, phyaddr);
        }       
       
        return 0;
}

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-23 11:25:22
认可0
本帖最后由 rafael_wl 于 2016-5-23 11:36 编辑

感谢楼上

也搞定了。
一种也是在
       if(phy_id==0x4dd072){
                读写寄存器。
        }   
这个和你方法差不多:) 但是没通:(,这个地方试了很多。

第二种
在go do_link的时候,做判断,也就是不成功,去判断和初始化寄存器。
uboot里面现在配置的时mii方式,为了和电脑直联,miiphy_speed  没做处理
楼上写的已经很详细了:

我使用的这种方法,需要
在include/configs/下面自己平台的配置文件中,添加 PHY 地址,和打开STMMAC_MII 的宏

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-23 11:39:04
认可0
结贴:感谢万能的论坛,有你们一起不觉的孤单:lol

ddcodeman

0个粉丝

11

问答

0

专栏

0

资料

ddcodeman 2017-01-03 17:21:10
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=30460&ptid=11380]rafael_wl 发表于 2016-5-23 11:25[/url]
感谢楼上

也搞定了。
[/quote]

请问一下
“在include/configs/下面自己平台的配置文件中,添加 PHY 地址,和打开STMMAC_MII 的宏”

这个是如何设置的?是否可以发一下具体的设置,谢谢

sgg19964

0个粉丝

8

问答

0

专栏

0

资料

sgg19964 2018-04-12 10:41:28
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=30460&ptid=11380]rafael_wl 发表于 2016-5-23 11:25[/url]
感谢楼上

也搞定了。
[/quote]

楼主改为mii后有什么注意的地方吗?我的改完之后网络就不通了
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区