找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 20161|回复: 43

【LEDE可用】完美的NETGEAR主题,兼容手机浏览器

  [复制链接]
发表于 2017-11-11 00:39 | 显示全部楼层 |阅读模式
本帖最后由 liu_geng 于 2017-11-11 09:46 编辑

我的路由器是WNDR3800,刷了明月的LEDE Reboot 17.01-SNAPSHOT r3498-dc8392f
非常喜欢自带的NETGEAR主题,但是美中不足的是这个主题有几个小小的BUG:
1,右上角的重启退出按钮没考虑到移动设备的布局问题,在手机上显示错位。
2,无法正常显示交换机端口状况。
3,登录界面有默认密码提示,修改了初始密码之后仍然会显示。
4,其它一些字体,布局方面的不太完美。

今天偶然发现有大神制作的ATMaterial主题,界面显示非常完美,于是我下载安装了这个主题,然后提取了这个主题的源码分析了一下,将明月系统自带的NETGEAR主题进行了修复,修复之后的显示效果如下:

Netgear主题.png
端口状态.png
登录界面.png

手机上显示效果如下:
Screenshot_2017-11-10-23-57-22-299_com.UCMobile.png
Screenshot_2017-11-10-23-59-18-113_com.UCMobile.png
Screenshot_2017-11-10-23-59-49-064_com.UCMobile.png

使用方法:
将附件下载解压之后,用winSCP上传到相应的目录下,覆盖原文件,替换之前一定记得先备份原文件
一共有四个文件需要替换,文件列表如下:
/usr/lib/lua/luci/view/theme/netgear/header.htm 主要是去除右上角的重启退出两个按钮,将其添加到菜单里面。
/www/luci-static/netgear/css/style.css 主要也是一些布局和字体的问题。

/usr/lib/lua/luci/i18n/base.zh-cn.lmo 这是一个语言文件,目的是去除登录页面上的默认密码提示。
/usr/lib/lua/luci/view/mwan/openwrt_overview_status.htm 修复了状态页面右上角两个按钮的布局位置。

一般来说只需要替换前两个主题文件就可以,主题文件跟系统版本无关,理论上适用于所有的LEDE,之前的OP BB CC等系统未测试。
后面两个文件是系统文件,我修改的这两个文件可能只适用于明月的WNDR3800的固件。其它版本的固件也许不能用,请自行测试。

替换之前一定要备份原文件,以防万一,如果替换之后无法正常显示,直接用原文件替换回去就可以恢复了。


如果你的LEDE系统没有安装NETGEAR主题,你可以用压缩包内的所有文件替换任意一个主题文件夹内的同名文件,然后重新选择这个主题即可。

Netgear主题修复补丁.rar (237.79 KB, 下载次数: 475, 售价: 1 nb恩山币)

我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-27 14:33 | 显示全部楼层
本帖最后由 hello_limin 于 2017-11-29 13:13 编辑
rapistor 发表于 2017-11-23 10:57
支持楼主,我来学习一下。

相关代码在此,

  1. /*
  2. *  TP-LINK TL-WR881N v1 board support
  3. *
  4. *  Copyright (C) 2016 Alexander Wang <limin2016@yahoo.com>
  5. *  Copyright (C) 2015 Weijie Gao <hackpacsal@gmail.com>
  6. *  Copyright (C) 2008-2009 Gabor Juhos <juhosg@openwrt.org>
  7. *
  8. *  This program is free software; you can redistribute it and/or modify it
  9. *  under the terms of the GNU General Public License version 2 as published
  10. *  by the Free Software Foundation.
  11. */

  12. #include <linux/pci.h>
  13. #include <linux/phy.h>
  14. #include <linux/gpio.h>
  15. #include <linux/delay.h>
  16. #include <linux/mtd/mtd.h>
  17. #include <linux/mtd/partitions.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/ath9k_platform.h>
  20. #include <linux/ar8216_platform.h>

  21. #include <asm/mach-ath79/ath79.h>
  22. #include <asm/mach-ath79/ar71xx_regs.h>

  23. #include "pci.h"
  24. #include "common.h"
  25. #include "dev-ap9x-pci.h"
  26. #include "dev-eth.h"
  27. #include "dev-gpio-buttons.h"
  28. #include "dev-leds-gpio.h"
  29. #include "dev-m25p80.h"
  30. #include "dev-spi.h"
  31. #include "dev-wmac.h"
  32. #include "machtypes.h"

  33. #define WR881NV1_GPIO_LED_WLAN  12
  34. #define WR881NV1_GPIO_LED_SYSTEM  19
  35. #define WR881NV1_GPIO_LED_WPS 15

  36. #define WR881NV1_GPIO_BTN_RESET 16

  37. #define WR881NV1_KEYS_POLL_INTERVAL 20        /* msecs */
  38. #define WR881NV1_KEYS_DEBOUNCE_INTERVAL (3 * WR881NV1_KEYS_POLL_INTERVAL)

  39. #define ATH_MII_MGMT_CMD  0x24
  40. #define ATH_MGMT_CMD_READ 0x1

  41. #define ATH_MII_MGMT_ADDRESS  0x28
  42. #define ATH_ADDR_SHIFT  8

  43. #define ATH_MII_MGMT_CTRL 0x2c
  44. #define ATH_MII_MGMT_STATUS 0x30

  45. #define ATH_MII_MGMT_IND  0x34
  46. #define ATH_MGMT_IND_BUSY (1 << 0)
  47. #define ATH_MGMT_IND_INVALID  (1 << 2)

  48. #define WR881NV1_WMAC_CALDATA_OFFSET  0x1000

  49. #define QCA955X_ETH_CFG_GMAC0_EN  BIT(1)
  50. #define QCA955X_ETH_CFG_GMAC0_SLAVE BIT(4)

  51. static const char *wr881nv1_part_probes[] = {
  52.         "tp-link",
  53.         NULL,
  54. };

  55. static struct flash_platform_data wr881nv1_flash_data = {
  56.         .part_probes        = wr881nv1_part_probes,
  57. };

  58. static struct gpio_led wr881nv1_leds_gpio[] __initdata = {
  59.         {
  60.                 .name                = "tp-link:green:wps",
  61.                 .gpio                = WR881NV1_GPIO_LED_WPS,
  62.                 .active_low        = 1,
  63.         },
  64.         {
  65.                 .name                = "tp-link:green:system",
  66.                 .gpio                = WR881NV1_GPIO_LED_SYSTEM,
  67.                 .active_low        = 1,
  68.         },
  69.         {
  70.                 .name                = "tp-link:green:wlan",
  71.                 .gpio                = WR881NV1_GPIO_LED_WLAN,
  72.                 .active_low        = 1,
  73.         },
  74. };

  75. static struct gpio_keys_button wr881nv1_gpio_keys[] __initdata = {
  76.         {
  77.                 .desc                = "reset",
  78.                 .type                = EV_KEY,
  79.                 .code                = KEY_RESTART,
  80.                 .debounce_interval = WR881NV1_KEYS_DEBOUNCE_INTERVAL,
  81.                 .gpio                = WR881NV1_GPIO_BTN_RESET,
  82.                 .active_low        = 1,
  83.         },
  84. };

  85. static unsigned long __init ath_gmac_reg_rd(unsigned long reg)
  86. {
  87.         void __iomem *base;
  88.         unsigned long t;

  89.         base = ioremap(AR71XX_GE0_BASE, AR71XX_GE0_SIZE);

  90.         t = __raw_readl(base + reg);

  91.         iounmap(base);

  92.         return t;
  93. }

  94. static void __init ath_gmac_reg_wr(unsigned long reg, unsigned long value)
  95. {
  96.         void __iomem *base;
  97.         unsigned long t = value;

  98.         base = ioremap(AR71XX_GE0_BASE, AR71XX_GE0_SIZE);

  99.         __raw_writel(t, base + reg);

  100.         iounmap(base);
  101. }

  102. static void __init phy_reg_write(unsigned char phy_addr, unsigned char reg, unsigned short data)
  103. {
  104.         unsigned short addr = (phy_addr << ATH_ADDR_SHIFT) | reg;
  105.         volatile int rddata;
  106.         unsigned short ii = 0xFFFF;

  107.         do
  108.         {
  109.                 udelay(5);
  110.                 rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;
  111.         } while (rddata && --ii);

  112.         ath_gmac_reg_wr(ATH_MII_MGMT_ADDRESS, addr);
  113.         ath_gmac_reg_wr(ATH_MII_MGMT_CTRL, data);

  114.         do
  115.         {
  116.                 udelay(5);
  117.                 rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;
  118.         } while (rddata && --ii);
  119. }

  120. static unsigned short __init phy_reg_read(unsigned char phy_addr, unsigned char reg)
  121. {
  122.         unsigned short addr = (phy_addr << ATH_ADDR_SHIFT) | reg, val;
  123.         volatile int rddata;
  124.         unsigned short ii = 0xffff;

  125.         do
  126.         {
  127.                 udelay(5);
  128.                 rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;
  129.         } while (rddata && --ii);

  130.         ath_gmac_reg_wr(ATH_MII_MGMT_CMD, 0x0);
  131.         ath_gmac_reg_wr(ATH_MII_MGMT_ADDRESS, addr);
  132.         ath_gmac_reg_wr(ATH_MII_MGMT_CMD, ATH_MGMT_CMD_READ);

  133.         do
  134.         {
  135.                 udelay(5);
  136.                 rddata = ath_gmac_reg_rd(ATH_MII_MGMT_IND) & 0x1;
  137.         } while (rddata && --ii);

  138.         val = ath_gmac_reg_rd(ATH_MII_MGMT_STATUS);
  139.         ath_gmac_reg_wr(ATH_MII_MGMT_CMD, 0x0);

  140.         return val;
  141. }

  142. static void __init athrs27_reg_write(unsigned int s27_addr, unsigned int s27_write_data)
  143. {
  144.         unsigned int addr_temp;
  145.         unsigned int data;
  146.         unsigned char phy_address, reg_address;

  147.         addr_temp = (s27_addr) >> 2;
  148.         data = addr_temp >> 7;

  149.         phy_address = 0x1f;
  150.         reg_address = 0x10;

  151.         phy_reg_write(phy_address, reg_address, data);

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

  153.         reg_address = (((addr_temp << 1) & 0x1e) | 0x1);
  154.         data = (s27_write_data >> 16) & 0xffff;
  155.         phy_reg_write(phy_address, reg_address, data);

  156.         reg_address = ((addr_temp << 1) & 0x1e);
  157.         data = s27_write_data  & 0xffff;
  158.         phy_reg_write(phy_address, reg_address, data);
  159. }

  160. static unsigned int __init athrs27_reg_read(unsigned int s27_addr)
  161. {
  162.         unsigned int addr_temp;
  163.         unsigned int s27_rd_csr_low, s27_rd_csr_high, s27_rd_csr;
  164.         unsigned int data;
  165.         unsigned char phy_address, reg_address;

  166.         addr_temp = s27_addr >>2;
  167.         data = addr_temp >> 7;

  168.         phy_address = 0x1f;
  169.         reg_address = 0x10;

  170.         phy_reg_write(phy_address, reg_address, data);

  171.         phy_address = (0x17 & ((addr_temp >> 4) | 0x10));
  172.         reg_address = ((addr_temp << 1) & 0x1e);
  173.         s27_rd_csr_low = (unsigned int) phy_reg_read(phy_address, reg_address);

  174.         reg_address = reg_address | 0x1;
  175.         s27_rd_csr_high = (unsigned int) phy_reg_read(phy_address, reg_address);
  176.         s27_rd_csr = (s27_rd_csr_high << 16) | s27_rd_csr_low ;
  177.        
  178.         return (s27_rd_csr);
  179. }

  180. static void __init ar8236_reset(void)
  181. {
  182.         unsigned short i = 30;

  183.         athrs27_reg_write(0x0, athrs27_reg_read(0x0) | 0x80000000);
  184.         while (i--)
  185.         {
  186.                 mdelay(100);
  187.                 if (!(athrs27_reg_read(0x0) & 0x80000000))
  188.                 break;
  189.         }
  190. }

  191. static struct mdio_board_info wr881nv1_mdio0_info[] = {
  192.         {
  193.                 .bus_id = "ag71xx-mdio.0",
  194.                 .phy_addr = 0,
  195.                 .platform_data = NULL,
  196.         },
  197. };

  198. static void __init wr881nv1_setup(void)
  199. {
  200.         u8 *mac = (u8 *) KSEG1ADDR(0x1f01fc00);
  201.         u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
  202.         u8 tmpmac[ETH_ALEN];

  203.         ath79_register_m25p80(&wr881nv1_flash_data);
  204.        
  205.         ath79_register_pci();
  206.        
  207.         ath79_init_mac(tmpmac, mac, 0);
  208.         ath79_register_wmac(art + WR881NV1_WMAC_CALDATA_OFFSET, tmpmac);

  209.         ath79_register_mdio(0, 0x0);
  210.        
  211.         mdiobus_register_board_info(wr881nv1_mdio0_info,
  212.                                     ARRAY_SIZE(wr881nv1_mdio0_info));

  213.         ar8236_reset();
  214.        
  215.         ath79_setup_qca955x_eth_cfg(QCA955X_ETH_CFG_GMAC0_EN | QCA955X_ETH_CFG_GMAC0_SLAVE);
  216.   
  217.         /* WAN */
  218.         ath79_init_mac(ath79_eth0_data.mac_addr, mac, 1);

  219.         /* GMAC0 is connected to the PHY0 of the AR8236 switch, GE0 */
  220.         ath79_eth0_data.phy_if_mode = PHY_INTERFACE_MODE_MII;
  221.         ath79_eth0_data.duplex = DUPLEX_FULL;
  222.         ath79_eth0_data.speed = SPEED_100;
  223.         ath79_eth0_data.phy_mask = BIT(0);
  224.         ath79_eth0_data.mii_bus_dev = &ath79_mdio0_device.dev;
  225.         ath79_register_eth(0);
  226.        
  227.         ath79_register_leds_gpio(-1, ARRAY_SIZE(wr881nv1_leds_gpio),
  228.                                  wr881nv1_leds_gpio);
  229.         ath79_register_gpio_keys_polled(-1, WR881NV1_KEYS_POLL_INTERVAL,
  230.                                         ARRAY_SIZE(wr881nv1_gpio_keys),
  231.                                         wr881nv1_gpio_keys);
  232. }

  233. MIPS_MACHINE(ATH79_MACH_TL_WR881N_V1, "TL-WR881N-v1", "TP-LINK TL-WR881N v1", wr881nv1_setup);
复制代码





我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-11 00:52 | 显示全部楼层
大概说一下这次修复涉及到的几个文件:
/usr/lib/lua/luci/i18n/ 这个目录下修复了base.zh-cn.lmo,这是一个语言文件,目的是去除登录页面上的默认密码提示。
/usr/lib/lua/luci/view/mwan/ 这个目录下修复了openwrt_overview_status.htm,修复了状态页面右上角两个按钮的布局位置。
/usr/lib/lua/luci/view/theme/netgear/ 这个目录下修复了header.htm,主要是去除右上角的重启退出两个按钮,将其添加到菜单里面。
/www/luci-static/netgear/css 这个目录下修复了style.css,主要也是一些布局和字体的问题。
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-22 22:23 | 显示全部楼层
zshwq5 发表于 2017-11-19 15:18
能分享/usr/lib/lua/luci/i18n/base.zh-cn.lmo修改的方法吗?

lmo文件我不知道怎么反编译,我只好用笨办法:用十六进制编辑器直接修改,注意替换的部分字节长度要一样,不足的用空格补齐
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-11 00:59 | 显示全部楼层
另外,如果想从菜单里面去掉“使用提示”的菜单项,只需要删除/usr/lib/lua/luci/controller/user_guide.lua文件即可。
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-11 01:03 | 显示全部楼层
玩的太高端了哦
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-11 01:18 | 显示全部楼层
主题目录是哪里?现在k3用大雕的lede

点评

/usr/lib/lua/luci/view/theme/ /www/luci-static/  详情 回复 发表于 2017-11-11 08:02
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-11 08:02 | 显示全部楼层
M4rWtaer 发表于 2017-11-11 01:18
主题目录是哪里?现在k3用大雕的lede

/usr/lib/lua/luci/view/theme/
/www/luci-static/
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-11 08:18 | 显示全部楼层
这个不错,刚好准备把R8000刷LEDE试试
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-11 09:21 | 显示全部楼层
太高端了
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-11 09:26 | 显示全部楼层
本帖最后由 liu_geng 于 2017-11-22 22:20 编辑

在手机上编辑了一下帖子,结果乱码了,重新码字
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-11 13:00 | 显示全部楼层
明月lede白露版,改后交换机图标还是没出来

点评

字体文件在/www/luci-static/netgear/font/目录下  详情 回复 发表于 2017-11-11 13:50
交换机图标可能还需要替换font目录下的字体文件  详情 回复 发表于 2017-11-11 13:49
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-11 13:49 来自手机 | 显示全部楼层
lanshui402 发表于 2017-11-11 13:00
明月lede白露版,改后交换机图标还是没出来

交换机图标可能还需要替换font目录下的字体文件
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-11 13:50 来自手机 | 显示全部楼层
lanshui402 发表于 2017-11-11 13:00
明月lede白露版,改后交换机图标还是没出来

字体文件在/www/luci-static/netgear/font/目录下
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-19 12:07 | 显示全部楼层
想从菜单里面去掉
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-19 15:11 | 显示全部楼层
捕获.PNG

请问virtual**和宽带监控前面没有图标怎么添加?谢谢~~

点评

没有图标都是因为字体的问题,替换掉字体就可以了  详情 回复 发表于 2017-11-22 22:21
我的恩山、我的无线 The best wifi forum is right here.
发表于 2017-11-19 15:13 | 显示全部楼层
这个支持一下。
我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

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

GMT+8, 2023-9-30 01:20

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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