Difference between revisions of "Ericsson F3507g Mobile Broadband Module"
Line 4: | Line 4: | ||
* the card will not work without an inserted SIM, even the GPS function. If you want to use just GPS, any SIM would work, even if it is not attached to any active account with any GSM provider. | * the card will not work without an inserted SIM, even the GPS function. If you want to use just GPS, any SIM would work, even if it is not attached to any active account with any GSM provider. | ||
− | * the card provides | + | * the card provides three CDC ACM interfaces (<tt>CONFIG_USB_ACM=m</tt>), two CDC WDM interfaces (<tt>CONFIG_USB_WDM=m</tt>) and one CDC Ethernet interface (<tt>CONFIG_USB_NET_CDCETHER=m</tt>), and identifies them as |
− | **'''Note''': apparently, for a while <tt>option</tt> USB-serial driver had claimed USB ID <tt>0bdb:1900</tt>, but this was wrong, and as of kernel 2.6.28.9 that commit was reversed. If instead of <tt>/dev/ttyACM*</tt> you see <tt>/dev/ttyUSB*</tt>, it means that <tt>option</tt> module is loaded. You may need to blacklist it to make sure it doesn't happen. | + | root@localhost:/# for n in `ls /sys/class/*/*{ACM,wdm,usb0}*/device/interface`;do echo $(echo $n|awk -F '/' '{print $5}') : $(cat $n);done |
− | + | usb0 : Ericsson F3507g Mobile Broadband Minicard Network Adapter | |
− | + | ttyACM0 : Ericsson F3507g Mobile Broadband Minicard Modem | |
+ | ttyACM1 : Ericsson F3507g Mobile Broadband Minicard Data Modem | ||
+ | ttyACM2 : Ericsson F3507g Mobile Broadband Minicard GPS Port | ||
+ | cdc-wdm0 : Ericsson F3507g Mobile Broadband Minicard Device Management | ||
+ | cdc-wdm1 : Ericsson F3507g Mobile Broadband Minicard PC SC Port | ||
+ | '''Note''': | ||
+ | *apparently, for a while <tt>option</tt> USB-serial driver had claimed USB ID <tt>0bdb:1900</tt>, but this was wrong, and as of kernel 2.6.28.9 that commit was reversed. If instead of <tt>/dev/ttyACM*</tt> you see <tt>/dev/ttyUSB*</tt>, it means that <tt>option</tt> module is loaded. You may need to blacklist it to make sure it doesn't happen. | ||
+ | *Support for the CDC Ethernet interface appears only in kernel 2.6.28.8. But if your kernel is older, you can still connect to the net using one of the "Modem" interfaces. | ||
− | + | As Ericsson's naming scheme suggests, idealy we would use <tt>/dev/cdc-wdm0</tt> for controlling the card, <tt>usb0</tt> as a network device, <tt>/dev/ttyACM0</tt> or <tt>/dev/ttyACM1</tt> as a modem, and <tt>/dev/ttyACM2</tt> for GPS. This works for manual testing, but unfortunately, due to [http://markmail.org/message/2sd7culbgekugow2 limitations] of <tt>chat</tt>, does not play very well in scripts. So, instead of <tt>/dev/cdc-wdm0</tt>, for controlling the card we will use <tt>/dev/ttyACM1</tt>. | |
==Turning the card on== | ==Turning the card on== | ||
Line 17: | Line 24: | ||
AT+CPIN? | AT+CPIN? | ||
− | to <tt>/dev/ttyACM1</tt>. You can do it with any terminal terminal program like <tt>minicom</tt>. If the answer is | + | to <tt>/dev/ttyACM1</tt>. You can do it with any terminal terminal program like <tt>cu</tt> or <tt>minicom</tt>. If the answer is |
+CPIN: READY | +CPIN: READY | ||
Line 49: | Line 56: | ||
AT+CFUN=0 | AT+CFUN=0 | ||
− | to <tt>/dev/ttyACM1</tt>. Be carefull with the last command. It turns the card completely off, and it will no longer accept any AT-commands before the hard reset. To physically reset the card flip the wireless switch off, and then on. You can do the same by sending | + | to <tt>/dev/ttyACM1</tt>. Be carefull with the last command. It turns the card completely off, and it will no longer accept any AT-commands before the hard reset. To physically reset the card flip the wireless switch off, and then on. You can do the same by sending <tt>echo 0 > /sys/devices/platform/thinkpad_acpi/wwan_enable</tt> (to turn off) and then <tt>echo 1 > /sys/devices/platform/thinkpad_acpi/wwan_enable</tt> (to turn on). |
==Using the card as a wireless modem== | ==Using the card as a wireless modem== | ||
− | Once the card is turned on, there are two ways to connect to the net. The first one is just to use the card as any "normal" GPRS modem and start <tt>pppd</tt> daemon on one of <tt>/dev/ttyACM*</tt> . The other way is | + | Once the card is turned on, there are two ways to connect to the net. The first one is just to use the card as any "normal" GPRS modem and start <tt>pppd</tt> daemon on one of <tt>/dev/ttyACM*</tt>. The other way is to use CDC Ethernet interface. It is supposed to be more efficient, but it requires a pretty recent (>=2.6.28.8) kernel. |
====Connecting to the net via pppd==== | ====Connecting to the net via pppd==== | ||
Line 73: | Line 80: | ||
AT+CGDCONT=1,"IP","'''proxy'''" | AT+CGDCONT=1,"IP","'''proxy'''" | ||
− | to <tt>/dev/ttyACM1</tt>. Instead of "'''proxy'''" you may need to use to something else. Find the appropriate APN [http://www.pinstack.com/carrier_settings_apn_gateway.html here] | + | to <tt>/dev/ttyACM1</tt>. Instead of "'''proxy'''" you may need to use to something else. Find the appropriate APN [http://www.pinstack.com/carrier_settings_apn_gateway.html here]. To initiate the connection, send |
− | |||
− | |||
− | |||
− | |||
AT*ENAP=1,1 | AT*ENAP=1,1 | ||
Line 220: | Line 223: | ||
post-down . /usr/local/bin/F3507g; turnoff_F3507g_usbnet; turnoff_F3507g; powerdown_F3507g | post-down . /usr/local/bin/F3507g; turnoff_F3507g_usbnet; turnoff_F3507g; powerdown_F3507g | ||
− | If you are going to | + | If you are going to connect via <tt>pppd</tt>, you would need to install '''wvdial''' package and configure <tt>/etc/wvdial.conf</tt> to look like this: |
− | |||
− | |||
− | |||
− | and configure <tt>/etc/wvdial.conf</tt> to look like this: | ||
[Dialer 3G] | [Dialer 3G] | ||
Line 239: | Line 238: | ||
==Other thoughts== | ==Other thoughts== | ||
− | While <tt>AT+CFUN=*</tt> and <tt>AT+CPIN=*</tt> are pretty standard commands for wireless modems and are well-documented (e.g. [http://developer.sonyericsson.com/getDocument.do?docId=65054 here] and [http://www.sierrawireless.com/resources/documents/support/2130617_Supported_AT_Command_Reference_Rev_2.1.pdf here]), it appears that the commands <tt>AT*E2GPSCTL</tt> and <tt>AT*E2GPSNPD</tt> are unique to the Ericsson F3507g card. All credit for discovering them goes to "Nickolai Zeldovich" who left a comment in this [http://redmonk.com/sogrady/2008/09/24/apone/ thread]. I imagine one could find them via a USB sniffer on a working Windows machine (or a Linux machine with Windows running in a virtual machine). Another way to get them is to try to look for "gps" string in | + | While <tt>AT+CFUN=*</tt> and <tt>AT+CPIN=*</tt> are pretty standard commands for wireless modems and are well-documented (e.g. [http://developer.sonyericsson.com/getDocument.do?docId=65054 here] and [http://www.sierrawireless.com/resources/documents/support/2130617_Supported_AT_Command_Reference_Rev_2.1.pdf here]), it appears that the commands <tt>AT*E2GPSCTL</tt> and <tt>AT*E2GPSNPD</tt> are unique to the Ericsson F3507g card. All credit for discovering them goes to "Nickolai Zeldovich" who left a comment in this [http://redmonk.com/sogrady/2008/09/24/apone/ thread]. I imagine one could find them via a USB sniffer on a working Windows machine (or a Linux machine with Windows running in a virtual machine). Another way to get them is to try to look for "gps" string in Windows drivers. What is interesting, F3507g supports a few other AT-commands with "GPS" substring (you can get all supported AT-commands by sending <tt>AT*</tt> to <tt>/dev/ttyACM1</tt> after activating it with <tt>AT+CFUN=1</tt>). Anyway, there is a [http://www.natisbad.org/E4300/Dell_Wireless_5530_AT_cmd_ref.html project] aiming to document all AT-commands for the Ericsson F3507g card. |
==Related Links== | ==Related Links== | ||
Line 252: | Line 251: | ||
*{{X301}} | *{{X301}} | ||
*{{T400}} | *{{T400}} | ||
− | |||
− | |||
− |
Revision as of 20:20, 10 April 2009
Contents
Here are some basics about Ericsson F3507g MiniPCIe WWAN/GPS card (USB ID 0bdb:1900 and 0bdb:1902):
- the card will not work without an inserted SIM, even the GPS function. If you want to use just GPS, any SIM would work, even if it is not attached to any active account with any GSM provider.
- the card provides three CDC ACM interfaces (CONFIG_USB_ACM=m), two CDC WDM interfaces (CONFIG_USB_WDM=m) and one CDC Ethernet interface (CONFIG_USB_NET_CDCETHER=m), and identifies them as
root@localhost:/# for n in `ls /sys/class/*/*{ACM,wdm,usb0}*/device/interface`;do echo $(echo $n|awk -F '/' '{print $5}') : $(cat $n);done usb0 : Ericsson F3507g Mobile Broadband Minicard Network Adapter ttyACM0 : Ericsson F3507g Mobile Broadband Minicard Modem ttyACM1 : Ericsson F3507g Mobile Broadband Minicard Data Modem ttyACM2 : Ericsson F3507g Mobile Broadband Minicard GPS Port cdc-wdm0 : Ericsson F3507g Mobile Broadband Minicard Device Management cdc-wdm1 : Ericsson F3507g Mobile Broadband Minicard PC SC Port
Note:
- apparently, for a while option USB-serial driver had claimed USB ID 0bdb:1900, but this was wrong, and as of kernel 2.6.28.9 that commit was reversed. If instead of /dev/ttyACM* you see /dev/ttyUSB*, it means that option module is loaded. You may need to blacklist it to make sure it doesn't happen.
- Support for the CDC Ethernet interface appears only in kernel 2.6.28.8. But if your kernel is older, you can still connect to the net using one of the "Modem" interfaces.
As Ericsson's naming scheme suggests, idealy we would use /dev/cdc-wdm0 for controlling the card, usb0 as a network device, /dev/ttyACM0 or /dev/ttyACM1 as a modem, and /dev/ttyACM2 for GPS. This works for manual testing, but unfortunately, due to limitations of chat, does not play very well in scripts. So, instead of /dev/cdc-wdm0, for controlling the card we will use /dev/ttyACM1.
Turning the card on
First, check whenever the SIM is protected by PIN by sending
AT+CPIN?
to /dev/ttyACM1. You can do it with any terminal terminal program like cu or minicom. If the answer is
+CPIN: READY
then the SIM is unlocked. If the answer is
+CPIN: SIM PIN
you need first to unlock it by sending
AT+CPIN="YOUR-PIN"
to /dev/ttyACM1. Now the card can be turned on by sending
AT+CFUN=1
to /dev/ttyACM1. The answer should be
+PACSP0
Don't try to do anything until you see it.
Turning the card off
To put the card into energy-saving mode (this is the default), you can send
AT+CFUN=4
to /dev/ttyACM1. To remove all power from the card, send
AT+CFUN=0
to /dev/ttyACM1. Be carefull with the last command. It turns the card completely off, and it will no longer accept any AT-commands before the hard reset. To physically reset the card flip the wireless switch off, and then on. You can do the same by sending echo 0 > /sys/devices/platform/thinkpad_acpi/wwan_enable (to turn off) and then echo 1 > /sys/devices/platform/thinkpad_acpi/wwan_enable (to turn on).
Using the card as a wireless modem
Once the card is turned on, there are two ways to connect to the net. The first one is just to use the card as any "normal" GPRS modem and start pppd daemon on one of /dev/ttyACM*. The other way is to use CDC Ethernet interface. It is supposed to be more efficient, but it requires a pretty recent (>=2.6.28.8) kernel.
Connecting to the net via pppd
For the first approach, the easiest way to do it is to use wvdial. For example, to connect to AT&T Wireless network, your /etc/wvdial.conf would have to be something like this
[Dialer 3G] Modem = /dev/ttyACM0 Init1 = AT+CGDCONT=1,"IP","proxy" Stupid mode = 1 phone= *99# Username = * Password = *
Note: if you are using a SIM from a different mobile provider, you may need to change the access point name (APN) "proxy" in Init1 string and Username/Password to something else. You can find the appropriate APN here.
Connecting to the net via CDC Ethernet interface
The second approach works for kernels >=2.6.28.8. Configure the APN by sending
AT+CGDCONT=1,"IP","proxy"
to /dev/ttyACM1. Instead of "proxy" you may need to use to something else. Find the appropriate APN here. To initiate the connection, send
AT*ENAP=1,1
to /dev/ttyACM1. Now, if your wireless provider lets you in, you are connected. Launch dhclient
dhclient usb0
and start surfing the net. To disconnect, send
AT*ENAP=0
to /dev/ttyACM1.
Using the card as a GPS receiver
Once the card is turned on, we can use it to get GPS info via NMEA protocol. First, you have to configure the a few NMEA options. It is done by sending
AT*E2GPSCTL=X,Y,Z
to /dev/ttyACM1. Here
- X can be 0 (NMEA stream turned off) or 1 (NMEA stream turned on)
- Y can be an integer form 1 to 60, and sets the frequency of how often the card emits the NMEA sentences
- Z can be 0 (DGPS is turned off) or 1 (DGPS is turned on)
so, to configure the GPSr to update every 5 seconds, and turn DGPS on, you would send
AT*E2GPSCTL=1,5,1
to /dev/ttyACM1. Once the GPSr is configured, we can get the NMEA stream on /dev/ttyACM2 by sending
AT*E2GPSNPD
to /dev/ttyACM2. Once you do that, /dev/ttyACM2 will no longer accept any new AT-commands. But you still can change the the behavior of the NMEA stream by sending the appropriate
AT*E2GPSCTL=X,Y,Z
to /dev/ttyACM1. Now you can read the NMEA stream by saying
cat /dev/ttyACM2
or better yet, start gpsd interface on /dev/ttyACM2.
Scripting everything
Install sysfsutils and gpsd packages with
apt-get install sysfsutils gpsd
I use sysfsutils to completely power off the F3507g card on boot, in order to save power (this is worth doing because on my X301 running the 3G device increases the power consumption by more than 10%. I have not tested how much more power is used if the device is not online and configured in low power mode, but it's reasonable to assume it is more than zero). I also power off the bluetooth, disable the white LED in the power button, and instruct the kernel to use the noop scheduler for the SSD. Edit /etc/sysfs.conf to look like this:
block/sda/queue/scheduler = noop devices/platform/thinkpad_acpi/bluetooth_enable = 0 devices/platform/thinkpad_acpi/wwan_enable = 0 class/leds/tpacpi::power/brightness = 0
These will now be applied on boot, but when the laptop wakes from sleep the BIOS seems to undo some of these settings, so create a script named /etc/pm/sleep.d/10sysfsutils:
#!/bin/bash case $1 in (hibernate|suspend) ;; (thaw|resume) /etc/init.d/sysfsutils start ;; *) echo "somebody is calling me totally wrong." ;; esac
Don't forget to chmod a+x /etc/pm/sleep.d/sysfsutils. This script will be called when the laptop wakes up and it will power-off the 3G WWAN device again. Create a file called /usr/local/bin/F3507g containing the following:
#!/bin/bash CONTROL_DEVICE=/dev/ttyACM1 GPS_DEVICE=/dev/ttyACM2 PIN="" APN="proxy" powerup_F3507g () { echo -n "Powering up F3507g card.." echo 1 > /sys/devices/platform/thinkpad_acpi/wwan_enable while [ ! -c $CONTROL_DEVICE ]; do sleep 0.5; echo -n "."; done echo "done" } turnon_F3507g () { echo -n "Turning on F3507g card..." if [ "$PIN" != "" ]; then /usr/sbin/chat -v "" "AT+CPIN?" "SIM PIN" "AT" "OK" "AT+CPIN=\"$PIN\"" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE fi /usr/sbin/chat -v "" "AT+CPIN?" "READY" "AT+CFUN=1" "+PACSP0" "AT" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE echo "done" } turnoff_F3507g () { echo -n "Turning off F3507g card..." killall gpsd /usr/sbin/chat -v "" "AT+CFUN=4" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE echo "done" } powerdown_F3507g () { echo -n "Powering down F3507g card.." echo 0 > /sys/devices/platform/thinkpad_acpi/wwan_enable while [ -c $CONTROL_DEVICE ]; do sleep 0.5; echo -n "."; done echo "done" } turnon_GPS () { echo -n "Starting NMEA stream on $GPS_DEVICE..." /usr/sbin/chat -v "" "AT*E2GPSCTL=1,3,1" "OK" "AT*E2GPSNPD" "GPGGA" > $GPS_DEVICE < $GPS_DEVICE gpsd $GPS_DEVICE echo " done" } turnon_F3507g_usbnet () { echo -n "Starting usbnet connection..." /usr/sbin/chat -v "" "AT+CGDCONT=1,\"IP\",\"$APN\"" "OK" "AT*ENAP=1,1" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE echo " done" } turnoff_F3507g_usbnet () { echo -n "Stopping usbnet connection..." /usr/sbin/chat -v "" "AT*ENAP=0" "OK" > $CONTROL_DEVICE < $CONTROL_DEVICE echo " done" }
Make this script executable with chmod a+x /usr/local/bin/F3507g. Instead of APN="proxy" you may need to use to something else. Find the appropriate APN here. Append the following lines to your /etc/network/interfaces file
iface 3G inet wvdial pre-up . /usr/local/bin/F3507g; powerup_F3507g; turnon_F3507g post-down . /usr/local/bin/F3507g; turnoff_F3507g; powerdown_F3507g provider 3G iface gps inet manual pre-up . /usr/local/bin/F3507g; powerup_F3507g; turnon_F3507g; turnon_GPS post-down . /usr/local/bin/F3507g; turnoff_F3507g; powerdown_F3507g iface usb0 inet dhcp pre-up . /usr/local/bin/F3507g; powerup_F3507g; turnon_F3507g; turnon_F3507g_usbnet post-down . /usr/local/bin/F3507g; turnoff_F3507g_usbnet; turnoff_F3507g; powerdown_F3507g
If you are going to connect via pppd, you would need to install wvdial package and configure /etc/wvdial.conf to look like this:
[Dialer 3G] Modem = /dev/ttyACM0 Init1 = AT+CGDCONT=1,"IP","proxy" Stupid mode = 1 phone= *99# Username = * Password = *
Note: you may need to change the access point name (APN) "proxy" in Init1 string and Username/Password to something else. Find the appropriate APN here.
Now broadband connection could be started in the same way as you start any other network interface, just by saying sudo ifup usb0 (or sudo ifup 3G if connecting via pppd). To shut it down, say sudo ifdown usb0 (or sudo ifdown 3G). Similarly, GPS interface is started by sudo ifup gps and turned off by sudo ifdown gps. Once you get a fix, you can use your favourite GPS mapping application like tangogps. The "cold start" seems to take quite a bit however, and sometimes it cannot get a fix if indoors.
Other thoughts
While AT+CFUN=* and AT+CPIN=* are pretty standard commands for wireless modems and are well-documented (e.g. here and here), it appears that the commands AT*E2GPSCTL and AT*E2GPSNPD are unique to the Ericsson F3507g card. All credit for discovering them goes to "Nickolai Zeldovich" who left a comment in this thread. I imagine one could find them via a USB sniffer on a working Windows machine (or a Linux machine with Windows running in a virtual machine). Another way to get them is to try to look for "gps" string in Windows drivers. What is interesting, F3507g supports a few other AT-commands with "GPS" substring (you can get all supported AT-commands by sending AT* to /dev/ttyACM1 after activating it with AT+CFUN=1). Anyway, there is a project aiming to document all AT-commands for the Ericsson F3507g card.
Related Links
Bugs
- Ubuntu: works natively only on kernels <= 2.6.27-10-generic. > 2.6.27-10-generic kernels will not power on the device appropriately in my testing. See Ubuntu bug here.