Project

General

Profile

Actions

XMMProtocolInterfaces

usb_sel

HOWTO enable the modem usb interface

The modem also has an USB port that can be routed to the smartphone/tablet USB port.

To do that you first need to get a root shell in the device as the commands need to be executed as root.

Once this is done you need to switch the USB connector to the modem USB. This can be done with the following command:

echo MODEM > /sys/devices/virtual/sec/switch/usb_sel

Then nothing will happen, you will still be able to login through adb.

To make the device switch to the modem USB you then need to unplug and replug the USB cable between your computer and the device.

At this point, if the modem was booted, you'll see a new USB device appearing.
Some serial ports will also appear.

Tested on Replicant 6.0 0004 RC3

Device Distribution Modem status USB ids (lsusb from laptop) tty
GT-I9100 Replicant 6.0 0004 RC3 Off None N/A
GT-I9100 Replicant 6.0 0004 RC3 Booted 1519:0020 Comneon HSIC Device /dev/ttyACM0 -> /dev/ttyACM6
GT-I9300 Replicant 6.0 0004 RC3 Booted 1519:0020 Comneon HSIC Device /dev/ttyACM0 -> /dev/ttyACM6

When running lsusb on the SOC on the Replicant 11 kernel on a GT-I9300, we also see 1519:0020 Comneon HSIC Device once the modem is booted. Once powered on and before booting, the USB ids seen in lsusb with that kernel are these ones: 058b:0041 Infineon Technologies Flash Loader utility instead.

As the modem isn't visible either when not powered on, we need to look if it's possible to boot the modem from a laptop for instance.

Protocols

Device State UART Protocol
GT-I9100 modem booted /dev/ttyACM0 AT: GTI9100ModemTTYACM0
GT-I9100 modem booted /dev/ttyACM1 Compatible with xgoldmon
GT-I9300 modem booted /dev/ttyACM0 AT: GTI9300ModemTTYACM0
GT-I9100 modem booted /dev/ttyACM1 With Replicant 6, Xgoldmon waits for messages but nothing arrives,
we have some messages with the stock firmware though
GT-I9300 modem booted /dev/ttyACM3 AT: GTI9300ModemTTYACM0

Xgoldmon

description: Xgoldmon is a software that can get some cellular protocol traces from some Samsung phones using the samsung-ipc protocol.
git: https://github.com/2b-as/xgoldmon.git

GT-I9100

Xgoldmon seem to display things on the GT-I9100:

# ./xgoldmon -vvvv -i localhost -t s2 -l /dev/ttyACM1
LOG:>>[HIGH]oembatt.c,310,[DISP] Thermistor : measured_value=1630666778<<
LOG:>>[HIGH]oembatt.c,137,[DISP] oem_set_batt_level : 4220<<
LOG:>>[HIGH]oembatt.c,236,[DISP] BATT : measured_value_mv=4220, AvgBattVal_mv=4007, battery_level=5<<
LOG:>>[LOW]oemdisplay.c,363,no change -> rssi:4, bat:5<<
LOG:>>[HIGH]oembatt.c,310,[DISP] Thermistor : measured_value=1630666779<<
LOG:>>[HIGH]oembatt.c,137,[DISP] oem_set_batt_level : 4225<<
LOG:>>[HIGH]oembatt.c,236,[DISP] BATT : measured_value_mv=4225, AvgBattVal_mv=4026, battery_level=5<<
LOG:>>[LOW]oemdisplay.c,363,no change -> rssi:4, bat:5<<
LOG:>>[HIGH]oembatt.c,310,[DISP] Thermistor : measured_value=1630666778<<
LOG:>>[HIGH]oembatt.c,137,[DISP] oem_set_batt_level : 4220<<
LOG:>>[HIGH]oembatt.c,236,[DISP] BATT : measured_value_mv=4220, AvgBattVal_mv=4055, battery_level=5<<
LOG:>>[LOW]oemdisplay.c,363,no change -> rssi:4, bat:5<<

And when calling an (inexisting/invalid) number, the frames appear in Wireshark.

However on the GT-I9300 it waits for messages that never arrive.
And on the GT-I9100 there seem to be very few messages.

I did some tests and compared a GT-I9100 with Replicant 6 and one with the stock distribution (rooted) and the one running Replicant outputed very few messages while the one running the stock OS outputed many messages.

Both had the same result when running AT+TRACE? on /dev/ttyACM0:

at+trace?
+TRACE: 1,921600,"ap=1;st=1;db=1;pr=1;bt=1,lt=1;li=1;ga=1;ae=1","DTM",0

For more background on the values:

AT+TRACE=?
+TRACE: description START

at+trace=[<mode>],[<speed>],["<unit>=<umode>[,<unit>=<umode>[;...]]]",["<method>"],[PowerSavingCountdown]

<mode>:
       -------------------------------------------------------------
                                                                    0:        sets all units OFF [param <unit> will be ignored !]
                                                                                                                                 1:        sets all units ON  [param <unit> will be ignored !]
                                 no param: 3rd param. <units> configures trace-units
                                                                                              -> trace? will then display 128 as <mode>

<speed>: (115200,230400,460800,921600,1843200,3000000,3250000,6000000)

<units>:
        -------------
                     ap: apoxi
                              st: stack
                                       db: debug
                                                pr: printf
                                                          bt: bluetooth
                                                                       lt: LLT
                                                                              li: LwIP
                                                                                      gt: GATE
                                                                                              ae: AENEAS

<umode>:
        -----------------
                         0: unit-trace OFF
                                          1: unit-trace ON

<method>:
         --------------------------------
                                         "BTM":  byte stuffing trace method
                                                                           "DTM":  direct trace method
                                                                                                      "EBTM": extended byte stuffing trace method

<PowerSavingCountdown in msecs>: (0-30000)

i.e.:
     --------------------------------------------------
                                                       at+trace=0
                                                                 at+trace=,460800
                                                                                 at+trace=,115200,"st=1,pr=1,bt=1,ap=0,db=1,lt=0,li=0" 
                                                                                                                                      at+trace=,,"lt=1,db=1,ga=0" 
    at+trace=,,,"EBTM" 
                      at+trace=,,,,2000

+TRACE: description END

OK

On the stock OS I most followed xmongold procedure:

To enable the logging mode ("diag mode") on the S2, S3 and Note2:
- Go to the Phone application, enter *#9900# and set "Debug Level
  Enabled" to "HIGH". The phone will reboot.
- Go to the Phone application again, enter *#7284# and set "USB" to
  "MODEM" and tap "SAVE and RESET". The phone will reboot again.

But I didn't do the *#9900 thing as I didn't see any debug level.

I only had the following menu:

+-------------------------------------------------+
|              Run dumpstate/logcat/modem log     |
+-------------------------------------------------+
|              Delete dumpstate/logcat            |
+-------------------------------------------------+
|              run dumpstate/local                |
+-------------------------------------------------+
|              Copy kenrel log to the SD card     |
+-------------------------------------------------+
|              Run modem log                      |
+-------------------------------------------------+
|         Copy to sdcard(include CP Ramdump)      |
+-------------------------------------------------+
| Disable fast dormancy (Current State: Enabled ) |
+-------------------------------------------------+
|              Ramdump Mode Enable/HIGH           |
+-------------------------------------------------+
|                TCP DUMP START                   |
+-------------------------------------------------+
|        Enable SecLog (currently disabled)       |
+-------------------------------------------------+
|                             Exit                |
+-------------------------------------------------+

When using run modem log it did show the following popup:

+----------------------------+
| /!\ Dump Result            |
+----------------------------+
| GET MODEM LOG SUCCESS!     |
| Please copy to SDcard with |
| other Menu button.         |
+----------------------------+
|            OK              |
+----------------------------+

As for the following:

- Go to the Phone application again, enter *#7284# and set "USB" to
  "MODEM" and tap "SAVE and RESET". The phone will reboot again.

I didn't have any "SAVE and RESET" and I probably didn't need to reboot but I probably needed to disconnect and reconnect the USB cable.

The setting stay across reboots (I still have 1519:0020 Comneon HSIC Device) and in the recovery I don't have any USB device (anymore?).

In the one running Replicant I did AT+TRACE=1.

GT-I9300

On the GT-I9300, following this part:

- Go to the Phone application again, enter *#7284# and set "USB" to
  "MODEM" and tap "SAVE and RESET". The phone will reboot again.

results in the PARAM partition being written to . At the next boot the bootloader will configure the USB switch to connect to the modem USB. And if you install Replicant just after that, you end up with no adb in the recovery or in Replicant, though USB host works fine and heimdall also works fine.

I've also written a tool to diff the modem settings through AT commands, and it didn't find any difference beside with the AT+TRACE settings.

The goal was to find some differences after doing that:

- Go to the Phone application, enter *#9900# and set "Debug Level
  Enabled" to "HIGH". The phone will reboot.

Here I captured the settings with LOW and HIGH, and the only interesting difference is with AT+TRACE:

$ diff -u GT-I9300-main-stock-low-1.conf GT-I9300-main-stock-high-3.conf

[...]
-at+trace = ['+TRACE: 0,921600,"ap=0;st=0;db=0;pr=0;bt=0;lt=0;li=0;ga=0;ae=0","DTM",0']
+at+trace = ['+TRACE: 1,921600,"ap=1;st=1;db=1;pr=1;bt=1,lt=1;li=1;ga=1;ae=1","DTM",0']
[...]

Note that if we have +TRACE: 0,921600,"ap=0;st=0;db=0;pr=0;bt=0;lt=0;li=0;ga=0;ae=0","DTM",0, we can simply do AT+TRACE=1 to make it like it should (+TRACE: 1,921600,"ap=1;st=1;db=1;pr=1;bt=1,lt=1;li=1;ga=1;ae=1","DTM",0).

It seems that the bootloader is also involved here: Changing the settings result in modifications in the PARAM partition.

See GTI9300PARAM for more details on the research about it.

Upstream kernel

The upstream driver for the Galaxy SIII (GT-I9300) is in drivers/extcon/extcon-max77693.c

Once loaded we have:

[root@u-boot-i9300 ~]# uname -r
5.10.0-rc2+

[root@u-boot-i9300 ~]# cd /sys/class/extcon/extcon0
[root@u-boot-i9300 extcon0]# ls */
cable.0/:
name  state

cable.1/:
name  state

cable.2/:
name  state

cable.3/:
name  state

cable.4/:
name  state

cable.5/:
name  state

cable.6/:
name  state

cable.7/:
name  state

cable.8/:
name  state

cable.9/:
name  state

device/:
driver  driver_override  extcon  input  modalias  power  subsystem  uevent

power/:
async  autosuspend_delay_ms  control  runtime_active_kids  runtime_active_time  runtime_enabled  runtime_status  runtime_suspended_time  runtime_usage

subsystem/:
extcon0
[root@u-boot-i9300 extcon0]# grep . */name
cable.0/name:USB
cable.1/name:USB-HOST
cable.2/name:SDP
cable.3/name:DCP
cable.4/name:FAST-CHARGER
cable.5/name:SLOW-CHARGER
cable.6/name:CDP
cable.7/name:MHL
cable.8/name:JIG
cable.9/name:DOCK
[root@u-boot-i9300 extcon0]# grep .  */state
cable.0/state:1
cable.1/state:0
cable.2/state:1
cable.3/state:0
cable.4/state:0
cable.5/state:0
cable.6/state:0
cable.7/state:0
cable.8/state:0
cable.9/state:0

I'm unsure if switching from userspace is implemented or not.

Though some part looks unimplemented.

In gpio-rev00-m0.h in the smdk4412 kernel we have:

#define GPIO_USB_SEL            EXYNOS4212_GPJ0(1)

And the max77693-muic.c driver seems to use that to do the switch between the modem USB and the SOC USB.
And that seems to be used to switch to the modem USB.

Links

Updated by Denis 'GNUtoo' Carikli about 2 years ago · 46 revisions

Also available in: PDF HTML TXT