summaryrefslogtreecommitdiffstats
path: root/Replicant_contributors_meeting_27_28_July_2019_Paris_France/modems/Replicant_and_modems_Introduction.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Replicant_contributors_meeting_27_28_July_2019_Paris_France/modems/Replicant_and_modems_Introduction.tex')
-rw-r--r--Replicant_contributors_meeting_27_28_July_2019_Paris_France/modems/Replicant_and_modems_Introduction.tex522
1 files changed, 522 insertions, 0 deletions
diff --git a/Replicant_contributors_meeting_27_28_July_2019_Paris_France/modems/Replicant_and_modems_Introduction.tex b/Replicant_contributors_meeting_27_28_July_2019_Paris_France/modems/Replicant_and_modems_Introduction.tex
new file mode 100644
index 0000000..17463d4
--- /dev/null
+++ b/Replicant_contributors_meeting_27_28_July_2019_Paris_France/modems/Replicant_and_modems_Introduction.tex
@@ -0,0 +1,522 @@
+\documentclass{beamer}
+\usepackage[english]{babel}
+\usepackage{color}
+\usepackage{graphicx}
+\usepackage{ifthen}
+\usepackage[utf8]{inputenc}
+\usepackage{listings}
+\usepackage{pdfpages}
+
+\lstdefinestyle{terminal}{
+ backgroundcolor=\color{black},
+ basicstyle=\scriptsize\color{green},
+}
+
+%% Based on:
+%% https://tex.stackexchange.com/questions/136900/insert-a-full-page-image
+\newcommand{\pictureframe}[1] {
+ {
+ \begin{frame}
+ \noindent
+ \resizebox{\textwidth}{\textheight}
+ {\includegraphics{#1}}
+ \hspace*{-\textwidth}
+ \end{frame}
+ }
+}
+
+\usetheme{Singapore}
+
+\title{Modems support in Replicant}
+\author{Denis 'GNUtoo' Carikli}
+\date{\today}
+
+\begin{document}
+
+\maketitle
+
+%% TODO: Using \itemize{} fails to compile
+%% TODO: convert \center frames to chapter title
+
+\begin{frame}
+ \center{In this presentation:}
+ \begin{itemize}
+ \item The hardware
+ \item Android Reference implementation (More simple)
+ \item Questions and/or Pause
+ \item Replicant's Samsung IPC implementation (More complex)
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{The hardware}
+\end{frame}
+
+\pictureframe{../../external_resources/replicant_website/images/freedom-privacy-security-issues/hardware.png}
+\pictureframe{../../external_resources/replicant_website/images/freedom-privacy-security-issues/good-modem-isolation.png}
+
+\pictureframe{output/example_modem.png}
+
+\begin{frame}
+ \center{Why do we look at android reference implementation first?}
+ \begin{itemize}
+ \item The hardware is more simple
+ \item The protocol is way easier to understand
+ \item Has good enough documentation (standard, reference implentation)
+ \item It also explains why we got protocols like samsung-ipc
+ \item Relevant for devices with free software bootloaders
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{Example: Openmoko}
+ \begin{itemize}
+ \item Simple
+ \item But very strongly outdated
+ \end{itemize}
+\end{frame}
+
+\pictureframe{output/serial_modem_hardware.png}
+
+\begin{frame}
+ \center{AT commands}
+ \begin{itemize}
+ \item The good parts:
+ \begin{itemize}
+ \item Standard (ETSI GSM 07.07 / 3GPP TS 27.007)
+ \item Publically available, no registration
+ \item pdf versions: git://git.osmocom.org/3gpp-etsi-pdf-links.git
+ \end{itemize}
+ \item The bad parts: More on that later...
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{Examples based on the specification (07.07)}
+\end{frame}
+
+\begin{lstlisting}[style=terminal]
+ # use verbose error values, report registration
+ > AT+CMEE=2;+CREG=1
+ < OK
+ > AT
+ < OK
+ > AT+CFUN=1
+ < OK
+\end{lstlisting}
+
+\begin{lstlisting}[style=terminal]
+ # use verbose error values, report registration
+ > AT+CMEE=2;+CREG=1
+ < OK
+ > AT+CFUN=1
+ < +CME ERROR: SIM PIN required
+ > AT+CPIN="1234"
+ < +CME ERROR: incorrect password (user entered wrong PIN)
+ > AT+CPIN="4321"
+ < OK
+ > AT+COPS=0,0
+ < OK
+ < +CREG: 1
+ > AT+COPS?
+ < +COPS: 0,0,"SFR"
+ > OK
+\end{lstlisting}
+
+\begin{frame}
+ \center{AT commands: The bad parts:}
+ \begin{itemize}
+ \item Syncronous
+ \item difficult to write parsers (need to keep state)
+ \item Slow
+ \item Vendors extensions
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{More realistic example}
+\end{frame}
+
+\begin{lstlisting}[style=terminal]
+ # 0707: +CSQ: <rssi>,<ber>
+ # MDM6200/6600: +CSQ: <N>
+ # 0707: 31 = -51dbm
+ # MDM6200/6600: 31 = -75dbm
+ > +CSQ: 31
+ < +CRING: VOICE/06050403002
+\end{lstlisting}
+
+\begin{lstlisting}[style=terminal]
+ # Enable noise cancelation on the OpenMoko
+ > AT%N0105
+ < OK
+\end{lstlisting}
+
+\begin{frame}
+ \center{Example of issues}
+ \begin{itemize}
+ \item What if the answer doesn't come back?
+ \item What if there is some noise on the serial port?
+ \item What if I need to run another commands while waiting for the answer of the previous one?
+ \item More modern modems with AT protocol (Example: GTA04):
+ \begin{itemize}
+ \item Modem connected over USB
+ \item Serveral "virtual serial" interfaces
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{The bad parts:}
+ \begin{itemize}
+ \item $\rightarrow$This lead vendor to make their own protocol.
+ \item $\rightarrow$Very similar issues with GPS (NMEA not meant for GPS).
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{AT commands are still in use:}
+ \begin{itemize}
+ \item GTA04
+ \item Optimus black
+ \item Usually (also) available on modems available at low quantity orders.
+ \item $\rightarrow$Often in use on devices made for the free software community .
+ \item Sometimes vendor documentation is even publically available for specific modems.
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{Handling AT command set in Android}
+\end{frame}
+
+\pictureframe{output/serial_modem_software.png}
+
+\begin{frame}
+ \center{rild}
+\end{frame}
+
+\begin{frame}
+ \center{finding libril implementation}
+
+ \raggedright
+ finding libril implementation:
+ \begin{verse}
+ vendor ril lib path either passed in as -l parameter, or read from rild.libpath property
+ \end{verse}
+ \begin{verse}
+ ril arguments either passed in as - - parameter, or read from rild.libargs property
+ \end{verse}
+\end{frame}
+
+\begin{frame}
+\center{finding libril implementation}
+\end{frame}
+
+\begin{lstlisting}[style=terminal]
+ $ cd device/samsung/i9300
+ $ git grep rild
+ system.prop:rild.libpath=/system/lib/hw/libsamsung-ril.so
+ system.prop:rild.libargs=-d /dev/ttyS0
+\end{lstlisting}
+
+\begin{frame}
+ \center{In the code: hardware/ril/rild/rild.c}
+\end{frame}
+
+\lstset{language=C}
+\begin{lstlisting}
+int main(int argc, char **argv) {
+ // [...]
+ const RIL_RadioFunctions *(*rilInit)(
+ const struct RIL_Env *, int, char **);
+ // [...]
+ dlHandle = dlopen(rilLibPath, RTLD_NOW);
+ // [...]
+ RIL_startEventLoop();
+ // [...]
+ rilInit = (const RIL_RadioFunctions *(*)(
+ const struct RIL_Env *, int, char **))
+ dlsym(dlHandle, "RIL_Init");
+ funcs = rilInit(&s_rilEnv, argc, rilArgv);
+ // [...]
+ RIL_register(funcs);
+ // [...]
+}
+\end{lstlisting}
+
+\begin{frame}
+ \center{reference-ril}
+ \begin{itemize}
+ \item Implements libril, like libsamsung-ril
+ \item Same git repository than rild
+ \item AT commands, very basic (only one channel)
+ \item Beware of CaMeL Case Code and \_ mix (RIL\_Init, not RIL\_init)
+ \end{itemize}
+\end{frame}
+
+\lstset{language=C}
+\begin{lstlisting}
+const RIL_RadioFunctions *RIL_Init(
+ const struct RIL_Env *env,
+ int argc, char **argv) {
+ while ( -1 != (opt = getopt(argc, argv,
+ "p:d:s:c:"))) {
+ // [...]
+ switch (opt) {
+ // [...]
+ case 'd':
+ s_device_path = optarg;
+ RLOGI("Opening tty device %s\n",
+ s_device_path);
+ break;
+ // [...]
+ }
+ } // [...]
+}
+\end{lstlisting}
+
+\lstset{language=C}
+\begin{lstlisting}
+ static const RIL_RadioFunctions s_callbacks = {
+ RIL_VERSION,
+ onRequest,
+ currentState,
+ onSupports,
+ onCancel,
+ getVersion
+ };
+ // [...]
+
+ const RIL_RadioFunctions *RIL_Init(
+ const struct RIL_Env *env,
+ int argc, char **argv) {
+ // [...]
+ return &s_callbacks;
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{Calling}
+\end{frame}
+
+\lstset{language=C}
+\begin{lstlisting}
+ static void onRequest (int request, void *data,
+ size_t datalen, RIL_Token t) {
+ // [...]
+ switch (request) {
+ // [...]
+ case RIL_REQUEST_DIAL:
+ requestDial(data, datalen, t);
+ break;
+ // case [...]
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{requestDial}
+\end{frame}
+
+\lstset{language=C}
+\begin{lstlisting}
+ static void requestDial(void *data,
+ size_t datalen __unused, RIL_Token t) {
+ // [...]
+ ret = at_send_command(cmd, NULL);
+
+ free(cmd);
+ // [...]
+ RIL_onRequestComplete(t, RIL_E_SUCCESS,
+ NULL, 0);
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{Incomming call}
+\end{frame}
+
+\begin{frame}
+ \center{onUnsolicited}
+\end{frame}
+\lstset{language=C}
+\begin{lstlisting}
+ static void onUnsolicited (const char *s,
+ const char *sms_pdu) {
+ // [...]
+ if (strStartsWith(s,"+CRING:")
+ || strStartsWith(s,"RING")
+ || strStartsWith(s,"NO CARRIER")
+ || strStartsWith(s,"+CCWA") ) {
+ RIL_onUnsolicitedResponse (
+ RIL_UNSOL_RESPONSE_CALL_STATE_CHANGED,
+ NULL, 0);
+ // [...]
+ }
+ // [...]
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{RIL\_Init}
+\end{frame}
+\lstset{language=C}
+\begin{lstlisting}
+ const RIL_RadioFunctions *RIL_Init(
+ const struct RIL_Env *env,
+ int argc, char **argv) {
+ // [...]
+ ret = pthread_create(&s_tid_mainloop, &attr,
+ mainLoop, NULL);
+ // [...]
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{MainLoop}
+\end{frame}
+\lstset{language=C}
+\begin{lstlisting}
+ static void * mainLoop(void *param __unused) {
+ // [...]
+ ret = at_open(fd, onUnsolicited);
+ // [...]
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{at\_open}
+\end{frame}
+\lstset{language=C}
+\begin{lstlisting}
+ static ATUnsolHandler s_unsolHandler;
+ // [...]
+
+ int at_open(int fd, ATUnsolHandler h)
+ {
+ // [...]
+ s_unsolHandler = h;
+ // [...]
+ ret = pthread_create(&s_tid_reader, &attr,
+ readerLoop, &attr);
+ // [...]
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{readerLoop}
+\end{frame}
+
+\lstset{language=C}
+\begin{lstlisting}
+
+static void *readerLoop(void *arg __unused)
+{
+ for (;;) {
+ // [...]
+ processLine(line);
+ // [...]
+ }
+ // [...]
+}
+\end{lstlisting}
+
+\begin{frame}
+ \center{processLine}
+\end{frame}
+\lstset{language=C}
+\begin{lstlisting}
+ static void processLine(const char *line) {
+ pthread_mutex_lock(&s_commandmutex);
+ if (sp_response == NULL) {
+ /* no command pending */
+ handleUnsolicited(line);
+ } // [...]
+}
+\end{lstlisting}
+
+\lstset{language=C}
+\begin{lstlisting}
+ static void handleUnsolicited(const char *line)
+ {
+ if (s_unsolHandler != NULL) {
+ s_unsolHandler(line, NULL);
+ }
+ }
+\end{lstlisting}
+
+\begin{frame}
+ \center{Other protocols}
+\end{frame}
+
+\begin{frame}
+ \center{Other protocols: status}
+ \begin{itemize}
+ \item "samsung-ipc"
+ \begin{itemize}
+ \item Implemented in libsamsung-ipc
+ \item Usable on Android and GNU/Linux
+ \item Incomplete
+ \item No wireshark dissectror
+ \item No upstream Linux driver yet
+ \end{itemize}
+ \item QMI
+ \begin{itemize}
+ \item Implemented in libqmi, other?
+ \item Usable with upstream Linux and in GNU/Linux
+ \end{itemize}
+ \item ISI (Nokia: N900, N9, etc)
+ \begin{itemize}
+ \item Implemented in Ofono, Freesmartphone.org, other?
+ \item Wireshark dissector
+ \item Upstream Linux drivers
+ \end{itemize}
+ \item "Palm Pre"
+ \begin{itemize}
+ \item Implemented in msmcomm
+ \item Was usable in GNU/Linux through Freesmartphone.org
+ \item Code lost? Michael Lauer should push it again soon.
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{Other protocols: characteristics}
+ \begin{itemize}
+ \item Like a network protocol
+ \begin{itemize}
+ \item sequence number to match query and response
+ \item Asyncronous
+ \end{itemize}
+ \item Free software implementation not always available
+ \item Or incomplete (samsung-ipc)
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+ \center{Use a supported protocol}
+ \begin{itemize}
+ \item Example with the Palm pre
+ \begin{itemize}
+ \item Had an unknown protocol that was used by the nonfree default implementation
+ \item Also had AT commands
+ \item People implemented the AT commands
+ \item No ring indication if my memory is correct
+ \item At the end they implemented the unknown vendor protocol in msmcommd
+ \end{itemize}
+ \end{itemize}
+\end{frame}
+
+\begin{frame}
+\center{Questions?}
+ \begin{itemize}
+ \item Next part is about Samsung IPC
+ \item Increasing level of complexity
+ \item Increasing level of complexity
+ \item $\rightarrow$ Questions on the first part before continuing.
+ \end{itemize}
+\end{frame}
+
+\begin{thebibliography}{99}
+\end{thebibliography}
+
+\end{document}