Project

General

Profile

D-Link DWM-222 stick » History » Version 10

domi, 08/20/2018 11:18 AM

1 1 domi
h1. D-Link DWM-222 stick
2 1 domi
3 8 domi
{{>toc}}
4 5 domi
5 5 domi
6 1 domi
!{width:300px}dwm222_pic.jpg!
7 1 domi
8 5 domi
9 5 domi
10 3 domi
This stick is available at multiple operators and it is quite cheap. If you want to get into Linux-based Qualcomm dongles that are easier to attach to your laptop than Quectel modems (no messing around with mini-PCIe to USB adapters and what not) it might be a way to go.
11 4 domi
12 1 domi
*WARNING!
13 1 domi
Current version of the DWM-222 does NOT expose ADB, so accessing the underlying Linux is currently not possible! HOWEVER there might be ways to enable this functionality, so keep reading, but BE AWARE BEFORE PUCHASING!*
14 1 domi
15 1 domi
It is just a D-Link branded version of cheaper dongles made in China. Some of them are WiFi access points with LTE backhaul using [[QCMAP]].
16 1 domi
Example of devices that are closely related:
17 1 domi
* PTCL Charji Wingle R660
18 1 domi
* (?)D-Link DWR 901 (unsure, FIXME)
19 1 domi
20 1 domi
21 5 domi
22 5 domi
23 1 domi
h2. Hardware
24 1 domi
25 5 domi
26 1 domi
!{width:500px}pcb_pic.jpg!
27 5 domi
28 1 domi
29 6 domi
Opening the stick requires just removing the back cover (which reveals the standard size SIM slot and the microSD card reader), then unscrewing the Philips 3 screws.
30 1 domi
The stick is based on the Qualcomm MDM9225 chipset. It is closely related to the MDM9625 apparently (based on the firmware analysis).
31 1 domi
There are two antenna connectors (U.FL) exposed on the PCB.
32 1 domi
33 1 domi
h2. Software
34 1 domi
35 1 domi
The dongle is a typical USB WWAN modem. It requires usb_modeswitch to change from mass_storage mode (enables installation of driver) to modem mode.
36 1 domi
Mass storage mode USB id: *2001:ab00*
37 1 domi
WWAN USB id: *2001:7e35*
38 1 domi
39 1 domi
After the switch you'll see 4 @ttyUSB@ devices appearing in @/dev@. For me these devices only started to work after telling the @option@ driver about the USB id of the device:
40 1 domi
<pre>
41 1 domi
echo "2001 7e35" > /sys/bus/usb-serial/drivers/option1/new_id
42 1 domi
</pre>
43 1 domi
44 1 domi
The devices are:
45 1 domi
<pre>
46 1 domi
/dev/ttyUSB0  --> DIAG
47 1 domi
/dev/ttyUSB1  --> AT commands
48 1 domi
/dev/ttyUSB2
49 1 domi
/dev/ttyUSB3
50 1 domi
/dev/cdc-wdm0 --> QMI
51 1 domi
</pre>
52 1 domi
53 1 domi
h3. Drivers
54 1 domi
55 1 domi
If in mass_storage mode there is a Windows driver available with D-Link Connection Manager. It basically just switches the device to modem mode, and then provides a GUI to establish a connection.
56 1 domi
Surprisingly D-Link provides Linux support for the dongle. A page is dedicated to guide you through the installation. https://eu.dlink.com/uk/en/support/faq/routers/mobile-routers/how-to-install-my-dwm-222-on-ubuntu
57 1 domi
However it is not recommended to follow the instructions, because the 'driver' is just a collection of bash scripts that tries to configure PPP daemon. Interestingly it has a complete collection of MCC, MNC, APN triples for all operators around the world. Based on the IMSI queried from the SIM card it tries to find the right settings and feed them to pppd.
58 1 domi
59 1 domi
h2. Firmware
60 1 domi
61 1 domi
There are 2 firmware versions available for download currently: 2.0.1 and 2.0.8. https://eu.dlink.com/uk/en/products/dwm-222-4g-lte-usb-adapter#support
62 7 domi
The dongle that I had came with an older version, 1.7.9. It didn't really work for me, so I upgraded to 2.0.8:
63 1 domi
64 1 domi
h3. Upgrade process
65 1 domi
66 1 domi
Upgrade can only be done from Windows. The file provided is a self-extracting executable. After extracting the contents it turned out to be quite interesting: a collection of executables and batch files, as well as MBN and yaffs2 images.
67 1 domi
After tracing the upgrade process I've established its steps roughly:
68 1 domi
69 1 domi
<pre>
70 1 domi
Start 1key.bat -> Installs drivers (ADB, QDLoader, Fastboot) -> Runs dl.exe -> Device goes into QDL mode -> MBN files are flashed -> Device reboots.
71 1 domi
</pre>
72 1 domi
73 1 domi
Now comes the tricky part: the bat files tries to reboot the device into @fastboot@ mode using ADB shell. However D-Link requested ADB to be turned off for the device, so the @fastboot@ part fails. Basically you'll end up with a device that has new DSP software, but the Android part is unchanged. Fortunately the device stays operational after the failed update, only its LED is stuck on white instead of different colors/blinking.
74 1 domi
So the complete upgrade cycle would look like this (based on reading the bat files):
75 1 domi
76 1 domi
<pre>
77 1 domi
Start 1key.bat -> Installs drivers (ADB, QDLoader, Fastboot) -> Runs dl.exe -> Device goes into QDL mode -> MBN files are flashed -> Device reboots
78 1 domi
-> ADB shell to reboot into fastboot mode -> Android images are flashed using fastboot (rootfs, usr) -> Device rebooted again, check if it is not stuck in bootloader -> Done.
79 1 domi
</pre>
80 1 domi
81 1 domi
h3. Analyzing the firmware
82 1 domi
83 1 domi
Since it is just YAFFS2 it was easy to unpack the firmware and poke around it. No encryption/signatures/etc. was in place.
84 1 domi
It is, as suspected, Linux.
85 2 domi
They supply 2 YAFFS2 images: one is the @rootfs@, the other is @/usr@
86 1 domi
87 2 domi
File list of @rootfs@
88 2 domi
89 1 domi
<pre>
90 1 domi
# ls -lha
91 1 domi
total 84K
92 1 domi
drwxr-xr-x 20 root root 4,0K aug   10 14:58 .
93 1 domi
drwxr-xr-x  5 root root 4,0K aug   10 15:30 ..
94 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 bin
95 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 boot
96 1 domi
-rw-r--r--  1 root root   47 aug   10 14:58 build.prop
97 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 cache
98 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 dev
99 1 domi
drwxr-xr-x 30 root root 4,0K aug   10 14:58 etc
100 1 domi
drwxr-xr-x  3 root root 4,0K aug   10 14:58 home
101 1 domi
drwxr-xr-x  5 root root 4,0K aug   10 14:58 lib
102 1 domi
lrwxrwxrwx  1 root root   12 aug   10 14:58 linuxrc -> /bin/busybox
103 1 domi
drwxr-xr-x 10 root root 4,0K aug   10 14:58 media
104 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 mnt
105 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 proc
106 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 sbin
107 1 domi
lrwxrwxrwx  1 root root   11 aug   10 14:58 sdcard -> /media/card
108 1 domi
drwxr-xr-x  3 root root 4,0K aug   10 14:58 share
109 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 sys
110 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 tmp
111 1 domi
drwxr-xr-x  2 root root 4,0K aug   10 14:58 usr
112 1 domi
drwxr-xr-x  8 root root 4,0K aug   10 14:58 var
113 1 domi
drwxr-xr-x  3 root root 4,0K aug   10 14:58 WEBSERVER
114 1 domi
drwxr-xr-x  5 root root 4,0K aug   10 14:58 www
115 1 domi
</pre>
116 1 domi
117 2 domi
The @WEBSERVER@ and @www@ directory are there for the WiFi router versions which use a web-based interface for settings.
118 1 domi
119 1 domi
I was mainly curious about ADB, so I followed the @/etc/init.d/usb@ script. It saves the USB device id of the device to a file, then based on the id it starts a bash script located in @/usr/bin/usb/compositions@
120 1 domi
121 1 domi
<pre>
122 1 domi
ls -lha bin/usb/compositions/
123 1 domi
total 228K
124 1 domi
drwxr-xr-x 2 root root 4,0K aug   10 14:58 .
125 1 domi
drwxr-xr-x 3 root root 4,0K aug   10 14:28 ..
126 1 domi
-rw-r--r-- 1 root root 3,8K aug   10 14:28 2033
127 1 domi
-rw-r--r-- 1 root root 4,0K aug   10 14:28 2034
128 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 2037
129 1 domi
-rw-r--r-- 1 root root 3,8K aug   10 14:28 3443
130 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 3444
131 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 4030
132 1 domi
-rw-r--r-- 1 root root 3,8K aug   10 14:58 7e35
133 1 domi
-rw-r--r-- 1 root root 4,6K aug   10 14:28 7e35A
134 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 7e37
135 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 7e38
136 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 7e39
137 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 7e3c
138 1 domi
-rw-r--r-- 1 root root 3,8K aug   10 14:28 7e3d
139 1 domi
-rw-r--r-- 1 root root 2,3K aug   10 14:28 9002
140 1 domi
-rw-r--r-- 1 root root 2,2K aug   10 14:28 901C
141 1 domi
-rw-r--r-- 1 root root 2,8K aug   10 14:28 901D
142 1 domi
-rw-r--r-- 1 root root 3,4K aug   10 14:28 9021
143 1 domi
-rw-r--r-- 1 root root 3,4K aug   10 14:28 9022
144 1 domi
-rw-r--r-- 1 root root 2,7K aug   10 14:28 9024
145 1 domi
-rw-r--r-- 1 root root 3,6K aug   10 14:28 9025
146 1 domi
-rw-r--r-- 1 root root 3,5K aug   10 14:28 9026
147 1 domi
-rw-r--r-- 1 root root 2,7K aug   10 14:28 902A
148 1 domi
-rw-r--r-- 1 root root 2,7K aug   10 14:28 902B
149 1 domi
-rw-r--r-- 1 root root 2,7K aug   10 14:28 902C
150 1 domi
-rw-r--r-- 1 root root 2,8K aug   10 14:28 902D
151 1 domi
-rw-r--r-- 1 root root 3,9K aug   10 14:28 902E
152 1 domi
-rw-r--r-- 1 root root 3,3K aug   10 14:28 9043
153 1 domi
-rw-r--r-- 1 root root 3,0K aug   10 14:28 9046
154 1 domi
-rw-r--r-- 1 root root 2,4K aug   10 14:28 9047
155 1 domi
-rw-r--r-- 1 root root 3,5K aug   10 14:28 9049
156 1 domi
-rw-r--r-- 1 root root 2,2K aug   10 14:28 904A
157 1 domi
-rw-r--r-- 1 root root 3,6K aug   10 14:28 9056
158 1 domi
-rw-r--r-- 1 root root 2,7K aug   10 14:28 9057
159 1 domi
-rw-r--r-- 1 root root 2,9K aug   10 14:28 9059
160 1 domi
-rw-r--r-- 1 root root 3,2K aug   10 14:28 905A
161 1 domi
-rw-r--r-- 1 root root 3,0K aug   10 14:28 905B
162 1 domi
-rw-r--r-- 1 root root 2,2K aug   10 14:28 9060
163 1 domi
-rw-r--r-- 1 root root 3,2K aug   10 14:28 9063
164 1 domi
-rw-r--r-- 1 root root 4,4K aug   10 14:28 9064
165 1 domi
-rw-r--r-- 1 root root 4,0K aug   10 14:28 9067
166 1 domi
-rw-r--r-- 1 root root 3,0K aug   10 14:28 9083
167 1 domi
-rw-r--r-- 1 root root 3,0K aug   10 14:28 9084
168 1 domi
-rw-r--r-- 1 root root 3,1K aug   10 14:28 9085
169 1 domi
-rw-r--r-- 1 root root  127 aug   10 14:28 empty
170 1 domi
-rw-r--r-- 1 root root    2 aug   10 14:28 hsic_next
171 1 domi
-rw-r--r-- 1 root root    5 aug   10 14:28 hsusb_next
172 1 domi
</pre>
173 1 domi
174 1 domi
Looking into the file @7e35@ (the id of the D-Link device) reveals why ADB is missing - the Android USB Gadget is configured without ADB:
175 1 domi
176 1 domi
<pre>
177 1 domi
# cat bin/usb/compositions/7e35
178 1 domi
179 1 domi
#!/bin/sh
180 1 domi
#
181 1 domi
# Copyright (c) 2012, The Linux Foundation. All rights reserved.
182 1 domi
#
183 1 domi
# Redistribution and use in source and binary forms, with or without
184 1 domi
# modification, are permitted provided that the following conditions are met:
185 1 domi
#     * Redistributions of source code must retain the above copyright
186 1 domi
#       notice, this list of conditions and the following disclaimer.
187 1 domi
#     * Redistributions in binary form must reproduce the above copyright
188 1 domi
#       notice, this list of conditions and the following disclaimer in the
189 1 domi
#       documentation and/or other materials provided with the distribution.
190 1 domi
#     * Neither the name of The Linux Foundation nor the names of its
191 1 domi
#       contributors may be used to endorse or promote products derived from
192 1 domi
#       this software without specific prior written permission.
193 1 domi
#
194 1 domi
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
195 1 domi
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
196 1 domi
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE DISCLAIMED.  IN NO
197 1 domi
# EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
198 1 domi
# INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
199 1 domi
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
200 1 domi
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
201 1 domi
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
202 1 domi
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
203 1 domi
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
204 1 domi
205 1 domi
# DESCRIPTION: DIAG + MODEM + AT + NMEA + QMI_RMNET + ADB + Mass Storage (Android)
206 1 domi
207 1 domi
echo "Switching to composition number 0x7e35"
208 1 domi
209 1 domi
if [ "$1" = "y" ]; then
210 1 domi
	num="1"
211 1 domi
else
212 1 domi
	num="0"
213 1 domi
fi
214 1 domi
215 1 domi
echo 0 > /sys/class/android_usb/android$num/enable
216 1 domi
if [ "$2" = "y" ]; then 
217 1 domi
	echo 0xAB00 > /sys/class/android_usb/android$num/idProduct
218 1 domi
	echo 0x2001 > /sys/class/android_usb/android$num/idVendor
219 1 domi
	echo mass_storage > /sys/class/android_usb/android$num/functions
220 1 domi
	echo 1 > /sys/class/android_usb/android$num/enable
221 1 domi
else
222 1 domi
	run_9x15() {
223 1 domi
		echo 0x7e35 > /sys/class/android_usb/android$num/idProduct
224 1 domi
		echo 0x2001 > /sys/class/android_usb/android$num/idVendor
225 1 domi
		echo diag > /sys/class/android_usb/android0/f_diag/clients
226 1 domi
		echo smd,smd,tty > /sys/class/android_usb/android0/f_serial/transports
227 1 domi
		echo SMD,BAM2BAM > /sys/class/android_usb/android0/f_rmnet/transports
228 1 domi
		echo diag,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
229 1 domi
 		echo 1 > /sys/class/android_usb/android$num/enable
230 1 domi
  	}
231 1 domi
232 1 domi
	run_9x25() {
233 1 domi
		echo 0x7e35 > /sys/class/android_usb/android$num/idProduct
234 1 domi
		echo 0x2001 > /sys/class/android_usb/android$num/idVendor
235 1 domi
		echo diag > /sys/class/android_usb/android0/f_diag/clients
236 1 domi
		echo smd,smd,tty > /sys/class/android_usb/android0/f_serial/transports
237 1 domi
		echo SMD,BAM2BAM_IPA > /sys/class/android_usb/android0/f_rmnet/transports
238 1 domi
		echo diag,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
239 1 domi
 		echo 1 > /sys/class/android_usb/android$num/enable
240 1 domi
	}
241 1 domi
242 1 domi
	run_9x25_v2() {
243 1 domi
		echo 0x7e35 > /sys/class/android_usb/android$num/idProduct
244 1 domi
		echo 0x2001 > /sys/class/android_usb/android$num/idVendor
245 1 domi
		echo 0123456789ABCDEF > /sys/class/android_usb/android$num/iSerial
246 1 domi
		echo diag > /sys/class/android_usb/android0/f_diag/clients
247 1 domi
		echo smd,smd,tty > /sys/class/android_usb/android0/f_serial/transports
248 1 domi
		echo QTI,BAM2BAM_IPA > /sys/class/android_usb/android0/f_rmnet/transports
249 1 domi
		echo diag,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
250 1 domi
 		echo 1 > /sys/class/android_usb/android$num/enable
251 1 domi
	}
252 1 domi
253 1 domi
	case `source /usr/bin/usb/target` in
254 1 domi
		*9x15* )
255 1 domi
			run_9x15 &
256 1 domi
			;;
257 1 domi
		*9x25* )
258 1 domi
			case `cat /sys/devices/soc0/revision` in
259 1 domi
				*1.0* )
260 1 domi
					run_9x25 &
261 1 domi
					;;
262 1 domi
				*2.* )
263 1 domi
					run_9x25_v2 &
264 1 domi
					;;
265 1 domi
				* )
266 1 domi
					run_9x25 &
267 1 domi
					;;
268 1 domi
			esac
269 1 domi
			;;
270 1 domi
		* )
271 1 domi
			run_9x15 &
272 1 domi
			;;
273 1 domi
  	esac
274 1 domi
fi
275 1 domi
276 1 domi
</pre>
277 1 domi
278 2 domi
Simple adding @adb@ to the echos should be enough, based on the other script files. So I added the string @adb@ to the right places in the file, re-packed the @usr@ YAFFS2 image just to find out that because I could not get it into fastboot mode...so if someone could find a way to put the dongle into fastboot mode then simply installing a patched firmware file would enable ADB on the device.
279 1 domi
280 1 domi
So now the question arises: what kind of dongle would you need to buy that has ADB out of the box? I could tell you the USB device id of such devices:
281 1 domi
282 1 domi
<pre>
283 1 domi
grep -r adb .
284 1 domi
./905A:	echo diag,adb,usb_mbim:ecm_qc > /sys/class/android_usb/android$num/functions
285 1 domi
./905A:	echo diag,adb,usb_mbim:ecm_qc > /sys/class/android_usb/android$num/functions
286 1 domi
./9025:	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
287 1 domi
./9025:	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
288 1 domi
./9025:	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
289 1 domi
./9022:	echo diag,adb,rmnet > /sys/class/android_usb/android$num/functions
290 1 domi
./9022:	echo diag,adb,rmnet > /sys/class/android_usb/android$num/functions
291 1 domi
./9022:	echo diag,adb,rmnet > /sys/class/android_usb/android$num/functions
292 1 domi
./9059:	echo rndis_qc,diag,adb:ecm_qc > /sys/class/android_usb/android$num/functions
293 1 domi
./9059:	echo rndis,diag,adb:ecm_qc > /sys/class/android_usb/android$num/functions
294 1 domi
./9064:	echo diag,adb,serial,rmnet:ecm_qc:usb_mbim > /sys/class/android_usb/android$num/functions
295 1 domi
./9064:	echo diag,adb,serial,rmnet:ecm:usb_mbim > /sys/class/android_usb/android$num/functions
296 1 domi
./9064:	echo diag,adb,serial,rmnet:ecm_qc:usb_mbim > /sys/class/android_usb/android$num/functions
297 1 domi
./9046:	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
298 1 domi
./9046:	echo diag,adb,serial,rmnet,mass_storage > /sys/class/android_usb/android$num/functions
299 1 domi
./9024:	echo rndis_qc,adb > /sys/class/android_usb/android$num/functions
300 1 domi
./9024:	echo rndis,adb > /sys/class/android_usb/android$num/functions
301 1 domi
./9049:	echo diag,adb,serial,rmnet,mass_storage,qdss > /sys/class/android_usb/android$num/functions
302 1 domi
./9049:	echo diag,adb,serial,rmnet,mass_storage,qdss > /sys/class/android_usb/android$num/functions
303 1 domi
./9049:	echo diag,adb,serial,rmnet,mass_storage,qdss > /sys/class/android_usb/android$num/functions
304 1 domi
./902D:	echo rndis_qc,diag,adb > /sys/class/android_usb/android$num/functions
305 1 domi
./902D:	echo rndis,diag,adb > /sys/class/android_usb/android$num/functions
306 1 domi
./901D:	echo diag,adb > /sys/class/android_usb/android$num/functions
307 1 domi
./901D:	echo diag,adb > /sys/class/android_usb/android$num/functions
308 1 domi
./9084:	echo diag,qdss,adb,rmnet > /sys/class/android_usb/android$num/functions
309 1 domi
./9084:	echo diag,qdss,adb,rmnet > /sys/class/android_usb/android$num/functions
310 1 domi
./902B:	echo rndis_qc,adb,mass_storage > /sys/class/android_usb/android$num/functions
311 1 domi
./902B:	echo rndis,adb,mass_storage > /sys/class/android_usb/android$num/functions
312 1 domi
./9085:	echo diag,adb,usb_mbim,gps > /sys/class/android_usb/android$num/functions
313 1 domi
./9085:	echo diag,adb,usb_mbim,gps > /sys/class/android_usb/android$num/functions
314 1 domi
./2034:	echo rndis_qc,diag,serial,adb,mass_storage > /sys/class/android_usb/android$num/functions
315 1 domi
./2034:	echo rndis,diag,serial,adb,mass_storage > /sys/class/android_usb/android$num/functions
316 1 domi
./2034:	echo rndis,diag,serial,adb,mass_storage > /sys/class/android_usb/android$num/functions
317 1 domi
./9060:	echo diag,qdss,adb > /sys/class/android_usb/android$num/functions
318 1 domi
./9056:	echo diag,adb,serial,rmnet,mass_storage,audio > /sys/class/android_usb/android$num/functions
319 1 domi
./9056:	echo diag,adb,serial,rmnet,mass_storage,audio > /sys/class/android_usb/android$num/functions
320 1 domi
./9056:	echo diag,adb,serial,rmnet,mass_storage,audio > /sys/class/android_usb/android$num/functions
321 1 domi
</pre>
322 1 domi
323 2 domi
It would be great to find out the actual vendor of these, so we can tell people exactly what to buy. I'm assuming Chinese LTE dongles from eBay are prime candidates, but that's just a guess.
324 9 domi
325 9 domi
UPDATE:
326 9 domi
Starting to collect devices (based on Internet searches, so no warranty on these):
327 10 domi
* Alcatel/Bell ASB TL131 - 05c6: *9025*
328 10 domi
* Novatel USB620L (Enterprise mode?) - 1410: *9022*
Add picture from clipboard (Maximum size: 48.8 MB)