22# /etc/msm8916-usb-gadget.sh
33# Main script for MSM8916 USB Gadget
44
5- # SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
6- # CONFIG_FILE="${SCRIPT_DIR}/msm8916-usb-gadget.conf"
75CONFIG_FILE=" /etc/msm8916-usb-gadget.conf"
86GADGET_PATH=" /sys/kernel/config/usb_gadget/msm8916"
97
@@ -107,42 +105,33 @@ create_storage_image() {
107105 log " Storage image created successfully (raw format)"
108106}
109107
110- setup_serial_consoles () {
111- if [ " ${ENABLE_ACM} " != " 1" ]; then
112- return
113- fi
108+ manage_serial_shell () {
109+ local inittab_line=" ttyGS0::askfirst:/usr/libexec/login.sh"
114110
115- # Check if shell is enabled
116- if [ " ${ACM_SHELL :- 0} " != " 1 " ] ; then
117- log " Serial ports configured as raw TTY (no shell) "
118- return
111+ # First, always remove any existing ttyGS0 line
112+ if grep -q " ttyGS0 " /etc/inittab 2> /dev/null ; then
113+ log " Removing existing ttyGS0 line from inittab "
114+ sed -i " /ttyGS0/d " /etc/inittab
119115 fi
120116
121- log " Configuring serial console shells"
122-
123- # Wait for devices to appear
124- sleep 2
125-
126- acm_count=" ${ACM_COUNT:- 1} "
127- for i in $( seq 0 $(( acm_count - 1 )) ) ; do
128- if [ -c " /dev/ttyGS${i} " ]; then
129- log " Starting console shell on ttyGS${i} "
130- # Check if already in inittab
131- if ! grep -q " ttyGS${i} " /etc/inittab 2> /dev/null; then
132- echo " ttyGS${i} ::askfirst:/usr/libexec/login.sh" >> /etc/inittab
133- fi
134- else
135- log " Warning: /dev/ttyGS${i} not found yet"
136- fi
137- done
117+ # Then add it back only if ACM is enabled AND shell is requested
118+ if [ " ${ENABLE_ACM} " = " 1" ] && [ " ${ACM_SHELL:- 0} " = " 1" ]; then
119+ log " Adding serial shell to inittab"
120+ echo " ${inittab_line} " >> /etc/inittab
121+ fi
138122
139- # Reload procd to pick up changes
140- killall -HUP procd 2> /dev/null || true
123+ # Reload procd to apply changes
124+ kill -HUP 1 2> /dev/null
141125}
142126
127+
143128setup_gadget () {
144129 log " Setting up USB gadget"
145130
131+ # Check and manage serial shell configuration BEFORE setting up gadget
132+ # This handles cases where device rebooted with different ACM_SHELL setting
133+ manage_serial_shell
134+
146135 # Load required modules
147136 modprobe libcomposite
148137
@@ -207,18 +196,13 @@ setup_gadget() {
207196 has_wakeup=1
208197 fi
209198
210- # ACM Serial ports
199+ # ACM Serial port (single port)
211200 if [ " ${ENABLE_ACM} " = " 1" ]; then
212- log " Enabling ACM serial (${ACM_COUNT:- 1} ports)"
213-
214- # Create multiple ACM ports if requested
215- acm_count=" ${ACM_COUNT:- 1} "
216- for i in $( seq 0 $(( acm_count - 1 )) ) ; do
217- cfg_str=" ${cfg_str} +ACM"
218- mkdir -p functions/acm.GS${i}
219- # Link directly to config
220- ln -sf functions/acm.GS${i} " ${cfg} "
221- done
201+ log " Enabling ACM serial"
202+ cfg_str=" ${cfg_str} +ACM"
203+
204+ mkdir -p functions/acm.GS0
205+ ln -sf functions/acm.GS0 " ${cfg} "
222206 fi
223207
224208 # ECM
@@ -276,8 +260,19 @@ setup_gadget() {
276260 log " Using UDC: ${udc} "
277261 echo " ${udc} " > UDC || error " Failed to enable UDC"
278262
279- # Configure serial console shells (only if ACM_SHELL=1)
280- setup_serial_consoles
263+ # Wait for ttyGS0 to appear if ACM is enabled (to confirm device is ready)
264+ if [ " ${ENABLE_ACM} " = " 1" ]; then
265+ log " Waiting for ttyGS0 device..."
266+ # Wait for device to appear (max 10 seconds)
267+ for i in $( seq 1 10) ; do
268+ [ -c " /dev/ttyGS0" ] && break
269+ sleep 1
270+ done
271+
272+ if [ ! -c " /dev/ttyGS0" ]; then
273+ log " Warning: /dev/ttyGS0 not found after waiting"
274+ fi
275+ fi
281276
282277 # Configure network interfaces via UCI
283278 setup_network
@@ -293,21 +288,21 @@ setup_network() {
293288 if [ " ${ENABLE_RNDIS} " = " 1" ] && [ -f functions/rndis.usb0/ifname ]; then
294289 rndis_if=" $( cat functions/rndis.usb0/ifname) "
295290 log " Adding ${rndis_if} to LAN"
296- uci del_list network.@device[0].ports=" ${rndis_if} "
291+ uci del_list network.@device[0].ports=" ${rndis_if} " 2> /dev/null
297292 uci add_list network.@device[0].ports=" ${rndis_if} "
298293 fi
299294
300295 if [ " ${ENABLE_ECM} " = " 1" ] && [ -f functions/ecm.usb0/ifname ]; then
301296 ecm_if=" $( cat functions/ecm.usb0/ifname) "
302297 log " Adding ${ecm_if} to LAN"
303- uci del_list network.@device[0].ports=" ${ecm_if} "
298+ uci del_list network.@device[0].ports=" ${ecm_if} " 2> /dev/null
304299 uci add_list network.@device[0].ports=" ${ecm_if} "
305300 fi
306301
307302 if [ " ${ENABLE_NCM} " = " 1" ] && [ -f functions/ncm.usb0/ifname ]; then
308303 ncm_if=" $( cat functions/ncm.usb0/ifname) "
309304 log " Adding ${ncm_if} to LAN"
310- uci del_list network.@device[0].ports=" ${ncm_if} "
305+ uci del_list network.@device[0].ports=" ${ncm_if} " 2> /dev/null
311306 uci add_list network.@device[0].ports=" ${ncm_if} "
312307 fi
313308
@@ -318,6 +313,10 @@ setup_network() {
318313teardown_gadget () {
319314 log " Tearing down USB gadget"
320315
316+ # Check inittab status and clean up if needed BEFORE tearing down
317+ # This ensures proper cleanup even if device is being shut down
318+ manage_serial_shell
319+
321320 # Check if configfs is mounted
322321 if ! mountpoint -q /sys/kernel/config; then
323322 log " Configfs not mounted, nothing to tear down"
@@ -341,20 +340,11 @@ teardown_gadget() {
341340 # Disable gadget
342341 echo " " > UDC || true
343342
344- # Remove serial consoles from inittab (if shell was enabled)
345- if [ " ${ENABLE_ACM} " = " 1" ] && [ " ${ACM_SHELL:- 0} " = " 1" ]; then
346- acm_count=" ${ACM_COUNT:- 1} "
347- for i in $( seq 0 $(( acm_count - 1 )) ) ; do
348- sed -i " /ttyGS${i} /d" /etc/inittab 2> /dev/null || true
349- done
350- killall -HUP procd 2> /dev/null || true
351- fi
352-
353343 # Remove network interfaces from LAN
354344 for func in functions/* /ifname; do
355345 if [ -f " ${func} " ]; then
356346 iface=" $( cat " ${func} " ) "
357- uci del_list network.@device[0].ports=" ${iface} "
347+ uci del_list network.@device[0].ports=" ${iface} " 2> /dev/null
358348 fi
359349 done
360350
@@ -390,19 +380,16 @@ status() {
390380 # Show serial console status
391381 if [ " ${ENABLE_ACM} " = " 1" ]; then
392382 echo " "
393- echo " Serial consoles:"
394- acm_count=" ${ACM_COUNT:- 1} "
395- for i in $( seq 0 $(( acm_count - 1 )) ) ; do
396- if [ -c " /dev/ttyGS${i} " ]; then
397- if [ " ${ACM_SHELL:- 0} " = " 1" ]; then
398- echo " /dev/ttyGS${i} - available (with shell)"
399- else
400- echo " /dev/ttyGS${i} - available (raw TTY)"
401- fi
383+ echo " Serial console:"
384+ if [ -c " /dev/ttyGS0" ]; then
385+ if [ " ${ACM_SHELL:- 0} " = " 1" ]; then
386+ echo " /dev/ttyGS0 - available (with shell)"
402387 else
403- echo " /dev/ttyGS ${i} - not found "
388+ echo " /dev/ttyGS0 - available (raw TTY) "
404389 fi
405- done
390+ else
391+ echo " /dev/ttyGS0 - not found"
392+ fi
406393 fi
407394 return 0
408395 else
0 commit comments