This patch adds support for more sophisticated 3g options for interface type 3g. Even more, it adds /etc/init.d/serialmodem script, which searches all configured devices for modems, creates right links for them and if needed, it will bring ppp interfaces up after modem is found. More info can be found here: https://forum.openwrt.org/viewtopic.php?pid=119396 It adds hotplug script which triggers searching when new usb modem is plugged in.
Signed-off-by: Lukas macura <mac...@opf.slu.cz> --- Index: package/comgt/files/3g.sh =================================================================== --- package/comgt/files/3g.sh (revision 23546) +++ package/comgt/files/3g.sh (working copy) @@ -11,8 +11,8 @@ local device config_get device "$1" device - # try to figure out the device if it's invalid - [ -n "$device" -a -e "$device" ] || { + # try to figure out the device if it's not set + [ -n "$device" ] || { for device in /dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/tts/2 /dev/usb/tts/0 /dev/noz0; do [ -e "$device" ] && { config_set "$1" device "$device" @@ -55,9 +55,41 @@ /sbin/insmod $module 2>&- >&- done + local initstring + config_get initstring "$config" initstring + local apn config_get apn "$config" apn + + local pdptype + config_get pdptype "$config" apnpdptype + [ -z "$pdptype" ] && pdptype="IP" + + local cid + config_get cid "$config" apncid + [ -z "$cid" ] && cid=1 + + local apnextra1 apnextra2 apnextra3 + local pdpaddr + config_get pdpaddr "$config" apnpdpaddr + [ -n "$pdpaddr" ] && apnextra1=',\"'$pdpaddr'\"' + + local dcomp + config_get dcomp "$config" dcomp + [ -n "$dcomp" ] && apnextra2=",$dcomp" + + local hcomp + config_get hcomp "$config" hcomp + [ -n "$hcomp" ] && apnextra3=",$hcomp" + local username pppusername + config_get username "$config" username + [ -n "$username" ] && pppusername="user $username" + + local password ppppassword + config_get password "$config" password + [ -n "$password" ] && ppppassword="password $password" + local service config_get service "$config" service @@ -104,7 +136,7 @@ esac set_3g_led 1 0 0 - config_set "$config" "connect" "${apn:+USE_APN=$apn }/usr/sbin/chat -t5 -v -E -f $chat" + config_set "$config" "connect" "${apn:+USE_APN=$apn } ATEXTRA='$initstring' EXTRA=${apnextra1}${apnextra2}${apnextra3} ${cid:+CID=$cid } ${pdptype:+PDP=$pdptype } /usr/sbin/chat -t5 -v -E -f $chat" start_pppd "$config" \ noaccomp \ nopcomp \ @@ -114,5 +146,6 @@ lock \ crtscts \ ${mtu:+mtu $mtu mru $mtu} \ + $pppusername $ppppassword \ 115200 "$device" } Index: package/comgt/files/serialmodem.hotplug =================================================================== --- package/comgt/files/serialmodem.hotplug (revision 0) +++ package/comgt/files/serialmodem.hotplug (revision 0) @@ -0,0 +1,9 @@ +#!/bin/sh + +case "$ACTION" in + add) + # update LEDs + /etc/init.d/serialmodem start + ;; +esac + Index: package/comgt/files/serialmodem.init =================================================================== --- package/comgt/files/serialmodem.init (revision 0) +++ package/comgt/files/serialmodem.init (revision 0) @@ -0,0 +1,231 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2006 OpenWrt.org + +START=95 + +myname=serialmodem + +. /etc/functions.sh +config_load $myname + +log1 () { + [ "$debug" -ge "1" ] && logger -t "$myname" $logparm $* +} +log2 () { + [ "$debug" -ge "2" ] && logger -t "$myname" $logparm $* +} +log () { + logger -t "$myname" $logparm $* +} + +shortdev () { + echo $1 | tr '/' '_' +} + +setstate () { + uci -q -P /var/state set serialmodem.$1 +} +getstate () { + uci -q -P /var/state get serialmodem.$1 +} + +open_port () { + local dev=$(shortdev $1) + setstate ${dev}=group + if [ "$(getstate ${dev}.found)" = "1" ]; then + log2 "$1 already found by another group. Skipping" + return 1; + fi + if [ "$(getstate ${dev}.ismodem)" = "0" ]; then + log2 "$1 is not modem. Skipping" + return 1; + fi + gcom -d $1 -s /etc/gcom/testport.gcom </dev/null >/dev/null || { + setstate ${dev}.ismodem=0 + log2 "$1 is not modem. Skipping" + } +} + +unlock_sim () { + local dev=$(shortdev $1) + if [ "$(getstate ${dev}.unlocked)" = "1" ]; then + log2 "$1 is already unlocked." + return 1; + fi + if [ -n "$2" ]; then COMGTPIN=$2 gcom -d $1 PIN </dev/null >/dev/null; fi + setstate ${dev}.unlocked=1 + log2 "$1 unlocked. Sleeping for $regwait seconds" + sleep $regwait +} + +device_found () { + local dev=$(shortdev $1) + mkdir -p $(dirname $2) + ln -sf $1 $2 + log "[$3]: Found $1 => $2" + setstate ${dev}.found=1 + [ -n "$4" ] && { log "Triggering interface $4 up"; + ifup $4; + setstate ${dev}.ifup=$4 + } +} + +processgroup () { + local group=$1 + local devices + local maxwait + local deviceonly=$2 + + config_get type "$group" linkby + config_get maxwait "$group" maxwait 2 + config_get pin "$group" pin + [ -z "$type" ] && { log1 "No type in group $group. Skipping."; continue; } + + log2 "Processing group [$group]" + local networkid + config_get networkid "$group" networkid + local imei + config_get imei "$group" imei + local cimi + config_get cimi "$group" cimi + local linkto + config_get linkto "$group" linkto + local extcmd + config_get extcmd "$group" extcmd + local ifup + config_get ifup "$group" ifup + devices=$(config_get "$group" devices) + log2 "[$group]: Searching by $type on devices ($devices)" + + case $type in + comgt-networkid) + for d in $devices; do + if ! [ -r $d ]; then + log2 "[$group]: $d not readable" + continue + fi + if open_port $d; then + unlock_sim $d $pin + local dnetworkid=$(gcom -d $d reg | tee -a $base.log | awk '/network:(.*)/ {print $5}' | tr -d '"') + if [ "$networkid" == "$dnetworkid" ] || [ -z "$networkid" ]; then + [ -z "$linkto" ] && linkto=/dev/gsm/$dnetworkid + device_found $d $linkto $group $ifup + break; + fi + else + log2 "chat on $d exited with $?" + fi + done + ;; + + comgt-imei) + if [ -z "$imei" ]; then + log1 "Missing imei option. Skipping group $group." + continue + fi + if [ -z "$linkto" ]; then + log1 "Missing linkto option. Skipping group $group." + continue + fi + local ifup + for d in $(config_get "$group" devices); do + if ! [ -r $d ]; then + log2 "[$group]: $d not readable" + continue + fi + if open_port $d; then + unlock_sim $d $pin + local dimei=$(gcom -d $d info | awk '/IMEI(.*)(\d*)/ {print $6}' | tr -d '"') + if [ "$imei" == "$dimei" ]; then + device_found $d $linkto $group $ifup + break; + fi + else + log2 "[$group]: chat on $d exited with $?" + fi + done + ;; + + comgt-cimi) + if [ -z "$cimi" ]; then + log1 "Missing cimi option. Skipping group $group." + continue + fi + if [ -z "$linkto" ]; then + log1 "Missing linkto option. Skipping group $group." + continue + fi + for d in $(config_get "$group" devices); do + if ! [ -r $d ]; then + log2 "[$group]: $d not readable" + continue + fi + if open_port $d; then + unlock_sim $d $pin + local dcimi=$(gcom -d $d -s /etc/gcom/getcimi.gcom | awk '/CIMI\:(.*)(\d*)/ {print $2}' | tr -d '"') + if echo $dcimi | grep -E "^$cimi" >/dev/null; then + device_found $d $linkto $group $ifup + break; + fi + else + log2 "[$group]: chat on $d exited with $?" + fi + done + ;; + + extcmd) + if [ -z "$linkto" ]; then + log1 "Missing linkto option. Skipping group $group." + continue + fi + for d in $(config_get "$group" devices); do + if ! [ -r $d ]; then + log2 "[$group]: $d not readable" + continue + fi + if $extcmd <$d >$d; then + device_found $d $linkto $group $ifup + break + fi + done + echo + ;; + *) + log1 "[$group]: Unknown linkby option" + continue + ;; + esac + true +} + +listgroups () { + echo $1 +} + + +start () { + config_load $myname + local cfg=$(config_foreach listgroups globals) + config_get prewait $cfg prewait + config_get regwait $cfg regwait + config_get debug $cfg debug + config_get_bool fork $cfg fork + if [ -z "$fork" ]; then + startfork $* & + else + startfork $* + fi +} + +startfork () { + base=$myname-$(basename "$1") + [ -f /var/lock/$base.lock ] && { log "Lock /var/lock/$base.lock active! Exiting. "; exit 1; } + touch /var/lock/$base.lock + groups=$(config_foreach listgroups group) + [ -n "$prewait" ] && { log "Sleeping for $prewait secs."; sleep $prewait; } + for g in $groups; do + processgroup $g $1 + done + rm -f /var/lock/$base.lock +} + Property changes on: package/comgt/files/serialmodem.init ___________________________________________________________________ Added: svn:executable + * Index: package/comgt/files/getcimi.gcom =================================================================== --- package/comgt/files/getcimi.gcom (revision 0) +++ package/comgt/files/getcimi.gcom (revision 0) @@ -0,0 +1,14 @@ +opengt + set com 115200n81 + set comecho off + set senddelay 0.02 + waitquiet 0.5 0.5 + flash 0.1 + +:start + send "AT+CIMI^m" + get 1 "" $s + print $s + +:continue + exit 0 Index: package/comgt/files/3g.chat =================================================================== --- package/comgt/files/3g.chat (revision 23546) +++ package/comgt/files/3g.chat (working copy) @@ -5,8 +5,10 @@ TIMEOUT 10 "" "AT&F" OK "ATE1" -OK 'AT+CGDCONT=1,"IP","$USE_APN"' +OK "AT$ATEXTRA" +OK 'AT+CGDCONT=$CID,"$PDP","$USE_APN"$EXTRA' SAY "Calling UMTS/GPRS" TIMEOUT 30 -OK "ATD*99***1#" -CONNECT ' ' +OK "ATDT*99#" +~ ' ' + Index: package/comgt/files/testport.gcom =================================================================== --- package/comgt/files/testport.gcom (revision 0) +++ package/comgt/files/testport.gcom (revision 0) @@ -0,0 +1,16 @@ +opengt + set com 38400n81 + set comecho off + set senddelay 0.02 + waitquiet 0.2 0.2 + flash 0.1 + +:start + send "ATZ^m" + send "ATZ^m" + waitfor 3 "OK" + if % = 0 goto continue + exit 1 + +:continue + exit 0 Index: package/comgt/Makefile =================================================================== --- package/comgt/Makefile (revision 23546) +++ package/comgt/Makefile (working copy) @@ -9,7 +9,7 @@ PKG_NAME:=comgt PKG_VERSION:=0.32 -PKG_RELEASE:=4 +PKG_RELEASE:=6 PKG_SOURCE:=$(PKG_NAME).$(PKG_VERSION).tgz PKG_SOURCE_URL:=...@sf/comgt @@ -55,10 +55,16 @@ $(INSTALL_DIR) $(1)/etc/hotplug.d/iface $(INSTALL_DATA) ./files/3g.iface $(1)/etc/hotplug.d/iface/05-3g $(INSTALL_DIR) $(1)/etc/gcom + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./files/serialmodem.init $(1)/etc/init.d/serialmodem + $(INSTALL_DIR) $(1)/etc/hotplug.d/usb + $(INSTALL_BIN) ./files/serialmodem.hotplug $(1)/etc/hotplug.d/usb/20-serialmodem $(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 $(INSTALL_DATA) ./files/getstrength.gcom $(1)/etc/gcom/getstrength.gcom + $(INSTALL_DATA) ./files/testport.gcom $(1)/etc/gcom/testport.gcom + $(INSTALL_DATA) ./files/getcimi.gcom $(1)/etc/gcom/getcimi.gcom endef $(eval $(call BuildPackage,comgt)) _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel