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

Reply via email to