OpenWrt ar71xx 添加原生 AR8035 支持的方法 (AR934X)
2015-11-17 20:24
836 查看
http://www.right.com.cn/forum/thread-168504-1-1.html
(出处: 恩山无线论坛 hackpascal )
Linux 自带 AR8035 驱动,但是很多人不知道。这里给出一个简单方便的方法,给 AR9342/AR9344 添加 AR8035 支持。
此方法直接使用 ag71xx 驱动,且不需添加驱动,更不用移植 ag7240/ag934x/arths_gmac。
注意:此方法不能用于AR7161,因为需要设置的参数不同,楼主还未测试过。
Linux 内核中 AR8035 的 PHY 驱动名叫做 at803x,位于 drivers/net/phy/at803x.c
修改方法如下:
(所有改动均在 OpenWrt 代码目录)
1. target/linux/ar71xx/config-3.X (X 依据Linux内核版本而定)
在里面添加一行
CONFIG_AT803X_PHY=y
复制代码
这样能确保 at803x 驱动被编译进内核
2. target/linux/ar71xx/files/arch/mips/ath79/mach-XXXX.c (需要添加 AR8035 支持的文件)
在开头部分添加 at803x 的头文件包含语句
#include <linux/platform_data/phy-at803x.h>
复制代码
这样可以向 at803x 驱动传入一些 PHY 初始化设置
在第一个函数前面添加以下全局静态变量
static struct at803x_platform_data mi124_ar8035_data = {
.enable_rgmii_tx_delay = 1,
.enable_rgmii_rx_delay = 1,
};
static struct mdio_board_info mi124_mdio0_info[] = {
{
.bus_id = "ag71xx-mdio.0",
.phy_addr = 0,
.platform_data = &mi124_ar8035_data,
},
};
复制代码
这两个变量向 at803x 指定了设置 txdelay 和 rxdelay
修改代码中eth注册代码如下,确保只注册eth0
ath79_register_mdio(1, 0x0);
ath79_register_mdio(0, 0x0);
mdiobus_register_board_info(mi124_mdio0_info, ARRAY_SIZE(mi124_mdio0_info));
ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_RGMII_GMAC0 | AR934X_ETH_CFG_SW_ONLY_MODE);
/* GMAC0 is connected to an AR8035 Gigabit PHY */
ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
ath79_eth0_data.phy_mask = BIT(0);
ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
ath79_eth0_pll_data.pll_1000 = 0x0e000000;
ath79_eth0_pll_data.pll_100 = 0x0101;
ath79_eth0_pll_data.pll_10 = 0x1313;
ath79_register_eth(0);
复制代码
这里面指定了接口类型为RGMII
这里面最重要的内容为3个pll值,这些值配合 at803x 的 txdelay 跟 rxdelay 能保证AR8035正常使用
以上方法添加的 AR8035 支持能够保证良好的兼容性以及可移植性。
上述方法中 txdelay/rxdelay 设置与 pll 的设置参考了Atheros LSDK 中 U-Boot
代码中的设置。
补充以下几点,希望对大家有帮助:
1、参考补丁文件:
https://dev.openwrt.org/changeset/45954
2、讨论:
3、折腾了几天,终于把丢包的问题解决了(适配为千兆网卡时,丢包
(出处: 恩山无线论坛 hackpascal )
Linux 自带 AR8035 驱动,但是很多人不知道。这里给出一个简单方便的方法,给 AR9342/AR9344 添加 AR8035 支持。
此方法直接使用 ag71xx 驱动,且不需添加驱动,更不用移植 ag7240/ag934x/arths_gmac。
注意:此方法不能用于AR7161,因为需要设置的参数不同,楼主还未测试过。
Linux 内核中 AR8035 的 PHY 驱动名叫做 at803x,位于 drivers/net/phy/at803x.c
修改方法如下:
(所有改动均在 OpenWrt 代码目录)
1. target/linux/ar71xx/config-3.X (X 依据Linux内核版本而定)
在里面添加一行
CONFIG_AT803X_PHY=y
复制代码
这样能确保 at803x 驱动被编译进内核
2. target/linux/ar71xx/files/arch/mips/ath79/mach-XXXX.c (需要添加 AR8035 支持的文件)
在开头部分添加 at803x 的头文件包含语句
#include <linux/platform_data/phy-at803x.h>
复制代码
这样可以向 at803x 驱动传入一些 PHY 初始化设置
在第一个函数前面添加以下全局静态变量
static struct at803x_platform_data mi124_ar8035_data = {
.enable_rgmii_tx_delay = 1,
.enable_rgmii_rx_delay = 1,
};
static struct mdio_board_info mi124_mdio0_info[] = {
{
.bus_id = "ag71xx-mdio.0",
.phy_addr = 0,
.platform_data = &mi124_ar8035_data,
},
};
复制代码
这两个变量向 at803x 指定了设置 txdelay 和 rxdelay
修改代码中eth注册代码如下,确保只注册eth0
ath79_register_mdio(1, 0x0);
ath79_register_mdio(0, 0x0);
mdiobus_register_board_info(mi124_mdio0_info, ARRAY_SIZE(mi124_mdio0_info));
ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_RGMII_GMAC0 | AR934X_ETH_CFG_SW_ONLY_MODE);
/* GMAC0 is connected to an AR8035 Gigabit PHY */
ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII;
ath79_eth0_data.phy_mask = BIT(0);
ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
ath79_eth0_pll_data.pll_1000 = 0x0e000000;
ath79_eth0_pll_data.pll_100 = 0x0101;
ath79_eth0_pll_data.pll_10 = 0x1313;
ath79_register_eth(0);
复制代码
这里面指定了接口类型为RGMII
这里面最重要的内容为3个pll值,这些值配合 at803x 的 txdelay 跟 rxdelay 能保证AR8035正常使用
以上方法添加的 AR8035 支持能够保证良好的兼容性以及可移植性。
上述方法中 txdelay/rxdelay 设置与 pll 的设置参考了Atheros LSDK 中 U-Boot
代码中的设置。
补充以下几点,希望对大家有帮助:
1、参考补丁文件:
https://dev.openwrt.org/changeset/45954
2、讨论:
3、折腾了几天,终于把丢包的问题解决了(适配为千兆网卡时,丢包
static struct at803x_platform_data iwn2000_at803x_data = { .disable_smarteee = 0, .enable_rgmii_rx_delay = 1, .enable_rgmii_tx_delay = 0, .fixup_rgmii_tx_delay = 1, }; static struct mdio_board_info iwn2000_mdio0_info[] = { { .bus_id = "ag71xx-mdio.0", .phy_addr = 0, .platform_data = &iwn2000_at803x_data, }, }; ath79_setup_ar934x_eth_cfg(AR934X_ETH_CFG_RGMII_GMAC0 | AR934X_ETH_CFG_RXD_DELAY | AR934X_ETH_CFG_RDV_DELAY); ath79_register_mdio(1, 0x0); ath79_register_mdio(0, 0x0); ath79_init_mac(ath79_eth0_data.mac_addr, art + IWN2000_MAC0_OFFSET, 0); mdiobus_register_board_info(iwn2000_mdio0_info, ARRAY_SIZE(iwn2000_mdio0_info)); /* GMAC0 is connected to an AT8035 switch */ ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_RGMII; ath79_eth0_data.phy_mask = BIT(0); ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev; ath79_eth0_pll_data.pll_1000 = 0x0e000000; ath79_eth0_pll_data.pll_10 = 0x00001313; ath79_register_eth(0);
相关文章推荐
- Linux常用命令
- hadoop 学习笔记(1)
- linux第一次实验报告
- Hadoop分布式安装03
- Hadoop分布式安装03
- 01 Linux 入门 各发行版 命令 时间 日期 关机 帮助
- FIO测试磁盘的iops
- linux环境设置export
- Hadoop分布式安装02
- Hadoop分布式安装02
- Linux的IO性能监控工具iostat详解
- Google Android改了什么 openssl
- hadoop完全分布式文件系统集群搭建
- Linux下vi常用命令(笔记)
- Linux 命令总结
- Linux 命令总结
- makefile for opencv
- OpenStack里如何实现跨数据中心以及异构hypervisor管理
- Linux中vi显示中文乱码的问题
- 【python在git bash下的中文显示】 UnicodeEncodeError: 'ascii' codec can't encode characters in position ...