ngswfx

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2016-05-08 22:18:09
采纳率 0%
55个问答
9085

【已解决Kernel以及Uboot】HI3535 U-boot添加网卡AR8035支持

 

[i=s] 本帖最后由 ngswfx 于 2016-5-23 10:37 编辑 [/i]

这几天搞5百万解码 雄迈主板,3535芯片,AR8035网络芯片。

哪位大侠做过,给点思路,只要是做过非芯片内网络的即可,都一样,我希望知道流程。另外哪位大侠有适合AR8035用的驱动C文件能否贡献一下,我从网上找的感觉不是给这个东西用的,一点点摸索太费劲。

目前我的初步计划是,编译好所有的3535 bin文件,然后在rootfs中,通过ko的方法,先测试我从网上找到的AR8035 ko是否能用,如果可以用,我在研究源码,往U-boot里面添加移植。 ////////////////////////////////

U-boot已经编译完成,准备弄kernel了,目前由于没有U-boot网络支持,不能TFTP只能通过USB方式,

fatload usb 0 0x81050000 3535_uimage_full.bin 装载刷flash /////////////////////////////////////////////////////////////////2016_5_10

2016_5_11进度 已经在3536中发现了at803x.c文件 1、将3536中的/home/ngs/Hi3536_SDK_V2.0.2.0/osdrv/opensource/kernel/linux-3.10.y/drivers/net/phy/at803x.c文件拷贝到3535对应目录 2、修改/home/ngs/Hi3536_SDK_V2.0.2.0/osdrv/opensource/kernel/linux-3.10.y/drivers/net/phy中的makefile,添加一行,仿照3536中做即可。

obj-$(CONFIG_AT803X_PHY) += at803x.o

3、在/home/ngs/Hi3535_SDK_V1.0.2.0/osdrv/kernel/linux-3.4.y/arch/arm/configs目录下, hi3535_mini_defconfig hi3535_full_defconfig hi3535_full_slave_defconfig三个文件中 添加一行 CONFIG_AT803X_PHY=y

4、还是这个目录下/home/ngs/Hi3535_SDK_V1.0.2.0/osdrv/kernel/linux-3.4.y/arch/arm/configs,Kconfig文件,仿照添加

config AT803X_PHY tristate "Drivers for the AT803X PHYs" ---help--- Currently supports the AT803X //////////////////////////////////////////////////////////////////暂时只搞到这里,让menuConfig有8035选项了,其他部分还在研究,主要是让代码走到8035里面

[color=Red]kernel部分已经搞定。 U-boot暂没有迫切需求,放弃。[/color]

kernel解决过程帖子 http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=11266&extra=page%3D1%26filter%3Ddigest%26digest%3D1

U-boot协助解决帖子:http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=11380&page=1&extra=#pid30448

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

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

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

int miiphy_speed (char devname, unsigned char addr) { u16 bmcr, anlpar; u16 btsr, val; [color=Red] //针对8035判断当前连接是100M还是1000M 0xa的值在千兆百兆时比较特殊,如果百兆,这个值可能是0或者1 //应该有更优雅准确的判断方法,这是临时写的,当然,直接按照8035的文档,判断才会准确 //也可以仔细研究miiphy_speed内部的流程判断,针对8035做调整[/color] 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){ [color=Blue]/ /或者将下面这几行取消掉,目前我就是这么干的 //if (miiphy_is_1000base_x (devname, addr)) { // printf ("HY 1000BASE-X status\n"); // return _1000BASET; //}[/color] /

  • 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 ("HY 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种交换机都有,所以尝试了一下,发现了问题。

///////////////////////////////////////////////////////////////////////////////// //////////////////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);

    [color=Red]//下面这2句非常关键,必须有,否则不通[/color]
    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);

   [color=Red] if(phy_id==0x4dd072){
            at803x_init(devname, phyaddr);
    }       [/color]        
    return 0;

}

我来回答
回答14个
时间排序
认可量排序

goodman

4个粉丝

30

问答

18

专栏

17

资料

goodman 2016-05-09 20:12:39
认可0
这个phy 不好调,当初我也搞多XM的板子,就boot没有换了,试了N久没有搞定

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-10 14:12:33
认可0
楼主最近也在搞ar8035,你uboot没有调好么?卡在uboot这边了,这个片子资料太少

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-10 14:25:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29836&ptid=11254]rafael_wl 发表于 2016-5-10 14:12[/url]
楼主最近也在搞ar8035,你uboot没有调好么?卡在uboot这边了,这个片子资料太少[/quote]

我是先计划搞定Kerel,uboot暂准备放弃,平时几乎用不到,每次都是U盘升级,u-boot 几乎永不到网络

你kernel搞定没,我正在弄,搞定了,给我点提示:lol

seymour

0个粉丝

10

问答

0

专栏

0

资料

seymour 2016-05-12 15:23:41
认可0
在几个平台的Uboot中没有phy的驱动, 看看miiphyutil.c。 而且ar8035跟其他的phy芯片硬件上有点区别。

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-18 15:05:08
认可0
LZ 你的kernel里面 用起来了么? 我是下载的网上的 at803x.c

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-18 16:00:23
认可0
本帖最后由 ngswfx 于 2016-5-18 16:09 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=30217&ptid=11254]rafael_wl 发表于 2016-5-18 15:05[/url]
LZ 你的kernel里面 用起来了么? 我是下载的网上的 at803x.c[/quote]


Kernel解决过程帖子
[url]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=11266&extra=page%3D1%26filter%3Ddigest%26digest%3D1[/url]

你找的网上的那个at803x.c这个可能不能用,里面函数太多不行,对linux内核要求太高了,好象是4.5的,里面PHY部分增加了好多接口,用3536里面的可以。uboot我没管他,放弃了。USB升级不影响的。平时uboot我基本不动。

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-31 19:43:27
认可0
LZ 内核中的Phy name 和 Phy ID是在什么地方改?

PHY 1:02 not found

我这边应该是 PHY 0:0

rafael_wl

1个粉丝

12

问答

0

专栏

7

资料

rafael_wl 2016-05-31 20:04:29
认可0
[url]http://www.stlinux.com/kernel/network/phy-howto[/url]
找到一篇文章,受到启发。
在driver/net/stmmac/ 下找到 stmmac_main.c  里面有phy bus的id,  .config 下的有Phy ADD的地址,这个可以通过menuconfig 设置进去

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-01 07:46:02
认可0
本帖最后由 ngswfx 于 2016-6-1 07:52 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=30965&ptid=11254]rafael_wl 发表于 2016-5-31 19:43[/url]
LZ 内核中的Phy name 和 Phy ID是在什么地方改?

PHY 1:02 not found
[/quote]

Phy name 和 Phy ID是在什么地方改?

///////////////////////////////////////////////////
Phy name 是总线自己检测出来的,不用改
///PHY ID倒是最关键,直接在menuconfig配置菜单中,修改ethnet里面的stmmac 2个网络的地址。这个最重要了。

不过首先要按照上文中的描述,把803.c添加进去,让menuconfig能在phy菜单中,出来803.c。

直接下载 kernel解决过程帖子 [url]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=11266&extra=page%3D1%26filter%3Ddigest%26digest%3D1[/url],里面的附件,覆盖到你的kernel里面PHY相应目录,就都有了


applepen

0个粉丝

11

问答

0

专栏

11

资料

applepen 2017-03-22 17:17:59
认可0
hisilicon # usb start
(Re)start USB...
USB:   scanning bus for devices... 2 USB Device(s) found
       scanning bus for storage devices... usb_stor_get_info->1431,blksz:512
1 Storage Device(s) found
hisilicon # fatload usb 0:1 0x82000000 uImage
reading uImage
.............................................

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-06-30 15:33:12
认可0

好,不错,mark啦

real小样

0个粉丝

1

问答

0

专栏

0

资料

real小样 2018-01-24 22:33:55
认可0
按照这个,终于解决了自己的问题

qn1577694158

0个粉丝

0

问答

0

专栏

0

资料

qn1577694158 2020-01-02 18:52:06
认可0
顶,8031 Phy 千兆自适应全双工,流量不稳定,有遇到的么

qn1579076259

0个粉丝

2

问答

0

专栏

0

资料

qn1579076259 2020-03-04 17:33:54
认可0
我也在搞3536C AR8035的网卡,看内核驱动打印好像是找到了:
libphy: Fixed MDIO Bus: probed
libphy: hisi_gemac_mii_bus: probed
ata1: SATA link down (SStatus 0 SControl 300)
libphy: hisi_gemac_mii_bus: probed
hi_gmac_v200 100a0000.ethernet (unnamed net_device) (uninitialized): using random MAC address 42:af:86:bf:1e:77
ata2: SATA link down (SStatus 0 SControl 300)
attached PHY 2 to driver Atheros 8035 ethernet, PHY_ID=0x4dd072
Higmac dma_sg_phy: 0x91300000
ETH: rgmii, phy_addr=2
hi_gmac_v200 100a1000.ethernet (unnamed net_device) (uninitialized): using random MAC address d6:56:26:2e:1c:1f
attached PHY 3 to driver Generic PHY, PHY_ID=0xffff
Higmac dma_sg_phy: 0x91340000
ETH: rgmii, phy_addr=3

但是就是死活PING不通网络,如下:
~ # hi_gmac_v200 100a0000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

~ # ifconfig
eth0      Link encap:Ethernet  HWaddr 42:AF:86:BF:1E:77  
          inet addr:10.11.49.111  Bcast:10.255.255.255  Mask:255.0.0.0
          inet6 addr: fe80::40af:86ff:febf:1e77/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:86 errors:0 dropped:5 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:9453 (9.2 KiB)  TX bytes:578 (578.0 B)
          Interrupt:48

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

~ # ifconfig eth0 10.11.49.100
~ # ping 10.11.49.111
PING 10.11.49.111 (10.11.49.111): 56 data bytes

--- 10.11.49.111 ping statistics ---
27 packets transmitted, 0 packets received, 100% packet loss
~ # ping 10.11.49.111
PING 10.11.49.111 (10.11.49.111): 56 data bytes

求搞定了的大神教教我,感谢啊,我的QQ:360950482
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区