Hi,
Am 04.12.2011 18:40, schrieb Florian Fainelli:
Hello Mathias,
Le dimanche 04 décembre 2011 18:16:39, Mathias Adam a écrit :
Hi,
I just got OpenWrt running on a Huawei E970 wireless gateway (in my
case, labelled as T-Mobile web'n'walk Box IV).
The device has a Broadcom BCM5354 SoC and a built-in 3G USB modem.
For reference, it has already been addressed in this open ticket:
https://dev.openwrt.org/ticket/2711
However, the device has a hardware watchdog which needs GPIO7 to be
toggled regularly. Otherwise, the device simply resets after 2-3 secs,
so I wasn't even able to boot into OpenWrt at first.
As a quick fix I put together a small kernel patch which adds a timer to
regularly perform the GPIO toggle. While this does work for me, I think
it could need some cleanup... perhaps, is there already an
infrastructure related to platform-/board-specific watchdogs where this
could be attached to?
Are there other devices already supported by OpenWrt with a similar
watchdog?
The MTX-1 board (AMD Alchemy) is using a similar GPIO-based watchdog:
http://lxr.linux.no/#linux+v3.1.4/drivers/watchdog/mtx-1_wdt.c
such a driver could be made generic by the way.
finally, here's a first working state of such a generic driver. I've
used mtx-1_wdt.c as a basis for the new gpio_wdt.c.
Unfortunately, the watchdog timeout on the E970 is only 2-3 seconds, so
that it it already kicks in before all the watchdog drivers are being
loaded normally. Therefore I moved timer setup from .probe into
module_init, and modified drivers/Makefile to get the module loaded at
an earlier time during bootup. However, in order to use it as a generic
driver, I suspect this should be done in a somewhat cleaner way...
In the original firmware, the watchdog setup is being done in the early
platform setup code under arch/mips/. Is it possible to trigger the
gpio_wdt module to be loaded from the platform setup code? That way the
driver itself could be generic and be loaded with the watchdog drivers
on most platforms, while all e970-specific stuff could be done in
platform setup.
Any other advice appreciated.
Regards,
Mathias Adam
diff -rNU3
trunk_org//target/linux/brcm47xx/patches-3.0/-huawei_e970.patch
trunk_e970//target/linux/brcm47xx/patches-3.0/-huawei_e970.patch
--- trunk_org//target/linux/brcm47xx/patches-3.0/-huawei_e970.patch
1970-01-01 01:00:00.0 +0100
+++
trunk_e970//target/linux/brcm47xx/patches-3.0/-huawei_e970.patch
2011-12-14 00:45:44.0 +0100
@@ -0,0 +1,11 @@
+--- a/drivers/Makefile_org 2011-11-11 19:12:24.0 +0100
b/drivers/Makefile 2011-12-07 22:12:11.0 +0100
+@@ -5,6 +5,8 @@
+ # Rewritten to use lists instead of if-statements.
+ #
+
++obj-y += watchdog/gpio_wdt.o
++
+ obj-y += gpio/
+ obj-$(CONFIG_PCI) += pci/
+ obj-$(CONFIG_PARISC) += parisc/
diff -rNU3
trunk_org//target/linux/brcm47xx/files/drivers/watchdog/gpio_wdt.c
trunk_e970//target/linux/brcm47xx/files/drivers/watchdog/gpio_wdt.c
--- trunk_org//target/linux/brcm47xx/files/drivers/watchdog/gpio_wdt.c
1970-01-01 01:00:00.0 +0100
+++ trunk_e970//target/linux/brcm47xx/files/drivers/watchdog/gpio_wdt.c
2011-12-06 11:06:23.0 +0100
@@ -0,0 +1,284 @@
+/*
+ * Driver for the MTX-1 Watchdog.
+ *
+ * (C) Copyright 2005 4G Systems i...@4g-systems.biz,
+ * All Rights Reserved.
+ * http://www.4g-systems.biz
+ *
+ * (C) Copyright 2007 OpenWrt.org, Florian Fainelli flor...@openwrt.org
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * Neither Michael Stickel nor 4G Systems admit liability nor provide
+ * warranty for any of this software. This material is provided
+ * AS-IS and at no charge.
+ *
+ * (c) Copyright 20054G Systems i...@4g-systems.biz
+ *
+ * Release 0.01.
+ * Author: Michael Stickel michael.stic...@4g-systems.biz
+ *
+ * Release 0.02.
+ * Author: Florian Fainelli flor...@openwrt.org
+ * use the Linux watchdog/timer APIs
+ *
+ * The Watchdog is configured to reset the MTX-1
+ * if it is not triggered for 100 seconds.
+ * It should not be triggered more often than 1.6 seconds.
+ *
+ * A timer triggers the watchdog every 5 seconds, until
+ * it is opened for the first time. After the first open
+ * it MUST be triggered every 2..95 seconds.
+ */
+
+#include linux/module.h
+#include linux/moduleparam.h
+#include linux/types.h
+#include linux/errno.h
+#include linux/miscdevice.h
+#include linux/fs.h
+#include linux/init.h
+#include linux/ioport.h
+#include linux/timer.h
+#include