summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBjørn Mork <bjorn@mork.no>2015-12-08 17:03:30 +0100
committerBjørn Mork <bjorn@mork.no>2015-12-08 17:03:35 +0100
commitf950d23e6928c3fecf5e2a44f874c96cad4b9e0c (patch)
treed173e6a41bec6ff01c89ce8e42011f526827e009
parent4b9ddf0a95f000a71a670de0930e8ccf27a1599a (diff)
swi-sdk-firmware: sample SLQS application
Working now: nemi:/home/bjorn# ~bjorn/privat/prog/git/wwan/src/swi-sdk-firmware 4 argc=2 setting sdk path to /usr/local/src/git/swi-slqs/build/bin/hosti686/slqssdk node=/dev/qcqmi0, key=35907206000556 bar foo result: 0 001.008 000 01.09.06.00 GENERIC Signed-off-by: Bjørn Mork <bjorn@mork.no>
-rw-r--r--src/Makefile12
-rw-r--r--src/swi-sdk-firmware.c99
2 files changed, 111 insertions, 0 deletions
diff --git a/src/Makefile b/src/Makefile
index 0f4b0b4..a136c7f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -6,6 +6,15 @@ BINARIES=wwan_ctl qcqmifs flush-wdm
CFLAGS_USB=$(shell pkg-config libusb-1.0 --cflags)
LDLIBS_USB=$(shell pkg-config libusb-1.0 --libs)
+# Sierra Linux QMI SDK - partly from /usr/local/src/git/swi-slqs/pkgs/slqscompile.mak
+SDKPATH=/usr/local/src/git/swi-slqs
+SDKCPU=hosti686
+CFLAGS_SDK=-m32 -Wall -Werror -Wextra -DSDK_EXE='$(SDKPATH)/build/bin/$(SDKCPU)/slqssdk'
+LDLIBS_SDK=-Wl,--start-group -lrt -lpthread -lslqsapi -lslqscore -lslqsqmi -Wl,--end-group
+LDFLAGS_SDK=-L/usr/lib32 -L$(SDKPATH)/build/lib/$(SDKCPU) -static
+inc_paths=$(shell echo $(SDKPATH)/api/*/inc)
+INCLUDE_SDK=-I$(SDKPATH)/api -I$(SDKPATH)/api/inc $(inc_paths:%=-I%)
+
all: $(BINARIES)
clean:
@@ -29,5 +38,8 @@ cuseqmi: cuseqmi.c
swi-firmware: swi-firmware.c
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+swi-sdk-firmware: swi-sdk-firmware.c
+ $(CC) $(CFLAGS_SDK) $(INCLUDE_SDK) $(LDFLAGS_SDK) -static -lrt -lpthread -o $@ $^ $(LDLIBS_SDK)
+
flush-wdm: flush-wdm.c
$(CC) $(CFLAGS_USB) $(LDFLAGS) -o $@ $^ $(LDLIBS_USB)
diff --git a/src/swi-sdk-firmware.c b/src/swi-sdk-firmware.c
new file mode 100644
index 0000000..fd76bfa
--- /dev/null
+++ b/src/swi-sdk-firmware.c
@@ -0,0 +1,99 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+/* QMI SDK */
+#include "SWIWWANCMAPI.h"
+#include "qmerrno.h"
+
+/* stolen from SampleApps/Firmware_Download/inc/fwDld_9x15.h */
+#define IMG_FW_TYPE_CWE 2
+#define IMG_PRI_TYPE_NVU 3
+#define IMG_FW_TYPE_SPK 4
+
+#define __stringify_1(x...) #x
+#define __stringify(x...) __stringify_1(x)
+
+/* builtin sdk binary location */
+static char *sdkpath = __stringify(SDK_EXE);
+char devmode;
+
+void get_img_info(char *imgpath)
+{
+ CurrentImgList CurrImgList;
+ CurrImageInfo currImgInfo[5];
+ BYTE numEntries = 5;
+ int i, ret;
+
+ printf("bar\n");
+ if (strlen(imgpath))
+ printf("foo\n");
+ memset( (void *)&CurrImgList, 0, sizeof( CurrImgList ) );
+ memset( (void *)&currImgInfo, 0, sizeof( currImgInfo ) );
+ CurrImgList.pCurrImgInfo = currImgInfo;
+ CurrImgList.numEntries = numEntries;
+
+ /* There are 2 possible scenario's determined by calling SLQSSwiGetFwCurr
+ * 1) Device does not support Gobi IM - In this case use same procedure as
+ * FwDloader_9x00. In this case, we need only one file( spkg format).
+ * 2) Device supports GIM but data returned is blank. Use normal procedure. */
+ ret = SLQSSwiGetFirmwareCurr( &CurrImgList );
+
+ printf("result: %d\n", ret);
+
+ printf("%s %s %s %s\n", CurrImgList.priver,CurrImgList.pkgver,CurrImgList.fwvers,CurrImgList.carrier );
+
+ for (i = 0; i < ret; i++) {
+ printf("%u %s %u %s\n", currImgInfo[i].imageType, currImgInfo[i].uniqueID, currImgInfo[i].buildIDLen, currImgInfo[i].buildID);
+ }
+
+}
+
+typedef struct device_info {
+ char node[256];
+ char key[16];
+} devinfo_t;
+
+int start_sdk()
+{
+ int rc;
+ unsigned char num = 3;
+ struct device_info dev[3], *pdev;
+
+ /* Set SDK image path */
+ printf("setting sdk path to %s\n", sdkpath);
+ rc = SetSDKImagePath(sdkpath);
+ if (rc)
+ return rc;
+
+ /* Establish APP<->SDK IPC to first modem found */
+ rc = SLQSStart(0, NULL);
+ if (rc)
+ return rc;
+
+ /* get the device mode */
+ rc = SLQSGetDeviceMode((unsigned char *)&devmode);
+
+ /* Can enumerate and connect only if device is in Application mode */
+ if (devmode == DEVICE_STATE_READY) {
+ while (QCWWAN2kEnumerateDevices(&num, (unsigned char *)&dev[0])) {
+ printf("\nUnable to find device..\n");
+ sleep(1);
+ }
+ }
+ pdev = &dev[0];
+ printf("node=%s, key=%s\n", dev[0].node, dev[0].key);
+ rc = QCWWANConnect(pdev->node, pdev->key);
+
+ return rc;
+}
+
+
+int main(int argc, char *argv[])
+{
+ printf("argc=%d\n", argc);
+ start_sdk();
+ get_img_info(argv[1]);
+ return 0;
+}