mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-08-24 00:28:04 +03:00
It seems that the comgt package does not handle the Huawei 3G USB dongle E176 correctly (and probably other Huawei dongles too). My dongle appears as ID 12d1:1001 Huawei Technologies Co., Ltd. E620 USB Modem and 3G/UMTS connections work well. However, no connection is established if only 2G/GPRS is available: the pppd chat script fails with NO CARRIER although the dongle is registered to the network (via 2G). As outlined in this wiki or this blog, Huawei chips use the AT^SYSCFG command to set 2G or 3G mode, which is not implemented in comgt at the moment. Thus I wrote a patch for /lib/network/3g.sh which adds support for the "service" option in the network configuration with Huawei dongles. By default (if no "service" option is specified) also 2G is used when 3G is unavailable. The Huawei dongle is detected analogously to other chips (the output of gcom -d /dev/ttyUSB0 -s /etc/gcom/getcardinfo.gcom is scanned for huawei). Some further information: The AT^SYSCFG command seems to be respected only once after the dongle is attached (or after the host is powered up). Resetting the dongle seems to render the serial port unusable in some cases. However, the patch sets a useful mode by default which should cover most use cases (3G preferred, but 2G allowed) and if 3G-only or 2G-only mode is required the device can be power cycled. git-svn-id: svn://svn.openwrt.org/openwrt/trunk@33212 3c298f89-4303-0410-b956-a3cf2f4a3e73
98 lines
2.0 KiB
Bash
98 lines
2.0 KiB
Bash
#!/bin/sh
|
|
INCLUDE_ONLY=1
|
|
|
|
. ../netifd-proto.sh
|
|
. ./ppp.sh
|
|
init_proto "$@"
|
|
|
|
proto_3g_init_config() {
|
|
no_device=1
|
|
available=1
|
|
ppp_generic_init_config
|
|
proto_config_add_string "device"
|
|
proto_config_add_string "apn"
|
|
proto_config_add_string "service"
|
|
proto_config_add_string "pincode"
|
|
}
|
|
|
|
proto_3g_setup() {
|
|
local interface="$1"
|
|
local chat
|
|
|
|
json_get_var device device
|
|
json_get_var apn apn
|
|
json_get_var service service
|
|
json_get_var pincode pincode
|
|
|
|
[ -e "$device" ] || {
|
|
proto_set_available "$interface" 0
|
|
return 1
|
|
}
|
|
|
|
case "$service" in
|
|
cdma|evdo)
|
|
chat="/etc/chatscripts/evdo.chat"
|
|
;;
|
|
*)
|
|
chat="/etc/chatscripts/3g.chat"
|
|
cardinfo=$(gcom -d "$device" -s /etc/gcom/getcardinfo.gcom)
|
|
if echo "$cardinfo" | grep -q Novatel; then
|
|
case "$service" in
|
|
umts_only) CODE=2;;
|
|
gprs_only) CODE=1;;
|
|
*) CODE=0;;
|
|
esac
|
|
export MODE="AT\$NWRAT=${CODE},2"
|
|
elif echo "$cardinfo" | grep -q Option; then
|
|
case "$service" in
|
|
umts_only) CODE=1;;
|
|
gprs_only) CODE=0;;
|
|
*) CODE=3;;
|
|
esac
|
|
export MODE="AT_OPSYS=${CODE}"
|
|
elif echo "$cardinfo" | grep -q "Sierra Wireless"; then
|
|
SIERRA=1
|
|
elif echo "$cardinfo" | grep -q huawei; then
|
|
case "$service" in
|
|
umts_only) CODE="14,2";;
|
|
gprs_only) CODE="13,1";;
|
|
*) CODE="2,2";;
|
|
esac
|
|
export MODE="AT^SYSCFG=${CODE},3FFFFFFF,2,4"
|
|
fi
|
|
|
|
if [ -n "$pincode" ]; then
|
|
PINCODE="$pincode" gcom -d "$device" -s /etc/gcom/setpin.gcom || {
|
|
proto_notify_error "$interface" PIN_FAILED
|
|
proto_block_restart "$interface"
|
|
return 1
|
|
}
|
|
fi
|
|
[ -n "$MODE" ] && gcom -d "$device" -s /etc/gcom/setmode.gcom
|
|
|
|
# wait for carrier to avoid firmware stability bugs
|
|
[ -n "$SIERRA" ] && {
|
|
gcom -d "$device" -s /etc/gcom/getcarrier.gcom || return 1
|
|
}
|
|
;;
|
|
esac
|
|
|
|
connect="${apn:+USE_APN=$apn }/usr/sbin/chat -t5 -v -E -f $chat"
|
|
ppp_generic_setup "$interface" \
|
|
noaccomp \
|
|
nopcomp \
|
|
novj \
|
|
nobsdcomp \
|
|
noauth \
|
|
lock \
|
|
crtscts \
|
|
115200 "$device"
|
|
return 0
|
|
}
|
|
|
|
proto_3g_teardown() {
|
|
proto_kill_command "$interface"
|
|
}
|
|
|
|
add_protocol 3g
|