====== GSM Multiplexing on the OpenMoko FreeRunner ====== We want **Qtopia** (or other similar system) to handle GSM calls/SMS messages and we want concurrently **''pppd(8)''** to place GSM/GPRS data calls. The problem is that there is **only one GSM modem**. We need a software multiplexer: **''gsm0710muxd''** is our choice. Install it with ''opkg install gsm0710muxd''. Be sure that any program accessing the modem (**''qpe''** or **''gsmd''**) is terminated. Be sure the modem is properly restetted, I suggest this script: echo "0" > /sys/bus/platform/devices/neo1973-pm-gsm.0/power_on sleep 1 echo "1" > /sys/bus/platform/devices/neo1973-pm-gsm.0/power_on sleep 1 stty -F /dev/ttySAC0 115200 crtscts min 1 ignbrk ignpar -ocrnl -onlcr -iexten -echoctl -echoke echo -e '\r' > /dev/ttySAC0 This is an example script (**''gsm_mux_alloc''**) allocating a virtual channel: #!/bin/sh # Ask the GSM modem muxer to allocate a virtual channel. tag=$1 test -z "$tag" && echo "Usage: $0 " && exit 1 test -L /dev/$tag && rm /dev/$tag test -e /dev/$tag && exit 1 set -e pts="$(dbus-send --system --print-reply --type=method_call \ --dest=org.pyneo.muxer /org/pyneo/Muxer \ org.freesmartphone.GSM.MUX.AllocChannel string:$tag \ | grep string | cut -f2 -d'"')" test -c "$pts" ln -s $pts /dev/$tag We use the [[http://www.freedesktop.org/wiki/Software/dbus|D-Bus]] system to communicate with gsm0710muxd, the sense of the command is: * Communicate through the **system message bus**, not the user's one. * Require to **print a reply**. * Message is of type **method call** (ask for an answer), not a one-way signal type. * The destination is **org.pyneo.muxer**: this is the name choosen by gsm0710muxd. * The object to communicate to (inside org.pyneo.muxer) has path **''/org/pyneo/Muxer''**. * The message is a **channel allocation request**. * We pass an unique **identifier** along with the request. The GSM muxer D-Bus interface is documented on this [[http://docs.freesmartphone.org/org.freesmartphone.GSM.MUX.html|freesmartphone.org page]]. The full answer (without ''grep'' and ''awk'' filters) is: method return sender=:1.17 -> dest=:1.22 reply_serial=2 string "/dev/pts/3" Run the script as **''gsm_mux_alloc minicom''** and you will get a symbolic link **''/dev/minicom''** pointing to **''/dev/pts/3''** (if 3 is the allocated pseudo tty). The device can now be used, say by **''minicom(1)''** or by **''pppd(8)''**. When the program closes the device, it will be released by the muxer an cannot be longer used. This is the syslog: gsm0710muxd.c:693:c_alloc_channel(): Connecting /dev/pts/3 to virtual channel 2 for minicom on /dev/ttySAC0 gsm0710muxd.c:569:pseudo_device_read(): Write to a channel which wasn't acked to be open. gsm0710muxd.c:1410:extract_frames(): Logical channel 2 opened gsm0710muxd.c:609:pseudo_device_read(): Logical channel 2 for (null) closed ===== The multiplexed GSM modem ===== You can use the multiplexed modem at **115200 8N1**. Wich flow chontrol? After **10 seconds of inactivity** the virtual serial line **goes to sleep**. Send a **carriage return to awake it** and get the **OK** response from the modem. If you send an **AT** command while the line is sleeping, it will be ignored. You cannot run more than one program with the allocated muxed device. Once the first program closes the device, it will be released. This means - for example - that you cannot initialize the serial line with **''stty(1)''** before running **''pppd(8)''**.