rewised switch4g script
[tomato.git] / release / src / router / others / switch4g
blob571910239a73090b6ca096a5b15dd92539fe1362
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" -o "$TYP" == "hw-ether" ]; then
23 CONNECTED=0
24 COUNT=0
26 if [ -z "$DEV" ]; then
27 logger 4G MODEM - DIAG interface not found - connection terminated
28 exit 0;
31 #we try use last diag iface first. If it failed then we try use any other ttyUSB device
32 TTY=`ls /dev/ttyUSB* | grep -v $DEV`
33 DEVS="$DEV $TTY"
35 while [ $CONNECTED == "0" ]; do
36 for i in $DEVS; do
37 if [ "$COUNT" -lt "5" ]; then
38 MODE="AT^NDISDUP=1,0,\"$APN\"" gcom -d $i -s /etc/gcom/setverbose.gcom
39 MODE="AT^NDISDUP=1,1,\"$APN\"" gcom -d $i -s /etc/gcom/setverbose.gcom > /tmp/4g.mode
41 CHECK=`cat /tmp/4g.mode | grep "NDISSTAT:" | cut -d ":" -f2 | cut -d "," -f1`
42 if [ "$CHECK" == "1" ]; then
43 logger 4G MODEM - connected ...
44 CONNECTED=1
45 COUNT=6
46 DEV=$i
47 nvram set modem_dev4g="$DEV"
48 break;
49 else
50 logger 4G MODEM - device $i connection failed.
51 sleep 5
52 COUNT=`expr $COUNT + 1`
55 done
56 done
59 GO=0
60 COUNT=1
62 while [ $GO = "0" ]; do
63 if [ "$COUNT" == "5" ]; then
64 logger 4G MODEM WAN IFACE failed - connection process terminated!
65 rm $LOCK
66 exit 0;
67 else
68 dhcpc-release
69 sleep 1
70 dhcpc-renew
72 CHECKIFA=`ifconfig | grep $IFA | wc -l`
73 if [ "$CHECKIFA" == "1" ]; then
74 GO=1
75 logger 4G MODEM - WAN IFACE configured ...
76 else
77 logger 4G MODEM WAN IFACE - count: $COUNT
78 COUNT=`expr $COUNT + 1`
79 sleep 5
82 done
85 disconnect() {
86 DEV=`nvram get modem_dev4g`
87 TYP=`nvram get modem_type`
89 logger 4G MODEM - disconnecting ...
90 dhcpc-release
92 if [ "$TYP" == "non-hilink" -o "$TYP" == "hw-ether" ]; then
93 MODE="AT^NDISDUP=1,0" gcom -d $DEV -s /etc/gcom/setmode.gcom
97 checkLock() {
98 if [ -f $LOCK ]; then #lock exist
99 logger 4G MODEM - previous proces of switch4g still working
100 exit 0
103 touch $LOCK
106 setPIN() {
107 PIN=`nvram get modem_pin`
108 IS_PIN=`nvram get modem_pin | wc -w`
110 #set pin
111 if [ "$IS_PIN" == "1" -a "$TYPE" == "non-hilink" ]; then #only for non-hilink
112 PINCODE="$PIN" gcom -d $DEVNR -s /etc/gcom/setpin.gcom
116 switchMode() {
117 MODULES="cdc_ether huawei_ether cdc_ncm"
119 for MODULE in $MODULES; do
120 modprobe $MODULE
121 done
123 sleep 5
125 COUNT=0
126 FOUND=0
128 while [ $FOUND == "0" ]; do
129 #modem not found, try detect
130 DEVICES=`lsusb | awk '{print $6}'`
132 for SWITCH in $DEVICES; do
133 SEARCH=`ls /etc/usb_modeswitch.d/$SWITCH | wc -l`
135 # vendor:product
137 if [ "$SEARCH" == "1" ]; then
138 logger 4G MODEM FOUND - $SWITCH - Switching ...
139 DV=`echo $SWITCH | cut -d ":" -f1`
140 DP=`echo $SWITCH | cut -d ":" -f2`
141 /usr/sbin/usb_modeswitch -Q -c /etc/usb_modeswitch.d/$SWITCH -v $DV -p $DP
143 TEST1=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | wc -l`
144 if [ "$TEST1" == "1" ]; then
145 VENDOR=`cat /etc/usb_modeswitch.d/$SWITCH | grep "TargetVendor" | cut -d "=" -f2 | cut -d "x" -f2`
146 else
147 VENDOR=`echo $SWITCH | cut -d ":" -f1`
150 TEST2=`lsusb | awk '{print $6}' | grep $VENDOR | wc -l`
151 if [ "$TEST2" == "1" ]; then
152 PRODUCT=`lsusb | awk '{print $6}' | grep $VENDOR | cut -d ":" -f2`
153 logger 4G MODEM ready - $VENDOR:$PRODUCT
154 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
157 done
159 # is modem ready?
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 elif [ "$MODULE" == "huawei_ether" ]; then
169 TYPE="hw-ether"
170 else
171 TYPE="unknown"
174 logger 4G MODEM NDIS found - $TYPE - using $MODULE module
175 nvram set 4g_module=$MODULE
176 FOUND=1
177 break;
178 else
179 if [ "$COUNT" == "5" ]; then
180 logger 4G MODEM NDIS not found - process terminated!
181 rm $LOCK
182 exit 0;
183 else
184 logger 4G MODEM NDIS not found - $MODULE - count: $COUNT
185 COUNT=`expr $COUNT + 1`
186 sleep 5
189 done
190 done
193 searchWAN() {
195 #search WAN interface (usbX or ethX)
196 FOUND=0
197 COUNT=0
199 KERNEL=`uname -r | cut -d "." -f1,2,3`
201 while [ $FOUND == "0" ]; do
202 if [ "$TYPE" == "hw-ether" ]; then
203 WAN=`dmesg | grep huawei_ether | grep Device | grep register | cut -d ":" -f1 | tail -1`
204 elif [ "$KERNEL" == "2.6.36" ]; then #ARM
205 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d " " -f3 | cut -d ":" -f1 | tail -1`
206 else #MIPSEL
207 WAN=`dmesg | grep $MODULE | grep register | grep "'" | cut -d ":" -f1 | tail -1`
210 IS_WAN=`echo $WAN | wc -w`
212 if [ "$IS_WAN" -gt 0 ]; then
213 logger 4G MODEM WAN found - $TYPE - using $WAN as WAN
214 nvram set wan_4g="$WAN"
215 nvram set modem_type=$TYPE
216 FOUND=1
217 else
218 if [ "$COUNT" == "5" ]; then
219 logger 4G MODEM WAN not found - connection process terminated!
220 rm $LOCK
221 exit 0;
222 else
223 logger 4G MODEM WAN not found - count: $COUNT
224 COUNT=`expr $COUNT + 1`
225 sleep 5
228 done
231 searchDiag() {
232 FOUND=0
234 US=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
236 if [ "$US" -gt 0 ]; then
237 logger 4G MODEM found - Diagnostic interface - using usbserial module
238 break;
239 else
240 IS_VENDOR=`echo $VENDOR | wc -w`
241 if [ "$IS_VENDOR" -gt 0 ]; then
242 IS_PRODUCT=`echo $PRODUCT | wc -w`
243 if [ "$IS_PRODUCT" -gt 0 ]; then
244 logger 4G MODEM - loading module usbserial
245 rmmod usbserial
246 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
247 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
251 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
252 if [ "$DEV" -gt 0 ]; then
253 logger 4G MODEM ready - using usbserial module
254 FOUND=1
255 nvram set 4g_module=usbserial
256 else
257 #last change. try load usbserial for each usb devices
258 DEVICES=`lsusb | awk '{print $6}'`
259 for SWITCH in $DEVICES; do
260 if [ "$FOUND" == "0" ]; then
261 VENDOR=`echo $SWITCH | cut -d ":" -f1`
262 PRODUCT=`echo $SWITCH | cut -d ":" -f2`
263 rmmod usbserial
264 insmod usbserial vendor=0x$VENDOR product=0x$PRODUCT
266 DEV=`cat /proc/bus/usb/devices | grep Driver | grep usbserial | wc -l`
267 if [ "$DEV" -gt 0 ]; then
268 logger 4G MODEM ready - using usbserial module
269 nvram set 4g_module=usbserial
270 echo "$VENDOR:$PRODUCT" > /tmp/4g.detect
271 FOUND=1
272 break;
275 done
279 #search diagnostic device
280 TTY=`ls /dev/ttyUSB*`
282 for i in $TTY; do
283 CHECKTTY=`gcom -d $i -e info | grep OK | wc -l`
284 if [ "$CHECKTTY" == "1" ]; then #found working interface
285 logger 4G MODEM DIAG found - $i
286 nvram set modem_dev4g=$i
287 DEVNR=$i
288 else
289 logger 4G MODEM DIAG not found
291 done
294 signal() {
295 #check signal strength
296 CSQ=`gcom -d $DEVNR -s /etc/gcom/getstrength.gcom | grep "CSQ:" | cut -d " " -f2 | cut -d "," -f1`
297 DBM=$((-113+CSQ*2))
298 logger "4G MODEM Signal Strength: $DBM dBm"
302 ###################################################
304 if [ "$1" == "connect" ]; then
305 connect
306 elif [ "$1" == "disconnect" ]; then
307 disconnect
308 else
309 checkLock
311 switchMode
313 searchWAN
315 if [ "$TYPE" == "non-hilink" -o "$TYPE" == "hw-ether" ]; then #only for non-hilink
316 searchDiag
318 setPIN
320 signal
323 #force connection after detect 4G modem
324 connect
326 #remove lock
327 rm $LOCK