summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2016-03-15 13:24:58 +0100
committerBjørn Mork <bjorn@mork.no>2016-03-15 13:24:58 +0100
commit17aa9ab8124053d4714b4379b88d0e53967f0473 (patch)
treec30808d986a855e26c997c169cea8c867cf22606
parentf9a54315a2453978b4771098515fc315719c0ada (diff)
qmi.pl: add SWI modem status
Signed-off-by: Bjørn Mork <bjorn@mork.no>
-rwxr-xr-xscripts/qmi.pl195
1 files changed, 192 insertions, 3 deletions
diff --git a/scripts/qmi.pl b/scripts/qmi.pl
index dd727b2..a961f0b 100755
--- a/scripts/qmi.pl
+++ b/scripts/qmi.pl
@@ -552,11 +552,65 @@ my %msg = (
decode => sub { return "SCell index: " . $_[0]->[0] },
},
},
- );
+ # Sierra Wireless vendor specific
+ 0x5556 => {
+ name => 'SWI_MODEM_STATUS',
+ 0x01 => {
+ name => 'Common Info',
+ decode => \&tlv_swi_common_info,
+ },
+ 0x10 => {
+ name => 'LTE Info',
+ decode => \&tlv_swi_lte_info,
+ },
+ },
+);
-
=begin foo
+
+nemi:/home/bjorn# ~bjorn/privat/prog/git/wwan/scripts/qmi.pl --proxy --device=wwan1 --system=nas 0x5556
+wwan1: will use /dev/cdc-wdm1 for management
+wwan1: qmi-proxy open status=0
+sending to /dev/cdc-wdm1:
+01 0c 00 00 03 04 00 03 00 56 55 00 00
+=> QMUX Header:
+=> len: 0x000c
+=> sender: 0x00
+=> svc: 0x03
+=> cid: 0x04
+
+=> QMI Header:
+=> Flags: 0x00
+=> TXN: 0x0003
+=> Cmd: 0x5556
+=> Size: 0x0000
+reading from /dev/cdc-wdm1
+[Tue Mar 15 01:55:02 2016] read 40 bytes from /dev/cdc-wdm1
+01 27 00 80 03 04 02 03 00 56 55 1b 00 02 04 00 00 00 00 00 10 09 00 03 05 aa 05 fa 4b 02 00 00 01 05 00 2f 05 09 00 00
+<= QMUX Header:
+<= len: 0x0027
+<= sender: 0x80
+<= svc: 0x03
+<= cid: 0x04
+
+<= QMI Header:
+<= Flags: 0x02
+<= TXN: 0x0003
+<= Cmd: 0x5556
+<= Size: 0x001b
+<= [0x01] ( 5) 2f 05 09 00 00 /....
+<= [0x02] ( 4) 00 00 00 00 SUCCESS - QMI_ERR_NONE
+<= [0x10] ( 9) 03 05 aa 05 fa 4b 02 00 00 .....K...
+got match!
+wwan1: saving state to "/etc/network/run/qmistate.wwan1"
+wwan1: released QMI_NAS cid=4 with status=0
+
+
+
+0x01 => file:///usr/local/src/git/swi-slqs/docs/SwiApiReference/structCommInfo.html
+
+
nasGetLTECphyCa Struct Reference
Data Fields
PhyCaAggScellIndType sPhyCaAggScellIndType
@@ -1169,11 +1223,24 @@ my %dl_bw_map = (
5 => '100',
);
+my %bandwidth_map = (
+ 0x00 => '1.4 MHz',
+ 0x01 => '3 MHz',
+ 0x02 => '5 MHz',
+ 0x03 => '10 MHz',
+ 0x04 => '15 MHz',
+ 0x05 => '20 MHz',
+ 0x06 => 'Invalid',
+ 0xFF => 'Unknown',
+ );
+
sub map_dl_bw {
my $idx = shift;
+ # use the MHz map instead of bitrate codes...
+ return $bandwidth_map{$idx};
return "LTE_CPHY_CA_BW_NRB_" . $dl_bw_map{$idx};
}
-
+
sub map_scell_state {
my $state = shift;
return "" unless defined($state);
@@ -1188,6 +1255,120 @@ sub tlv_phy_ca_agg_cell_info {
return "pci: $pci, LTE Tx chan: $chan, dl_bw: " . &map_dl_bw($dlbw) . ", band: " . &map_active_band($band) . &map_scell_state($scell_state);
}
+my %modemmode_map = (
+ 0x00 => 'POWERING OFF',
+ 0x01 => 'FACTORY TEST',
+ 0x02 => 'OFFLINE',
+ 0x03 => 'OFFLINE_AMPS',
+ 0x04 => 'OFFLINE_CDMA',
+ 0x05 => 'ONLINE',
+ 0x06 => 'LOW POWER MODE',
+ 0x07 => 'RESETTING',
+ 0x08 => 'NETWORK TEST',
+ 0x09 => 'OFFLINE REQUEST',
+ 0x0A => 'PSEUDO ONLINE',
+ 0x0B => 'RESETTING MODEM',
+ 0xFF => 'Unknown',
+ );
+
+my %systemmode_map = (
+ 0x00 => 'No service',
+ 0x01 => 'AMPS',
+ 0x02 => 'CDMA',
+ 0x03 => 'GSM',
+ 0x04 => 'HDR',
+ 0x05 => 'WCDMA',
+ 0x06 => 'GPS',
+ 0x08 => 'WLAN',
+ 0x09 => 'LTE',
+ 0xFF => 'Unknown',
+ );
+
+my %imsregstate_map = (
+ 0x00 => 'NO SRV',
+ 0x01 => 'IN PROG',
+ 0x02 => 'FAILED',
+ 0x03 => 'LIMITED',
+ 0x04 => 'FULL SRV',
+ 0xFF => 'Unknown',
+ );
+
+my %psstate_map = (
+ 0x00 => 'Attached',
+ 0x01 => 'Detached',
+ 0xFF => 'Unknown',
+ );
+
+#<= [0x01] ( 5) 2f 05 09 00 00 /....
+sub tlv_swi_common_info {
+ my ($temp, $modemmode, $sysmode, $ismreg, $ps) = @{shift()};
+ $temp = "N/A" if ($temp == 0xff);
+ return "temperature: $temp, modemMode: $modemmode_map{$modemmode}, systemMode: $systemmode_map{$sysmode}, imsRegState: $imsregstate_map{$ismreg}, psState: $psstate_map{$ps}";
+}
+
+my %emmstate_map = (
+ 0x00 => 'Deregistered',
+ 0x01 => 'Reg Initiated',
+ 0x02 => 'Registered',
+ 0x03 => 'TAU Initiated',
+ 0x04 => 'SR Initiated',
+ 0x05 => 'Dereg Initiated',
+ 0x06 => 'Invalid',
+ 0xFF => 'Unknown',
+ );
+
+my %emmsubstate_map = (
+ 0x00 => { # When EMM_state is 0x00:
+ 0xFF => 'N/A',
+ 0x00 => 'No IMSI',
+ 0x01 => 'PLMN Search',
+ 0x02 => 'Attach Needed',
+ 0x03 => 'No Cell',
+ 0x04 => 'Attaching',
+ 0x05 => 'Normal Service',
+ 0x06 => 'Limited Service',
+ 0x07 => 'Waiting for PDN',
+ },
+ 0x01 => { # When EMM_state is 0x01:
+ 0xFF => 'N/A',
+ 0x00 => 'Waiting for NW',
+ 0x01 => 'Waiting for ESM',
+ },
+ 0x02 => { # When EMM_state is 0x02:
+ 0xFF => 'N/A',
+ 0x00 => 'Normal Service',
+ 0x01 => 'Update Needed',
+ 0x02 => 'Attempt Update',
+ 0x03 => 'No Cell',
+ 0x04 => 'PLMN Search',
+ 0x05 => 'Limited Service',
+ 0x06 => 'MM Update',
+ 0x07 => 'IMSI Detach',
+ 0x08 => 'Waiting for ESM',
+ },
+);
+
+my %emmconnstate_map = (
+ 0x00 => 'RRC Idle',
+ 0x01 => 'Waiting RRC Cfm',
+ 0x02 => 'RRC Connected',
+ 0x03 => 'RRC Releasing',
+ 0xFF => 'Unknown',
+ );
+
+sub tlv_swi_lte_info {
+ my $datastr = pack("C*", @{shift()});
+ my ($band, $bw, $rxchan, $txchan, $emmstate, $emmsubstate, $emmconnstate) = unpack("CCvvCCC", $datastr);
+ if ($band == 0xff) {
+ $band = 'Invalid';
+ } else {
+ $band = "LTE B$band";
+ }
+ $rxchan = 'N/A' if ($rxchan == 0xffff);
+ $txchan = 'N/A' if ($txchan == 0xffff);
+ return "band: $band, bandwidth: $bandwidth_map{$bw}, RXChan: $rxchan, TXChan: $txchan, emmState: $emmstate_map{$emmstate}, emmSubState: $emmsubstate_map{$emmstate}->{$emmsubstate}, emmConnState: $emmconnstate_map{$emmconnstate}";
+}
+
sub tlv {
my ($msgid, $tlv, $data) = @_;
@@ -1336,8 +1517,13 @@ i.e a stream of TLVs starting with 0x followed by the raw contents, all encoded
Command aliases and expected arguments (no encoding):
+
+ DMS:
impref <fwversion> <config> [carrier] - carrier defaults to 'GENERIC', system is forced to DMS
+ NAS:
+ gstatus - Sierra Wireless specific, system is forced to NAS
+
EOH
;
@@ -2460,6 +2646,7 @@ my $cmd = shift;
# force system for well known alias commands
my %aliases = (
'impref' => QMI_DMS,
+ 'gstatus' => QMI_NAS,
);
$system = $aliases{$cmd} if exists($aliases{$cmd});
@@ -2523,6 +2710,8 @@ if ($system == QMI_WDS) {
&nas_initiate_network_register;
} elsif ($cmd eq 'scan') {
&nas_perform_network_scan;
+ } elsif ($cmd eq 'gstatus') {
+ pretty_print_qmi(&send_and_recv(&mk_nas(0x5556)));
}
} elsif ($system == QMI_WMS) {
unless ($cmd) {