找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 35182|回复: 60

OpenWrt ar71xx 添加原生 AR8035 支持的方法 (AR934X/AR7161/QCA9558)

  [复制链接]
本帖最后由 hackpascal 于 2016-7-8 09:57 编辑

(转载请注明原帖与作者)

Linux 自带 AR8035 驱动,但是很多人不知道。这里给出一个简单方便的方法,给 QCA9558/QCA9557/AR9342/AR9344/AR7141/AR7161 添加 AR8035 支持。
此方法直接使用 ag71xx 驱动,且不需添加驱动,更不用移植 ag7240/ag934x/arths_gmac。

Linux 内核中 AR8035 的 PHY 驱动名叫做 at803x,位于 drivers/net/phy/at803x.c

修改方法如下:
(所有改动均在 OpenWrt 代码目录)

1. target/linux/ar71xx/config-3.X (X 依据Linux内核版本而定)
在里面添加一行
  1. CONFIG_AT803X_PHY=y
复制代码
这样能确保 at803x 驱动被编译进内核

2. target/linux/ar71xx/files/arch/mips/ath79/mach-XXXX.c (需要添加 AR8035 支持的文件)
在开头部分添加 at803x 的头文件包含语句
  1. #include <linux/platform_data/phy-at803x.h>
复制代码
这样可以向 at803x 驱动传入一些 PHY 初始化设置

在第一个函数前面添加以下两个全局静态变量:
第一个是对 AR803X 设置 txdelay rxdelay。AR934X 跟 AR7141/AR7161 的设置方法不同。

AR7141/AR7161设置如下:
  1. static struct at803x_platform_data mi124_ar8035_data = {
  2.         .enable_rgmii_tx_delay = 1,
  3. };
复制代码

AR934X设置如下:
  1. static struct at803x_platform_data mi124_ar8035_data = {
  2.         .enable_rgmii_rx_delay = 1,
  3.         .fixup_rgmii_tx_delay = 1,
  4. };
复制代码

QCA955X设置如下:
  1. static struct at803x_platform_data mi124_ar8035_data = {
  2.         .enable_rgmii_tx_delay = 1,
  3. };
复制代码

第二个是在注册 eth 设备时向 ag71xx 驱动传入的设置
  1. static struct mdio_board_info mi124_mdio0_info[] = {
  2.         {
  3.                 .bus_id = "ag71xx-mdio.0",
  4.                 .phy_addr = 0,
  5.                 .platform_data = &mi124_ar8035_data,
  6.         },
  7. };
复制代码
这个变量让 ag71xx 在连接 at803x 驱动时向 at803x 驱动传入上面设置的变量。
.phy_addr = 0 指的是指定使用 MDIO 地址为 0 的 PHY,这个需要根据实际情况(在PCB上的bootstrap pin)来设置

修改代码中eth注册代码如下,确保只注册eth0
  1.         ath79_register_mdio(0, 0x0);

  2.         mdiobus_register_board_info(mi124_mdio0_info, ARRAY_SIZE(mi124_mdio0_info));

  3.         ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_RGMII_GMAC0);

  4.         /* GMAC0 is connected to an AR8035 Gigabit PHY */
  5.         ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
  6.         ath79_eth0_data.phy_mask = BIT(0);
  7.         ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
  8.         ath79_eth0_pll_data.pll_1000 = 0x0e000000;
  9.         ath79_eth0_pll_data.pll_100 = 0x0101;
  10.         ath79_eth0_pll_data.pll_10 = 0x1313;
  11.         ath79_register_eth(0);
复制代码
这里面指定了接口类型为RGMII
这里面最重要的内容为3个pll值,这些值配合 at803x 的 txdelay 跟 rxdelay 能保证AR8035正常使用。上面代码中三个 pll 值是给 AR934X使用的。

如果使用 AR7141/AR7161,请使用下面的 pll 数值:
  1.         ath79_eth0_pll_data.pll_1000 = 0x00110000;
  2.         ath79_eth0_pll_data.pll_100 = 0x0001099;
  3.         ath79_eth0_pll_data.pll_10 = 0x00991099;
复制代码
并且请删掉 ath79_setup_ar934x_eth_cfg 这一行

如果使用 QCA9558/QCA9557,请使用下面的 pll 数值:
  1.         ath79_eth0_pll_data.pll_1000 = 0x86000000;
  2.         ath79_eth0_pll_data.pll_100 = 0x80000101;
  3.         ath79_eth0_pll_data.pll_10 = 0x80001313;
复制代码

注意:
对于 AR934X,有些板子的 AR8035 并没有使用 PHY Addr. 0,此时请把 ath79_eth0_data.phy_mask = BIT(0); 的 BIT(0)从0到15依次试一次。同时要修改上面的 .phy_addr 的值
楼主遇到一个板子,QCA9558 的,使用的 PHY Addr 是 7。。。。。。

以上方法添加的 AR8035 支持能够保证良好的兼容性以及可移植性。

上述方法中 txdelay/rxdelay 设置与 pll 的设置参考了Atheros  LSDK 中 U-Boot (AR934X) 和 redboot (AR7161) 代码中的设置。
QCA9558 的
txdelay/rxdelay 设置与 pll 值来源于实际测算。
AR7242 没遇到对应的板子,故没有对应的 txdelay/rxdelay 设置与 pll 值。
QCA9563 仅支持 SGMII 接口,故只能使用 AR8031 或 AR8033,且官方使用 AR8033,其配置与 RGMII  接口的 AR8035 不同,因此这里无法列出其注册方法。

评分

参与人数 6恩山币 +14 收起 理由
hw*** + 1 我来恩山就是为了看你!
小*** + 1 我来恩山就是为了看你!
jian*** + 1 亲,你太牛逼了,走,我请你吃鳇鱼头去~~~
yeti*** + 1 泥马,真给力,我要顶!
633*** + 5 强大的恩山!(以下重复1万次)
点击修*** + 5 楼主威武—我就想问问挖掘机技术哪家强?

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
支持楼主一下,顺便抢个沙发试试!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

曲调前来捧场
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
顶一顶更健康
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

https://dev.openwrt.org/changeset/45954
这个和楼主的差不多!{:soso_e115:}按着这个方法一直没驱动了!!
     明天试试楼主的方法!!谢啦!

点评

那个方法能用就怪了,关键参数都没设置  发表于 2015-6-28 23:07
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

硬件NAT?

点评

交换机都不是,还NAT  发表于 2015-6-29 00:24
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

撸过前来支持
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

前来支持
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

支持大神,能不能看看bcm5358的hg320 wifi怎么驱动呢?自带的3种驱动不能用。谢谢
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

谢谢楼主分享。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

楼主在玩什么路由,很高端的样子
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

using namespace?貌似现在头文件都不用这种方法了吧?

点评

名称空间和头文件有毛线关系。。。 还有貌似名称空间是C++特性。。。  详情 回复 发表于 2015-6-29 18:19
what are you saying  发表于 2015-6-29 17:30
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

tartarus 发表于 2015-6-29 16:22
using namespace?貌似现在头文件都不用这种方法了吧?

名称空间和头文件有毛线关系。。。
还有貌似名称空间是C++特性。。。

点评

命名空间的话头文件就不用.h了  详情 回复 发表于 2015-6-30 11:33
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

981213 发表于 2015-6-29 18:19
名称空间和头文件有毛线关系。。。
还有貌似名称空间是C++特性。。。

命名空间的话头文件就不用.h了

点评

不用在这炫耀你学了多少C++了 Linux是纯C的  详情 回复 发表于 2015-6-30 12:17
你知道Linux内核是用C来写的么。。。。。。 还有,那些头文件不带.h的C++程序实际上是因为他include的文件本来就!没!有!扩展名。。。。。。  详情 回复 发表于 2015-6-30 12:14
想的美  详情 回复 发表于 2015-6-30 12:12
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

tartarus 发表于 2015-6-30 11:33
命名空间的话头文件就不用.h了

想的美
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-28 07:26

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表