Skip to content

Commit 0b9e011

Browse files
committed
qmodem: Add LED control scripts and add board configuration for m60k63 modem
1 parent 191ec26 commit 0b9e011

File tree

4 files changed

+286
-0
lines changed

4 files changed

+286
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#!/bin/sh /etc/rc.common
2+
START=99
3+
STOP=13
4+
USE_PROCD=1
5+
6+
service_triggers()
7+
{
8+
procd_add_reload_trigger "qmodem"
9+
10+
}
11+
12+
start_service(){
13+
load_led_services
14+
}
15+
16+
stop_service(){
17+
config_load qmodem
18+
config_foreach _turn_off_leds modem-device
19+
}
20+
21+
load_led_services(){
22+
config_load qmodem
23+
config_foreach _led_services modem-device
24+
}
25+
26+
27+
_led_services()
28+
{
29+
local led_script
30+
config_get led_script "$1" led_script
31+
if [ -n "$led_script" ] && [ -x "/usr/share/qmodem/led_scripts/${led_script}.sh" ]; then
32+
procd_open_instance led_$1
33+
procd_set_param command "/usr/share/qmodem/led_scripts/${led_script}.sh" "$1"
34+
procd_set_param respawn 120 15 10
35+
procd_close_instance
36+
fi
37+
}
38+
39+
_turn_off_leds(){
40+
local led_script
41+
config_get led_script "$1" led_script
42+
if [ -n "$led_script" ] && [ -x "/usr/share/qmodem/led_scripts/${led_script}.sh" ]; then
43+
/usr/share/qmodem/led_scripts/${led_script}.sh "$1" "off"
44+
fi
45+
}

application/qmodem/files/etc/uci-defaults/99-add-5g-handler

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ modem_settings()
2727
uci set qmodem.pcie0.alias="wwan1"
2828
uci commit qmodem
2929
;;
30+
feiyan,m60k63)
31+
#usb slot 2-1
32+
add_usb_slot_cfg "wwan0" "2-1" "wwan0" "" "" "5g-power" "0" "1" "5"\
33+
#set led script
34+
uci set qmodem.wwan0.led_script="m60k63"
35+
;;
3036
hiveton,h5000m)
3137
#usb slot
3238
uci set qmodem.usb0="modem-slot"
Lines changed: 218 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
#!/bin/sh
2+
3+
# envs
4+
# led names
5+
# LED_4G_POOR="red:4g"
6+
# LED_4G_GOOD="blue:4g"
7+
# LED_5G_POOR="red:5g"
8+
# LED_5G_GOOD="blue:5g"
9+
# LED_INTERNET_BLUE="blue:internet"
10+
# LED_INTERNET_RED="red:internet"
11+
# modem_cfg
12+
# MODEM_CFG / AT_PORT / NET_DEV / USE_UBUS_DAEMON
13+
14+
. /usr/share/qmodem/modem_util.sh
15+
. /lib/functions.sh
16+
LED_4G_POOR="red:4g"
17+
LED_4G_GOOD="blue:4g"
18+
LED_5G_POOR="red:5g"
19+
LED_5G_GOOD="blue:5g"
20+
LED_INTERNET_BLUE="blue:internet"
21+
LED_INTERNET_RED="red:internet"
22+
MODEM_CFG=$1
23+
ON_OFF=$2
24+
25+
update_cfg(){
26+
config_load qmodem
27+
config_get AT_PORT "$MODEM_CFG" at_port
28+
config_get ALIAS "$MODEM_CFG" alias
29+
config_get USE_UBUS "$MODEM_CFG" use_ubus
30+
[ "$USE_UBUS" = "1" ] && use_ubus_flag="-u"
31+
config_load network
32+
# if alias is set, network config name is alias else modem_cfg name
33+
if [ -n "$ALIAS" ]; then
34+
config_get NET_DEV "$ALIAS" ifname
35+
else
36+
config_get NET_DEV "$MODEM_CFG" ifname
37+
fi
38+
}
39+
40+
last_siminserted=""
41+
last_netstat=""
42+
43+
led_turn() {
44+
local path="/sys/class/leds/$1"
45+
local brightness="$2"
46+
47+
echo "$brightness" > "$path/brightness"
48+
}
49+
50+
led_heartbeat() {
51+
local path="/sys/class/leds/$1"
52+
53+
echo "1" > "$path/brightness"
54+
echo "heartbeat" > "$path/trigger"
55+
}
56+
57+
led_netdev() {
58+
local path="/sys/class/leds/$1"
59+
local device="$2"
60+
61+
echo "1" > "$path/brightness"
62+
echo "netdev" > "$path/trigger"
63+
echo "$device" > "$path/device_name"
64+
echo "1" > "$path/link"
65+
echo "1" > "$path/rx"
66+
echo "1" > "$path/tx"
67+
}
68+
69+
led_off_all() {
70+
led_turn "${LED_4G_POOR}" "0"
71+
led_turn "${LED_4G_GOOD}" "0"
72+
led_turn "${LED_5G_POOR}" "0"
73+
led_turn "${LED_5G_GOOD}" "0"
74+
}
75+
76+
nr_bw() {
77+
local bw="$1"
78+
case "$bw" in
79+
"0"|"1"|"2"|"3"|"4"|"5")
80+
echo "$(((bw + 1) * 5))" ;;
81+
"6"|"7"|"8"|"9"|"10"|"11"|"12")
82+
echo "$(((bw - 2) * 10))" ;;
83+
"13")
84+
echo "200" ;;
85+
"14")
86+
echo "400" ;;
87+
"15"|"25"|"75"|"100")
88+
echo "$(( bw / 5 ))" ;;
89+
esac
90+
}
91+
92+
sim_inserted() {
93+
94+
if at $AT_PORT "AT+CPIN?" | grep -q "CPIN: READY"; then
95+
echo "1"
96+
else
97+
echo "0"
98+
fi
99+
}
100+
101+
internet_led() {
102+
if wget-ssl --spider --quiet --tries=1 --timeout=3 www.baidu.com; then
103+
led_turn "${LED_INTERNET_BLUE}" "1"
104+
led_turn "${LED_INTERNET_RED}" "0"
105+
else
106+
led_turn "${LED_INTERNET_BLUE}" "0"
107+
led_turn "${LED_INTERNET_RED}" "1"
108+
fi
109+
}
110+
111+
sim_netstat() {
112+
local mode
113+
local bw csq rscp rssi
114+
115+
local srvinfo="$(at $AT_PORT 'AT+QENG="servingcell"')"
116+
if echo "$srvinfo" | grep -q "NR5G"; then
117+
mode="5g"
118+
else
119+
mode="4g"
120+
fi
121+
122+
csq="$(tom_modem -d /dev/mhi_DUN -c "AT+CSQ" | grep -Eo '\+CSQ: [0-9]{2}' | awk '{print $2}')"
123+
rssi="$(( 2 * csq - 113 ))"
124+
if [ "$csq" = "99" ]; then
125+
bw="$(nr_bw "$(echo "$srvinfo" | awk -F ',' '/^\+QENG/ {print $12}')")"
126+
rscp="$(echo "$srvinfo" | awk -F ',' '/^\+QENG/ {print $13}')"
127+
rssi="$(rsrp2rssi "$rscp" "$bw")"
128+
fi
129+
130+
# 0: no service, 1: weak, 2: good
131+
if [ "$rssi" = "-113" ] || [ "$rssi" = "85" ]; then
132+
echo "$mode,0"
133+
elif [ "$rssi" -le "-70" ]; then
134+
echo "$mode,1"
135+
else
136+
echo "$mode,2"
137+
fi
138+
}
139+
140+
main() {
141+
local siminserted="$(sim_inserted "/dev/mhi_DUN")"
142+
if [ "$siminserted" = "0" ] && [ "$siminserted" = "$last_siminserted" ]; then
143+
# there's no update, return
144+
return
145+
fi
146+
147+
last_siminserted="$siminserted"
148+
149+
if [ "$siminserted" = "0" ]; then
150+
led_off_all
151+
led_heartbeat ${LED_4G_POOR}
152+
led_heartbeat ${LED_5G_POOR}
153+
154+
last_netstat=""
155+
return
156+
fi
157+
158+
local netstat="$(sim_netstat)"
159+
160+
if [ "$netstat" = "$last_netstat" ]; then
161+
# there's no update, return
162+
return
163+
fi
164+
local mode="${netstat%,*}"
165+
local signal="${netstat#*,}"
166+
167+
case "$signal" in
168+
"0")
169+
led_off_all
170+
case "$mode" in
171+
"4g")
172+
led_heartbeat "${LED_4G_POOR}"
173+
;;
174+
"5g")
175+
led_heartbeat "${LED_5G_POOR}"
176+
;;
177+
esac
178+
;;
179+
"1")
180+
led_off_all
181+
case "$mode" in
182+
"4g")
183+
led_turn "${LED_4G_POOR}" "1"
184+
led_netdev "${LED_4G_GOOD}" "$NET_DEV"
185+
;;
186+
"5g")
187+
led_turn "${LED_5G_POOR}" "1"
188+
led_netdev "${LED_5G_GOOD}" "$NET_DEV"
189+
;;
190+
esac
191+
;;
192+
"2")
193+
led_off_all
194+
case "$mode" in
195+
"4g")
196+
led_turn "${LED_4G_GOOD}" "1"
197+
led_netdev "${LED_4G_GOOD}" "$NET_DEV"
198+
;;
199+
"5g")
200+
led_turn "${LED_5G_GOOD}" "1"
201+
led_netdev "${LED_5G_GOOD}" "$NET_DEV"
202+
;;
203+
esac
204+
;;
205+
esac
206+
}
207+
208+
# Loop forever
209+
update_cfg
210+
if [ "$ON_OFF" = "off" ]; then
211+
led_off_all
212+
exit 0
213+
fi
214+
while true; do
215+
main
216+
internet_led
217+
sleep 5s
218+
done

application/qmodem/files/usr/share/qmodem/modem_scan.sh

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ get_default_alias()
2828
config_foreach _get_default_alias_by_slot
2929
}
3030

31+
get_led_sript_by_slot()
32+
{
33+
target_slot=$1
34+
config_load qmodem
35+
config_foreach _get_led_sript_by_slot
36+
}
37+
3138
get_default_metric()
3239
{
3340
target_slot=$1
@@ -67,6 +74,14 @@ _get_default_metric_by_slot()
6774

6875
}
6976

77+
_get_led_sript_by_slot()
78+
{
79+
local cfg="$1"
80+
config_get _get_slot $cfg slot
81+
if [ "$target_slot" == "$_get_slot" ];then
82+
config_get led_script $cfg led_script
83+
fi
84+
7085
scan()
7186
{
7287
local slot_type=$1
@@ -447,6 +462,8 @@ add()
447462
unset default_metric
448463
get_default_alias $slot
449464
get_default_metric $slot
465+
get_led_sript_by_slot $slot
466+
[ -n "$led_script" ] && uci -q set qmodem.$section_name.led_script=$led_script
450467
modem_count=$(uci -q get qmodem.main.modem_count)
451468
[ -z "$modem_count" ] && modem_count=0
452469
modem_count=$(($modem_count+1))

0 commit comments

Comments
 (0)