Hi,
I had issue with OpenWRT 14.07 and the HSO driver. It seems that rfkill has been disabled by default in this version of OpenWRT. Making my own image with rfkill enabled (USE_RFKILL in Global build settings), I managed to have my modem working on TP-WR710N. I tested that also on my WR1043ND and to my surprise i had an error using hso and rfkill, i was missing input-core but it is not listed as a dependency.
I made modification to hso connection scripts. The network mode can be selected ( GSM or UMTS ). The PDP context used is # 2 so the modem GPS can use PDP context # 1 for A-GPS connection. The modem connection log can be viewed with logread. chat is still used for the connection.
To know if hso in the comgt package, i like to add hso to PKG_RELEASE in the makefile. I haven't tested authentication. The patch need to be applied in the comgt package directory ( package/comgt for 12.09 or package/network/utils/comgt 14.07)
diff --git a/Makefile b/Makefile
index 5324903..98c8502 100644
--- a/Makefile
+++ b/Makefile
@@ -50,7 +50,10 @@ define Package/comgt/install
$(INSTALL_DIR) $(1)/etc/chatscripts
$(INSTALL_DATA) ./files/3g.chat $(1)/etc/chatscripts/3g.chat
$(INSTALL_DATA) ./files/evdo.chat $(1)/etc/chatscripts/evdo.chat
+ $(INSTALL_DATA) ./files/hso.chat $(1)/etc/chatscripts/hso.chat
+ $(INSTALL_DATA) ./files/hsohup.chat $(1)/etc/chatscripts/hsohup.chat
$(INSTALL_DIR) $(1)/etc/gcom
+ $(INSTALL_DATA) ./files/setuser.gcom $(1)/etc/gcom/setuser.gcom
$(INSTALL_DATA) ./files/setpin.gcom $(1)/etc/gcom/setpin.gcom
$(INSTALL_DATA) ./files/setmode.gcom $(1)/etc/gcom/setmode.gcom
$(INSTALL_DATA) ./files/getcardinfo.gcom $(1)/etc/gcom/getcardinfo.gcom
@@ -62,6 +65,7 @@ define Package/comgt/install
$(INSTALL_DATA) ./files/3g.usb $(1)/etc/hotplug.d/tty/30-3g
$(INSTALL_DIR) $(1)/lib/netifd/proto
$(INSTALL_BIN) ./files/3g.sh $(1)/lib/netifd/proto/3g.sh
+ $(INSTALL_BIN) ./files/hso.sh $(1)/lib/netifd/proto/hso.sh
endef
$(eval $(call BuildPackage,comgt))
diff --git a/files/hso.chat b/files/hso.chat
new file mode 100644
index 0000000..cb87d5a
--- /dev/null
+++ b/files/hso.chat
@@ -0,0 +1,13 @@
+ABORT BUSY
+ABORT 'NO CARRIER'
+ABORT ERROR
+REPORT CONNECT
+TIMEOUT 10
+"" "ATZ"
+OK 'AT+CGDCONT=2,"IP","$USE_APN"'
+SAY "Service Mode $MODE"
+TIMEOUT 30
+OK "AT_OPSYS=$MODE,2"
+OK "AT_OWANCALL=2,1,0"
+OK "\d\d\d\d\d\dAT_OWANDATA=2"
+OK ""
diff --git a/files/hso.sh b/files/hso.sh
new file mode 100644
index 0000000..05ff818
--- /dev/null
+++ b/files/hso.sh
@@ -0,0 +1,137 @@
+#!/bin/sh
+INCLUDE_ONLY=1
+
+. ../netifd-proto.sh
+init_proto "$@"
+
+proto_hso_init_config() {
+
+ no_device=1
+ available=1
+
+ proto_config_add_string "device"
+ proto_config_add_string "maxwait"
+ proto_config_add_string "apn"
+ proto_config_add_string "pincode"
+ proto_config_add_int "mtu"
+ proto_config_add_string "username"
+ proto_config_add_string "password"
+ proto_config_add_string "ifname"
+}
+
+
+proto_hso_setup() {
+
+ local iface="$1"
+ local chat="/etc/chatscripts/hso.chat"
+
+ json_get_var device device
+ json_get_var maxwait maxwait
+ maxwait=${maxwait:-20}
+ while [ ! -e "$device" -a $maxwait -gt 0 ];do # wait for driver loading to catch up
+ maxwait=$(($maxwait - 1))
+ sleep 1
+ done
+
+ json_get_var apn apn
+ json_get_var pincode pincode
+ json_get_var mtu mtu
+ json_get_var service service
+ json_get_var username username
+ json_get_var password password
+ json_get_type ifnametype ifname
+
+ if [ "$ifnametype" = "array" ]
+ then
+ json_select ifname
+ json_get_var ifname 1
+ json_select ".."
+ fi
+
+ if [ "$ifnametype" = "string" ]
+ then
+ json_get_var ifname ifname
+ fi
+
+ # set pin if configured
+ if [ ! -z "$pincode" ]
+ then
+ PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
+ echo "$iface (hso): Failed to set the PIN code."
+ proto_notify_error "$iface" PIN_FAILED
+ return 1
+ }
+ fi
+
+ # set username and password if configured
+ if [ -n "$username" -a -n "$password" ]
+ then
+ USER="$username" PASS="$password" gcom -d "$device" -s /etc/gcom/setuser.gcom || {
+ echo "$iface (hso): Failed to set username and password."
+ proto_notify_error "$iface" AUTH_FAILED
+ return 1
+ }
+ fi
+
+
+ case "$service" in
+ umts_only) service_mode=1;;
+ gprs_only) service_mode=0;;
+ *) service_mode=3;;
+ esac
+
+ local pip counter
+ local outputfile="/tmp/hsoout.$$"
+ while [ -z "$pip" -a "$counter" != "---------------" ]
+ do
+ sleep 2
+ rm -f $outputfile
+ ( USE_APN=$apn MODE=$service_mode /usr/sbin/chat -E -v -V -f $chat <$device > $device ) 2> $outputfile
+ iserror=`grep '^ERROR' $outputfile`
+ if [ -z "$iserror" ]
+ then
+ pip="`grep '^_OWANDATA' $outputfile | cut -d, -f2`"
+ gw="`grep '^_OWANDATA' $outputfile | cut -d, -f3`"
+ ns1="`grep '^_OWANDATA' $outputfile | cut -d, -f4`"
+ ns2="`grep '^_OWANDATA' $outputfile | cut -d, -f5`"
+ fi
+
+ counter="${counter}-"
+ done
+
+ rm -f $outputfile
+
+ if [ -z $pip ]
+ then
+ echo "$iface (hso): Failed to connect and obtain IP address."
+ return 1
+ fi
+
+ proto_init_update $ifname 1
+ proto_set_keep 1
+ proto_add_ipv4_address "$pip" 32
+ proto_add_dns_server "$ns1"
+ proto_add_dns_server "$ns2"
+ proto_add_ipv4_route "0.0.0.0" 0 $gw
+ proto_add_data
+ json_add_string "ppp-type" "hso"
+ proto_close_data
+ proto_send_update "$iface"
+
+ touch /var/run/$ifname.pid
+}
+
+
+proto_hso_teardown() {
+
+ local config="$1"
+ local chat="/etc/chatscripts/hsohup.chat"
+
+ json_get_var device device
+ /usr/sbin/chat -v -f $chat <$device > $device
+
+
+ killall gcom >/dev/null 2>/dev/null
+}
+
+add_protocol hso
diff --git a/files/hsohup.chat b/files/hsohup.chat
new file mode 100644
index 0000000..9e82183
--- /dev/null
+++ b/files/hsohup.chat
@@ -0,0 +1,8 @@
+ABORT BUSY
+ABORT 'NO CARRIER'
+ABORT ERROR
+REPORT CONNECT
+SAY "Hanging up..."
+TIMEOUT 30
+"" "AT_OWANCALL=2,0"
+OK ""
diff --git a/files/setuser.gcom b/files/setuser.gcom
new file mode 100644
index 0000000..511d90b
--- /dev/null
+++ b/files/setuser.gcom
@@ -0,0 +1,29 @@
+# set username and password
+opengt
+ set com 115200n81
+ set senddelay 0.02
+ waitquiet 1 0.2
+ flash 0.1
+
+:start
+ print "Trying to set username and password\n"
+ send "AT$QCPDPP=1,1,"
+ send $env("USER")
+ send ","
+ send $env("PASS")
+ send "^m"
+
+ waitfor 15 "OK","ERR","ERROR"
+ if % = 0 goto continue
+ if % = 1 goto modeerror
+ if % = 2 goto modeerror
+
+ print "Timeout setting username and password!\n"
+ exit 1
+
+:modeerror
+ print "Error setting username and password!\n"
+ exit 1
+
+:continue
+ exit 0
The LuCI configuration interface that goes with this is base on http://git.openwrt.org/project/luci.git. You can changed which luci you are using on OpenWRT 12.09 by editing the LuCI repository in feeds.conf.default. The following patch adds luci-proto-hso package to LuCI protocols list. The patch need to be applied in feeds/luci directory, using svn doesn't work.
diff --git a/contrib/package/luci/Makefile b/contrib/package/luci/Makefile
index 5ee13d4..9154121 100644
--- a/contrib/package/luci/Makefile
+++ b/contrib/package/luci/Makefile
@@ -192,6 +192,7 @@ endef
$(eval $(call protocol,ppp,Support for PPP/PPPoE/PPPoA/PPtP))
$(eval $(call protocol,ipv6,Support for DHCPv6/6in4/6to4/6rd/DS-Lite))
$(eval $(call protocol,3g,Support for 3G,+PACKAGE_luci-proto-3g:comgt))
+$(eval $(call protocol,hso,Support for hso,+PACKAGE_luci-proto-hso:comgt +PACKAGE_luci-proto-hso:kmod-usb-net-hso))
$(eval $(call protocol,relay,Support for relayd pseudo bridges,+PACKAGE_luci-proto-relay:relayd))
diff --git a/protocols/hso/Makefile b/protocols/hso/Makefile
new file mode 100644
index 0000000..f7fac77
--- /dev/null
+++ b/protocols/hso/Makefile
@@ -0,0 +1,2 @@
+include ../../build/config.mk
+include ../../build/module.mk
diff --git a/protocols/hso/luasrc/model/cbi/admin_network/proto_hso.lua b/protocols/hso/luasrc/model/cbi/admin_network/proto_hso.lua
new file mode 100644
index 0000000..1515df1
--- /dev/null
+++ b/protocols/hso/luasrc/model/cbi/admin_network/proto_hso.lua
@@ -0,0 +1,158 @@
+--[[
+LuCI - Lua Configuration Interface
+
+Copyright 2011 Jo-Philipp Wich <xm@subsignal.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+]]--
+
+local map, section, net = ...
+
+local hsoname,hsotype,hsointerface
+local device, apn, service, pincode, username, password
+local ipv6, maxwait, defaultroute, metric, peerdns, dns,
+ keepalive_failure, keepalive_interval, demand
+
+
+device = section:taboption("general", Value, "device", translate("Control interface"))
+device.rmempty = false
+
+local device_suggestions = nixio.fs.glob("/dev/ttyHS*")
+ or nixio.fs.glob("/dev/tts/*")
+
+if device_suggestions then
+ local node
+ for node in device_suggestions do
+ hsoname = string.gsub(node,"/dev/","")
+ hsotype = nixio.fs.readfile("/sys/class/tty/" .. hsoname .. "/hsotype")
+ device:value(node, hsotype .. " (" .. node ..")" )
+ if string.find(hsotype,"Application") ~= nil then
+ device.default = node
+ end
+ end
+end
+
+
+service = section:taboption("general", Value, "service", translate("Service Type"))
+service.default = "umts"
+service:value("umts", "UMTS/GPRS")
+service:value("umts_only", translate("UMTS only"))
+service:value("gprs_only", translate("GPRS only"))
+
+
+apn = section:taboption("general", Value, "apn", translate("APN"))
+
+
+pincode = section:taboption("general", Value, "pincode", translate("PIN"))
+
+
+username = section:taboption("general", Value, "username", translate("PAP/CHAP username"))
+
+
+password = section:taboption("general", Value, "password", translate("PAP/CHAP password"))
+password.password = true
+
+
+if luci.model.network:has_ipv6() then
+
+ ipv6 = section:taboption("advanced", Flag, "ipv6",
+ translate("Enable IPv6 negotiation on the PPP link"))
+
+ ipv6.default = ipv6.disabled
+
+end
+
+
+maxwait = section:taboption("advanced", Value, "maxwait",
+ translate("Modem init timeout"),
+ translate("Maximum amount of seconds to wait for the modem to become ready"))
+
+maxwait.placeholder = "20"
+maxwait.datatype = "min(1)"
+
+
+defaultroute = section:taboption("advanced", Flag, "defaultroute",
+ translate("Use default gateway"),
+ translate("If unchecked, no default route is configured"))
+
+defaultroute.default = defaultroute.enabled
+
+
+metric = section:taboption("advanced", Value, "metric",
+ translate("Use gateway metric"))
+
+metric.placeholder = "0"
+metric.datatype = "uinteger"
+metric:depends("defaultroute", defaultroute.enabled)
+
+
+peerdns = section:taboption("advanced", Flag, "peerdns",
+ translate("Use DNS servers advertised by peer"),
+ translate("If unchecked, the advertised DNS server addresses are ignored"))
+
+peerdns.default = peerdns.enabled
+
+
+dns = section:taboption("advanced", DynamicList, "dns",
+ translate("Use custom DNS servers"))
+
+dns:depends("peerdns", "")
+dns.datatype = "ipaddr"
+dns.cast = "string"
+
+
+keepalive_failure = section:taboption("advanced", Value, "_keepalive_failure",
+ translate("LCP echo failure threshold"),
+ translate("Presume peer to be dead after given amount of LCP echo failures, use 0 to ignore failures"))
+
+function keepalive_failure.cfgvalue(self, section)
+ local v = m:get(section, "keepalive")
+ if v and #v > 0 then
+ return tonumber(v:match("^(%d+)[ ,]+%d+") or v)
+ end
+end
+
+function keepalive_failure.write() end
+function keepalive_failure.remove() end
+
+keepalive_failure.placeholder = "0"
+keepalive_failure.datatype = "uinteger"
+
+
+keepalive_interval = section:taboption("advanced", Value, "_keepalive_interval",
+ translate("LCP echo interval"),
+ translate("Send LCP echo requests at the given interval in seconds, only effective in conjunction with failure threshold"))
+
+function keepalive_interval.cfgvalue(self, section)
+ local v = m:get(section, "keepalive")
+ if v and #v > 0 then
+ return tonumber(v:match("^%d+[ ,]+(%d+)"))
+ end
+end
+
+function keepalive_interval.write(self, section, value)
+ local f = tonumber(keepalive_failure:formvalue(section)) or 0
+ local i = tonumber(value) or 5
+ if i < 1 then i = 1 end
+ if f > 0 then
+ m:set(section, "keepalive", "%d %d" %{ f, i })
+ else
+ m:del(section, "keepalive")
+ end
+end
+
+keepalive_interval.remove = keepalive_interval.write
+keepalive_interval.placeholder = "5"
+keepalive_interval.datatype = "min(1)"
+
+
+demand = section:taboption("advanced", Value, "demand",
+ translate("Inactivity timeout"),
+ translate("Close inactive connection after the given amount of seconds, use 0 to persist connection"))
+
+demand.placeholder = "0"
+demand.datatype = "uinteger"
diff --git a/protocols/hso/luasrc/model/network/proto_hso.lua b/protocols/hso/luasrc/model/network/proto_hso.lua
new file mode 100644
index 0000000..5323e83
--- /dev/null
+++ b/protocols/hso/luasrc/model/network/proto_hso.lua
@@ -0,0 +1,59 @@
+--[[
+LuCI - Network model - 3G, PPP, PPtP, PPPoE and PPPoA protocol extension
+
+Copyright 2011 Jo-Philipp Wich <xm@subsignal.org>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+]]--
+
+local netmod = luci.model.network
+
+local _, p
+
+local proto = netmod:register_protocol("hso")
+
+function proto.ifname(self)
+ return "hso-" .. self.sid
+end
+
+function proto.get_i18n(self)
+ return luci.i18n.translate("HSO")
+end
+
+function proto.opkg_package(self)
+ return "comgt"
+end
+
+function proto.is_installed(self)
+ return nixio.fs.access("/lib/netifd/proto/hso.sh")
+end
+
+function proto.is_floating(self)
+ return false
+end
+
+function proto.is_virtual(self)
+ return false
+end
+
+function proto.get_interfaces(self)
+ return netmod.protocol.get_interfaces(self)
+end
+
+function proto.contains_interface(self, ifc)
+ return netmod.protocol.contains_interface(self, ifc)
+end
+
+netmod:register_pattern_virtual("^hso-%%w")
+
I may look to submit those patches for integration after people have tested them.
A sample of configuration in /etc/config/network
config interface 'wwan'
option proto 'hso'
option ifname 'hso0'
option device '/dev/ttyHS3'
option service 'umts'
option apn '<APN>'
option pincode '<PIN>'
(Last edited by Kyklas on 12 Oct 2014, 23:40)