switch4g: completely re-writen
[tomato.git] / release / src / router / others / switch4g
blobb1865d87c9c690d3d42ca662af419c38ef144a55
1 #!/bin/sh
4 # Copyright (C) 2015 shibby
7 MODE=`nvram get wan_proto`
8 LOCK="/tmp/switch4g.lock"
10 if [ ! "$MODE" == "lte" ]; then
11 exit 0
14 connect() {
15 APN=`nvram get modem_apn`
16 DEV=`nvram get modem_dev4g`
17 TYP=`nvram get modem_type`
18 IFA=`nvram get wan_4g`
20 logger 4G MODEM - connecting ...
22 if [ "$TYP" == "non-hilink" ]; then
23 CONNECTED=0
25 while [ $CONNECTED == "0" ]; do
26 MODE="AT^NDISDUP=1,1,\"$APN\"" gcom -d $DEV -s /etc/gcom/setverbose.gcom > /tmp/4g.mode
28 MODE="AT+CGCONTRDP" gcom -d $DEV -e -s /etc/gcom/setverbose.gcom > /tmp/4g.check
29 CHECK1=`cat /tmp/4g.check | grep ERROR | wc -l`
30 CHECK2=`cat /tmp/4g.check | grep open | wc -l`
31 if [ "$CHECK1" == "1" ]; then
32 logger 4G MODEM - device $DEV not connected yet ...
33 sleep 5
34 elif [ "$CHECK2" == "1" ]; then
35 logger 4G MODEM - device $DEV not ready ...
36 sleep 5
37 else
38 logger 4G MODEM - connected ...
39 CONNECTED=1
41 done
44 GO=0
45 while [ $GO = "0" ]; do
46 dhcpc-renew
48 CHECKIFA=`ifconfig | grep $IFA | wc -l`
49 if [ "$CHECKIFA" == "1" ]; then
50 GO=1
51 logger 4G MODEM - WAN configured ...
53 done
56 disconnect() {
57 DEV=`nvram get modem_dev4g`
58 TYP=`nvram get modem_type`
60 logger 4G MODEM - disconnecting ...
61 dhcpc-release
63 if [ "$TYP" == "non-hilink" ]; then
64 MODE="AT^NDISDUP=1,0" gcom -d $DEV -s /etc/gcom/setmode.gcom
68 checkLock() {
69 if [ -f $LOCK ]; then #lock exist
70 logger 4G MODEM - previous proces of switch4g still working
71 exit 0
74 touch $LOCK
77 setPIN() {
78 PIN=`nvram get modem_pin`
79 IS_PIN=`nvram get modem_pin | wc -w`
81 #set pin
82 if [ "$IS_PIN" == "1" -a "$TYPE" == "non-hilink" ]; then #only for non-hilink
83 PINCODE="$PIN" gcom -d $DEVNR -s /etc/gcom/setpin.gcom
87 switchMode() {
88 MODULES="cdc_ether cdc_ncm"
90 for MODULE in $MODULES; do
91 modprobe $MODULE
92 done
94 sleep 5
96 COUNT=0
97 FOUND=0
99 while [ $FOUND == "0" ]; do
100 #modem not found, try detect
101 DEVICES=`lsusb | awk '{print $6}'`
103 for SWITCH in $DEVICES; do
104 SEARCH=`ls /etc/usb_modeswitch.d/$SWITCH | wc -l`
106 # vendor:product
108 if [ "$SEARCH" == "1" ]; then
109 logger 4G MODEM FOUND - $SWITCH - Switching ...
110 DV=`echo $SWITCH | cut -d ":" -f1`
111 DP=`echo $SWITCH | cut -d ":" -f2`
112 /usr/sbin/usb_modeswitch -Q -c /etc/usb_modeswitch.d/$SWITCH -v $DV -p $DP
114 TEST1=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | wc -l`
115 if [ "$TEST1" == "1" ]; then
116 VENDOR=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | cut -d "x" -f2`
117 else
118 VENDOR=`echo $SWITCH | cut -d ":" -f1`
121 TEST2=`lsusb | awk '{print $6}' | grep $VENDOR | wc -l`
122 if [ "$TEST2" == "1" ]; then
123 PRODUCT=`lsusb | awk '{print $6}' | grep $VENDOR | cut -d ":" -f2`
124 logger 4G MODEM ready - $VENDOR:$PRODUCT
125 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
128 done
130 # is modem ready?
131 HL=`cat /proc/bus/usb/devices | grep Driver | grep cdc_ether | wc -l`
132 NHL=`cat /proc/bus/usb/devices | grep Driver | grep cdc_ncm | wc -l`
134 if [ "$HL" -gt 0 ]; then
135 logger 4G MODEM found - Hilink - using cdc_ether module
136 FOUND=1
137 break;
138 elif [ "$NHL" -gt 0 ]; then
139 logger 4G MODEM found - non-Hilink - using cdc_ncm module
140 FOUND=1
144 if [ "$COUNT" == "5" ]; then
145 logger 4G MODEM not found - process terminated!
146 break;
147 else
148 logger 4G MODEM not found - count: $COUNT
149 COUNT=`expr $COUNT + 1`
150 sleep 5
152 done
155 searchWAN() {
156 FOUND=0
157 COUNT=0
159 while [ $FOUND == "0" ]; do
160 for MODULE in $MODULES; do
161 SEARCH=`cat /proc/bus/usb/devices | grep Driver | grep $MODULE | wc -l`
163 if [ "$SEARCH" -gt 0 ]; then
164 if [ "$MODULE" == "cdc_ether" ]; then
165 TYPE="hilink"
166 elif [ "$MODULE" == "cdc_ncm" ]; then
167 TYPE="non-hilink"
168 else
169 TYPE="unknown"
172 logger 4G MODEM NDIS found - $TYPE - using $MODULE module
173 nvram set 4g_module=$MODULE
174 FOUND=1
175 break;
176 else
177 if [ "$COUNT" == "5" ]; then
178 logger 4G MODEM NDIS not found - process terminated!
179 rm $LOCK
180 exit 0;
181 else
182 logger 4G MODEM NDIS not found - $MODULE - count: $COUNT
183 COUNT=`expr $COUNT + 1`
184 sleep 5
187 done
188 done
190 #search WAN interface (usbX or ethX)
191 FOUND=0
192 COUNT=0
194 KERNEL=`uname -r | cut -d "." -f1,2,3`
196 while [ $FOUND == "0" ]; do
197 if [ "$KERNEL" == "2.6.36" ]; then #ARM
198 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d " " -f3 | cut -d ":" -f1 | tail -1`
199 else #MIPSEL
200 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d ":" -f1 | tail -1`
203 IS_WAN=`echo $WAN | wc -w`
205 if [ "$IS_WAN" -gt 0 ]; then
206 logger 4G MODEM WAN found - $TYPE - using $WAN as WAN
207 nvram set wan_4g="$WAN"
208 nvram set modem_type=$TYPE
209 FOUND=1
210 else
211 if [ "$COUNT" == "5" ]; then
212 logger 4G MODEM WAN not found - connection process terminated!
213 rm $LOCK
214 exit 0;
215 else
216 logger 4G MODEM WAN not found - count: $COUNT
217 COUNT=`expr $COUNT + 1`
218 sleep 5
221 done
224 searchDiag() {
225 if [ "$TYPE" == "non-hilink" ]; then #only for non-hilink
227 US=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
229 if [ "$US" -gt 0 ]; then
230 logger 4G MODEM found - Diagnostic interface - using usbserial module
231 break;
232 else
233 IS_VENDOR=`echo $VENDOR | wc -w`
234 if [ "$IS_VENDOR" -gt 0 ]; then
235 IS_PRODUCT=`echo $PRODUCT | wc -w`
236 if [ "$IS_PRODUCT" -gt 0 ]; then
237 logger 4G MODEM - loading module usbserial
238 rmmod usbserial
239 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
240 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
244 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
245 if [ "$DEV" -gt 0 ]; then
246 logger 4G MODEM ready - using usbserial module
247 FOUND=1
248 nvram set 4g_module=usbserial
249 else
250 #last change. try load usbserial for each usb devices
251 DEVICES=`lsusb | awk '{print $6}'`
252 for SWITCH in $DEVICES; do
253 VENDOR=`echo $SWITCH | cut -d ":" -f1`
254 PRODUCT=`echo $SWITCH | cut -d ":" -f2`
255 rmmod usbserial
256 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
258 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
259 if [ "$DEV" -gt 0 ]; then
260 logger 4G MODEM ready - using usbserial module
261 nvram set 4g_module=usbserial
262 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
263 FOUND=1
265 done
269 #search diagnostic device
270 TTY=`ls /dev/ttyUSB*`
272 for i in $TTY; do
273 CHECKTTY=`gcom -d $i -e info | grep OK | wc -l`
274 if [ "$CHECKTTY" == "1" ]; then #found working interface
275 logger 4G MODEM DIAG found - $i
276 nvram set modem_dev4g=$i
277 DEVNR=$i
278 else
279 logger 4G MODEM DIAG not found
281 done
285 signal() {
286 if [ "$TYPE" == "non-hilink" ]; then #only for non-hilink
287 #check signal strength
288 CSQ=`gcom -d $DEVNR -s /etc/gcom/getstrength.gcom | grep "CSQ:" | cut -d " " -f2 | cut -d "," -f1`
289 DBM=$((-113+CSQ*2))
290 logger "4G MODEM Signal Strength: $DBM dBm"
295 ###################################################
297 if [ "$1" == "connect" ]; then
298 connect
299 elif [ "$1" == "disconnect" ]; then
300 disconnect
301 else
302 checkLock
304 switchMode
306 searchWAN
308 searchDiag
310 setPIN
312 signal
314 #force connection after detect 4G modem
315 connect
317 #remove lock
318 rm $LOCK