linux read phy reg,OpenWrt/LEDE 4M精简迷你固件-Luci界面-SFE加速-SQM分配-UPNP-IPv6-VLAN支持-WIFI计划...

/*

*  Support for COMFAST boards:

*  - TL-WR881N v1 (QCA9558)

*

*  Copyright (C) 2016 Piotr Dymacz

*  Copyright (C) 2016 Gareth Parker

*  Copyright (C) 2015 Paul Fertser

*

*  This program is free software; you can redistribute it and/or modify it

*  under the terms of the GNU General Public License version 2 as published

*  by the Free Software Foundation.

*/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include "common.h"

#include "dev-eth.h"

#include "dev-gpio-buttons.h"

#include "dev-leds-gpio.h"

#include "dev-m25p80.h"

#include "dev-wmac.h"

#include "dev-spi.h"

#include "machtypes.h"

#define CF_EXXXN_KEYS_POLL_INTERVAL        20

#define CF_EXXXN_KEYS_DEBOUNCE_INTERVAL        (3 * CF_EXXXN_KEYS_POLL_INTERVAL)

/* CF-E380AC v1/v2 */

#define CF_E380AC_V1V2_GPIO_LED_SYSTEM        19

#define CF_E380AC_V1V2_GPIO_LED_WLAN        12

#define CF_E380AC_V1V2_GPIO_LED_WPS        15

#define CF_E380AC_V1V2_GPIO_BTN_RESET        16

#define ATH_MII_MGMT_CMD                0x24

#define ATH_MGMT_CMD_READ                0x1

#define ATH_MII_MGMT_ADDRESS                0x28

#define ATH_ADDR_SHIFT                        8

#define ATH_MII_MGMT_CTRL                0x2c

#define ATH_MII_MGMT_STATUS                0x30

#define ATH_MII_MGMT_IND                0x34

#define ATH_MGMT_IND_BUSY                (1 << 0)

#define ATH_MGMT_IND_INVALID                (1 << 2)

#define QCA955X_ETH_CFG_GE0_MII_EN        BIT(1)

#define QCA955X_ETH_CFG_GE0_MII_SLAVE        BIT(4)

static struct gpio_led cf_e380ac_v1_leds_gpio[] __initdata = {

{

.name                = "cf-e380ac-v1:green:wps",

.gpio                = CF_E380AC_V1V2_GPIO_LED_WPS,

.active_low        = 0,

}, {

.name                = "cf-e380ac-v1:blue:wlan",

.gpio                = CF_E380AC_V1V2_GPIO_LED_WLAN,

.active_low        = 0,

}, {

.name                = "cf-e380ac-v1:red:system",

.gpio                = CF_E380AC_V1V2_GPIO_LED_SYSTEM,

.active_low        = 0,

},

};

static struct gpio_keys_button cf_e380ac_v1v2_gpio_keys[] __initdata = {

{

.desc                = "Reset button",

.type                = EV_KEY,

.code                = KEY_RESTART,

.debounce_interval = CF_EXXXN_KEYS_DEBOUNCE_INTERVAL,

.gpio                = CF_E380AC_V1V2_GPIO_BTN_RESET,

.active_low        = 1,

},

};

static const char *cf_e380ac_v1v2_part_probes[] = {

"tp-link",

NULL,

};

static struct flash_platform_data cf_e380ac_v1v2_flash_data = {

.part_probes        = cf_e380ac_v1v2_part_probes,

};

static struct mdio_board_info cf_e380ac_v1v2_mdio0_info[] = {

{

.bus_id = "ag71xx-mdio.0",

.phy_addr = 0,

.platform_data = NULL,

},

};

static unsigned long __init ath_gmac_reg_rd(unsigned long reg)

{

void __iomem *base;

unsigned long t;

base = ioremap(AR71XX_GE0_BASE, AR71XX_GE0_SIZE);

t = __raw_readl(base + reg);

iounmap(base);

return t;

}

static void __init ath_gmac_reg_wr(unsigned long reg, unsigned long value)

{

void __iomem *base;

unsigned long t = value;

base = ioremap(AR71XX_GE0_BASE, AR71XX_GE0_SIZE);

__raw_writel(t, base + reg);

iounmap(base);

}

static void __init phy_reg_write(unsigned char phy_addr, unsigned char reg, unsigned short data)

{

unsigned short addr = (phy_addr << ATH_ADDR_SHIFT) | reg;

volatile int rddata;

unsigned short ii = 0xFFFF;

do

{

udelay(5);

rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;

} while (rddata && --ii);

ath_gmac_reg_wr(ATH_MII_MGMT_ADDRESS, addr);

ath_gmac_reg_wr(ATH_MII_MGMT_CTRL, data);

do

{

udelay(5);

rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;

} while (rddata && --ii);

}

static unsigned short __init phy_reg_read(unsigned char phy_addr, unsigned char reg)

{

unsigned short addr = (phy_addr << ATH_ADDR_SHIFT) | reg, val;

volatile int rddata;

unsigned short ii = 0xffff;

do

{

udelay(5);

rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;

} while (rddata && --ii);

ath_gmac_reg_wr(ATH_MII_MGMT_CMD, 0x0);

ath_gmac_reg_wr(ATH_MII_MGMT_ADDRESS, addr);

ath_gmac_reg_wr(ATH_MII_MGMT_CMD, ATH_MGMT_CMD_READ);

do

{

udelay(5);

rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;

} while (rddata && --ii);

val = ath_gmac_reg_rd(ATH_MII_MGMT_STATUS);

ath_gmac_reg_wr(ATH_MII_MGMT_CMD, 0x0);

return val;

}

static void __init athrs27_reg_write(unsigned int s27_addr, unsigned int s27_write_data)

{

unsigned int addr_temp;

unsigned int data;

unsigned char phy_address, reg_address;

addr_temp = (s27_addr) >> 2;

data = addr_temp >> 7;

phy_address = 0x1f;

reg_address = 0x10;

phy_reg_write(phy_address, reg_address, data);

phy_address = (0x17 & ((addr_temp >> 4) | 0x10));

reg_address = (((addr_temp << 1) & 0x1e) | 0x1);

data = (s27_write_data >> 16) & 0xffff;

phy_reg_write(phy_address, reg_address, data);

reg_address = ((addr_temp << 1) & 0x1e);

data = s27_write_data  & 0xffff;

phy_reg_write(phy_address, reg_address, data);

}

static unsigned int __init athrs27_reg_read(unsigned int s27_addr)

{

unsigned int addr_temp;

unsigned int s27_rd_csr_low, s27_rd_csr_high, s27_rd_csr;

unsigned int data;

unsigned char phy_address, reg_address;

addr_temp = s27_addr >>2;

data = addr_temp >> 7;

phy_address = 0x1f;

reg_address = 0x10;

phy_reg_write(phy_address, reg_address, data);

phy_address = (0x17 & ((addr_temp >> 4) | 0x10));

reg_address = ((addr_temp << 1) & 0x1e);

s27_rd_csr_low = (unsigned int) phy_reg_read(phy_address, reg_address);

reg_address = reg_address | 0x1;

s27_rd_csr_high = (unsigned int) phy_reg_read(phy_address, reg_address);

s27_rd_csr = (s27_rd_csr_high << 16) | s27_rd_csr_low ;

return (s27_rd_csr);

}

static void __init ar8236_reset(void)

{

unsigned short i = 30;

athrs27_reg_write(0x0, athrs27_reg_read(0x0) | 0x80000000);

while (i--)

{

mdelay(100);

if (!(athrs27_reg_read(0x0) & 0x80000000))

break;

}

}

static void __init cf_e380ac_v1_setup(void)

{

u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);

u8 *art = (u8 *) KSEG1ADDR(0x1fff1000);

u8 tmpmac[ETH_ALEN];

ath79_register_m25p80(&cf_e380ac_v1v2_flash_data);

ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_GE0_MII_EN | QCA955X_ETH_CFG_GE0_MII_SLAVE);

ath79_register_mdio(0, 0x0);

mdiobus_register_board_info(cf_e380ac_v1v2_mdio0_info,

ARRAY_SIZE(cf_e380ac_v1v2_mdio0_info));

ar8236_reset();

/* Wi-Fi */

ath79_init_mac(tmpmac, mac, 0);

ath79_register_wmac(art, tmpmac);

/* LAN */

ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);

/* GMAC0 is connected to the PHY4 of the internal switch */

ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;

ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;

ath79_eth0_data.phy_mask = BIT(0);

ath79_eth0_data.speed = SPEED_100;

ath79_eth0_data.duplex = DUPLEX_FULL;

ath79_register_eth(0);

ath79_register_gpio_keys_polled(-1, CF_EXXXN_KEYS_POLL_INTERVAL,

ARRAY_SIZE(cf_e380ac_v1v2_gpio_keys),

cf_e380ac_v1v2_gpio_keys);

ath79_register_leds_gpio(-1, ARRAY_SIZE(cf_e380ac_v1_leds_gpio),

cf_e380ac_v1_leds_gpio);

}

MIPS_MACHINE(ATH79_MACH_TL_WR881N_V1, "TL-WR881N-V1", "TP-LINK TL-WR881N v1", cf_e380ac_v1_setup);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原贴 http://www.right.com.cn/forum/thread-91571-1-1.html 20120905版4M固件: 1. 720N固件,基于703N修改。TP-Link原厂固件请刷factory,已经是OpenWrt了就刷sysupgrade。 且刷此固件后可直刷OpenWrt 703N、OpenWrt 720N、TP-Link 703N、TP-Link 720N固件,不用改固件头。 2. 4M固件,当然8M的flash也可以刷。 3. 支持MentoHUST(锐捷认证)、3G、NAS(仅支持ext4,不支持ntfs)、共享手机网络、MWAN2负载均衡、打印服务器、 远程唤醒、8187 3070、瑞银网卡,剩余200多K空间,具体见截图。 因试过4M空间集成脱机、NAS等有难度,故不再出4M的脱机固件,请用extroot扩展后自行安装。 4. MentoHUST没有条件测试,如不能自动获取IP,请把Web界面的DHCP script的值由“udhcpc -i”改成“udhcpc -renew”试试。 5. 关于extroot(既用U盘引导系统),没想到现在这么简单了。 简单说下:先把U盘在电脑里格式化成ext3或ext4。插上U盘,命令行运行blkid得到U盘的UUID值,复制到管理界面的相应UUID, 挂载选项“rw,sync”删掉后面的umask=000。然后勾上extroot和启用,文件系统选对应的ext3或ext4,保存应用OK。 重启下,看看剩余空间大了没,呵呵。 (umask=000只是为了让samba可写而加的参数。挂载USB存储设备时,如果不用samba请删之。) 6. 按住reset键30秒后led闪烁,60秒之前松开reset键则恢复出厂设置。 7. LAN/WAN两个网口正常。 8. 默认开启WiFi,无密码。 9. 支持模式切换开关,定义如下: AP: 开启共享手机网络、开启无线 3G: 关闭共享手机网络、开启无线 Router:关闭共享手机网络、关闭无线 10.解释下共享手机网络,OpenWrt官方称为USB Tethering,指openwrt路由器通过USB连接智能手机, 而智能手机的网络共享给openwrt使用。 目前固件支持Android系统共享网络功能,而支持iPhone需要集成的软件太多,空间有限,如果出8M固件 再考虑吧。 Android本来就支持WiFi热点,可能有点画蛇添足吧,呵呵。我是偶然发现openwrt支持这个功能, 所以就研究了下,也许在某些情况下这个功能还是有用的吧。 使用方法: a. 路由器模式开关切换至AP位置。 b. 用USB线连接路由器与手机。 c. 手机USB连接管理里面,选择 除了“内存卡读取”的其他模式,比如:选择“仅充电”; 然后在“设置”--“系统”里面找到“共享手机网络”,开启“USB绑定”就好了。 回到openwrt界面,会发现有个usb0的接口,已经自动获取了IP,这样openwrt就能使用手机 的网络了。 11.关于MWAN2负载均衡,效率还不错,还支持基于session的负载均衡,使用方法见/etc/config/mwan2里面的注释。 mwan2的作者新出了mwan3,有兴趣可以去看看:https://forum.openwrt.org/viewtopic.php?id=39052 12.703n可刷本固件,但是刷完后lan口不能用。需先用无线连接,然后编辑/etc/config/network , 删除其中wan口配置,把lan的eth0改成eth1后,lan就可以用了。 如703n原厂固件web界面请刷factory,且需要先把固件标识改成07030101才能刷。 13.再说下打印服务器,没有测试,不知道这个版本能不能用,但20120803版有人试过可用,有需求请自行下载。 trunk就是不稳定啊,没办法~~
20120905版4M固件: 1. 720N固件,基于703N修改。TP-Link原厂固件请刷factory,已经是OpenWrt了就刷sysupgrade。 且刷此固件后可直刷OpenWrt 703N、OpenWrt 720N、TP-Link 703N、TP-Link 720N固件,不用改固件头。 2. 4M固件,当然8M的flash也可以刷。 3. 支持MentoHUST(锐捷认证)、3G、NAS(仅支持ext4,不支持ntfs)、共享手机网络、MWAN2负载均衡、打印服务器、 远程唤醒、8187 3070、瑞银网卡,剩余200多K空间,具体见截图。 因试过4M空间集成脱机、NAS等有难度,故不再出4M的脱机固件,请用extroot扩展后自行安装。 4. MentoHUST没有条件测试,如不能自动获取IP,请把Web界面的DHCP script的值由“udhcpc -i”改成“udhcpc -renew”试试。 5. 关于extroot(既用U盘引导系统),没想到现在这么简单了。 简单说下:先把U盘在电脑里格式化成ext3或ext4。插上U盘,命令行运行blkid得到U盘的UUID值,复制到管理界面的相应UUID, 挂载选项“rw,sync”删掉后面的umask=000。然后勾上extroot和启用,文件系统选对应的ext3或ext4,保存应用OK。 重启下,看看剩余空间大了没,呵呵。 (umask=000只是为了让samba可写而加的参数。挂载USB存储设备时,如果不用samba请删之。) 6. 按住reset键30秒后led闪烁,60秒之前松开reset键则恢复出厂设置。 7. LAN/WAN两个网口正常。 8. 默认开启WiFi,无密码。 9. 支持模式切换开关,定义如下: AP: 开启共享手机网络、开启无线 3G: 关闭共享手机网络、开启无线 Router:关闭共享手机网络、关闭无线 10.解释下共享手机网络,OpenWrt官方称为USB Tethering,指openwrt路由器通过USB连接智能手机, 而智能手机的网络共享给openwrt使用。 目前固件支持Android系统共享网络功能,而支持iPhone需要集成的软件太多,空间有限,如果出8M固件 再考虑吧。 Android本来就支持WiFi热点,可能有点画蛇添足吧,呵呵。我是偶然发现openwrt支持这个功能, 所以就研究了下,也许在某些情况下这个功能还是有用的吧。 使用方法: a. 路由器模式开关切换至AP位置。 b. 用USB线连接路由器与手机。 c. 手机USB连接管理里面,选择 除了“内存卡读取”的其他模式,比如:选择“仅充电”; 然后在“设置”--“系统”里面找到“共享手机网络”,开启“USB绑定”就好了。 回到openwrt界面,会发现有个usb0的接口,已经自动获取了IP,这样openwrt就能使用手机 的网络了。 11.关于MWAN2负载均衡,效率还不错,还支持基于session的负载均衡,使用方法见/etc/config/mwan2里面的注释。 mwan2的作者新出了mwan3,有兴趣可以去看看:https://forum.openwrt.org/viewtopic.php?id=39052 12.703n可刷本固件,但是刷完后lan口不能用。需先用无线连接,然后编辑/etc/config/network , 删除其中wan口配置,把lan的eth0改成eth1后,lan就可以用了。 如703n原厂固件web界面请刷factory,且需要先把固件标识改成07030101才能刷。 13.再说下打印服务器,没有测试,不知道这个版本能不能用,但20120803版有人试过可用,有需求请自行下载。trunk就是不稳定啊, 没办法~~ 14.刷机有风险,变砖本人概不负责。 吐糟一下,如3G有掉线问题,请看日志中是否出现“No response to 5 echo-requests”。 而解决这个问题,除了降低无线功率或者干脆关闭无线外,我是没找到其他更好的办法(可能和3G网卡有关)。 曾经尝试过换电源增强供电、用带外接电源的usb-hub,包括尝试TP-LINK原厂固件也一样掉线。还有修改/etc/ppp/options里 的lcp-echo-interval,把值改大点后是不掉线了,但是3G其实已经断流了,没什么意义。我用MU350网卡试过FW300R、FWR171-3G 还有720N这几个路由都是这样。不知道是TP-Link设计问题,还是td-scdma这种垃圾芯片功率过高的问题,或者Atheros芯片 的设计缺陷? 百撕不得骑姐啊!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值