Gsmd is a daemon that handles the communications between applications and GSM modem.
Applications manipulate gsmd through the APIs defined in libgsmd.
libgsmd communicates with gsmd through unix socket, and modem goes through UART.
The diagram is as following.

gsmd_select_main this is core of the callback function scheme. All devices, gsmd monitors and linked in a list, are described as a struct gsmd_fd, and gsmd_select_main will select them.
Once an event comes out from one of the devices, gsmd_select_main will try to call it's callback function that devices registered.

There are two queues that handles the atcmds. One is pending_atcmds, and the other is busy_atcmds.
pending_atcmds links all the atcmds user send to gsmd in sequence and those commands are not send to modem yet.
busy_atcmds links all the atcmds sent to gsm modem but not get the response yet.
Both pending_atcmds and busy_atcmds are FIFO queue.

There are two mode of atcmd_select_cb "GSMD_FD_READ" and "GSMD_FD_WRITE". If there are data come out from uart, atcmd_select_cb will be called in READ mode. It will try to read the data from uart and put them llparser_string. llparser_string will try to use the actual parser implementation set by gsmd. (default is ml_parser)

If there are atcmds in pending_atcmds queue, the atcmd_select_cb will be called in WRITE mode. It will try to write the atcmd at the head of queue to modem, and move this atcmd handler into busy_atcmds queue.

Views

Personal tools

Overview

What is gsmd

Gsmd is a daemon that handles the communications between applications and GSM modem.
Applications manipulate gsmd through the APIs defined in libgsmd.
libgsmd communicates with gsmd through unix socket, and modem goes through UART.
The diagram is as following.

Gsmd

GSMD is an event-driven daemon. Each event shall have a response and will pass through the function gsmd_select_main() in which finding and then executing their correspond callback functions.

The last part of gsmd main function enters a infinite loop, trying to call gsmd_select_main.

while(1) {
int ret = gsmd_select_main();
...
}

Design Policy

All commands will wait synchronously for a response until timeout.

All callback functions of commands with multiple-line responses are re-entrant.

Commands of specific modem will be put in vendor plug-in.

Commands or some special scheme for specific platform will be put in machine plug-in.

gsmd_select_main()

gsmd_select_main this is core of the callback function scheme. All devices, gsmd monitors and linked in a list, are described as a struct gsmd_fd, and gsmd_select_main will select them.
Once an event comes out from one of the devices, gsmd_select_main will try to call it's callback function that devices registered.

callback functions

Gsmd opens at least one devices. One is uart to modem and others are the Unix socket, communicating with libgsmd.

atcmd_select_cb is the default callback function that dealing the UART to the modem. It will handle sending AT commands to GSM modem or receive whatever return from modem and send them into parser.

The default parser callback function of UART (to modem) is ml_parse, in which dealing with reading the response from modem and dispatching the correct callback function to handle the response.

atcmd_select_cb

There are two queues that handles the atcmds. One is pending_atcmds, and the other is busy_atcmds.
pending_atcmds links all the atcmds user send to gsmd in sequence and those commands are not send to modem yet.
busy_atcmds links all the atcmds sent to gsm modem but not get the response yet.
Both pending_atcmds and busy_atcmds are FIFO queue.

There are two mode of atcmd_select_cb "GSMD_FD_READ" and "GSMD_FD_WRITE". If there are data come out from uart, atcmd_select_cb will be called in READ mode. It will try to read the data from uart and put them llparser_string. llparser_string will try to use the actual parser implementation set by gsmd. (default is ml_parser)

If there are atcmds in pending_atcmds queue, the atcmd_select_cb will be called in WRITE mode. It will try to write the atcmd at the head of queue to modem, and move this atcmd handler into busy_atcmds queue.

atcmd_fill

atcmd_submit

ml_parse

ml_parse is the parser callback function that handles:

Initial GSM Modem

Handle an information response ("+whatever: ...")

Handle an unsolicited message ("+whateverelse: ... ")

Handle a final response ("OK", "+CME ERROR", ...)

Handle an intermediate response ("CONNECTED", "BUSY", "NO DIALTONE")

Initialize GSM Modem

When the modem firmware is ready to initial, it will send AT-Command Interpreter ready to gsmd. If ml_parse get this string, gsmd will try to initialize the modem.