Ticket #973: 02_machine-plugin-for-extra-submit.patch

File 02_machine-plugin-for-extra-submit.patch, 6.9 KB (added by sean_chiang@…, 12 years ago)

machineplugin for extra-submit

  • include/gsmd/atcmd.h

    === include/gsmd/atcmd.h
    ==================================================================
     
    1313extern int cancel_atcmd(struct gsmd *g, struct gsmd_atcmd *cmd); 
    1414extern int atcmd_init(struct gsmd *g, int sockfd); 
    1515extern void atcmd_drain(int fd); 
     16extern void atcmd_wake_pending_queue (struct gsmd *g); 
     17extern void atcmd_wait_pending_queue (struct gsmd *g);  
    1618 
    1719#endif /* __GSMD__ */ 
    1820 
  • include/gsmd/machineplugin.h

    === include/gsmd/machineplugin.h
    ==================================================================
     
    1111struct gsmd_machine_plugin { 
    1212        struct llist_head list; 
    1313        unsigned char *name; 
     14        int (*ex_submit)(struct gsmd *g); 
    1415        int (*detect)(struct gsmd *g); 
    1516        int (*init)(struct gsmd *g, int fd); 
    1617}; 
  • src/gsmd/Makefile.am

    === src/gsmd/Makefile.am
    ==================================================================
     
    2424 
    2525plugin_LTLIBRARIES = libgsmd-machine_generic.la \ 
    2626                     libgsmd-machine_tihtc.la \ 
     27                     libgsmd-machine_gta01.la \ 
    2728                     libgsmd-vendor_ti.la \ 
    2829                     libgsmd-vendor_tihtc.la \ 
    2930                     libgsmd-vendor_qc.la \ 
     
    3334libgsmd_machine_generic_la_LDFLAGS = -module 
    3435libgsmd_machine_tihtc_la_SOURCES = machine_tihtc.c 
    3536libgsmd_machine_tihtc_la_LDFLAGS = -module 
     37libgsmd_machine_gta01_la_SOURCES = machine_gta01.c 
     38libgsmd_machine_gta01_la_LDFLAGS = -module 
    3639 
    3740libgsmd_vendor_ti_la_SOURCES = vendor_ti.c 
    3841libgsmd_vendor_ti_la_LDFLAGS = -module 
  • src/gsmd/atcmd.c

    === src/gsmd/atcmd.c
    ==================================================================
     
    201201        return -1; 
    202202} 
    203203 
    204 static inline void atcmd_wake_pending_queue (struct gsmd *g)  
     204void atcmd_wake_pending_queue (struct gsmd *g)  
    205205{ 
    206206        g->gfd_uart.when |= GSMD_FD_WRITE; 
    207207} 
    208208 
    209 static inline void atcmd_wait_pending_queue (struct gsmd *g)  
     209void atcmd_wait_pending_queue (struct gsmd *g)  
    210210{ 
    211211        g->gfd_uart.when &= ~GSMD_FD_WRITE; 
    212212} 
     
    643643int atcmd_submit(struct gsmd *g, struct gsmd_atcmd *cmd) 
    644644{ 
    645645        int empty; 
     646 
     647        if (g->machinepl->ex_submit) { 
     648                DEBUGP("extra-submiting command\n"); 
     649                g->machinepl->ex_submit(g); 
     650        } 
    646651        DEBUGP("submitting command `%s'\n", cmd->buf); 
    647652 
    648         empty = llist_empty(&g->pending_atcmds); 
    649653        llist_add_tail(&cmd->list, &g->pending_atcmds); 
    650         if (empty) { 
    651                 atcmd_wake_pending_queue(g); 
    652         } 
     654        if (llist_empty(&g->busy_atcmds) && !llist_empty(&g->pending_atcmds)) { 
     655                atcmd_wake_pending_queue(g); 
     656        } 
     657 
    653658        return 0; 
    654659} 
    655660 
  • src/gsmd/machine.c

    === src/gsmd/machine.c
    ==================================================================
     
    9494        char *machine; 
    9595        char *vendor; 
    9696} machines[] = { 
    97         { "GTA01",              "generic",      "ti" }, 
    98         { "GTA02",              "generic",      "ti" }, 
     97        { "GTA01",              "gta01",        "ti" }, 
     98        { "GTA02",              "gta01",        "ti" }, 
    9999        { "HTC Blueangel",      "tihtc",        "tihtc" }, 
    100100        { "HTC Himalaya",       "tihtc",        "tihtc" }, 
    101101        { "HTC Magician",       "tihtc",        "tihtc" }, 
  • src/gsmd/machine_generic.c

    === src/gsmd/machine_generic.c
    ==================================================================
     
    5656 
    5757struct gsmd_machine_plugin gsmd_machine_plugin = { 
    5858        .name = "generic", 
     59        .ex_submit = NULL, 
    5960        .detect = &generic_detect, 
    6061        .init = &generic_init, 
    6162}; 
  • src/gsmd/machine_tihtc.c

    === src/gsmd/machine_tihtc.c
    ==================================================================
     
    6666 
    6767struct gsmd_machine_plugin gsmd_machine_plugin = { 
    6868        .name = "TI Calypso / HTC firmware", 
     69        .ex_submit = NULL, 
    6970        .detect = &tihtc_detect, 
    7071        .init = &tihtc_init, 
    7172}; 
  • src/gsmd/machine_gta01.c

    === src/gsmd/machine_gta01.c
    ==================================================================
     
     1#include <stdlib.h> 
     2#include <unistd.h> 
     3#include <string.h> 
     4#include <stdio.h> 
     5#include <errno.h> 
     6 
     7#include "gsmd.h" 
     8 
     9#include <gsmd/gsmd.h> 
     10#include <gsmd/usock.h> 
     11#include <gsmd/event.h> 
     12#include <gsmd/talloc.h> 
     13#include <gsmd/extrsp.h> 
     14#include <gsmd/machineplugin.h> 
     15#include <gsmd/atcmd.h> 
     16 
     17#define GSMD_MODEM_WAKEUP_TIMEOUT     3 
     18 
     19static int null_wakeup_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp)  
     20{ 
     21        DEBUGP("The wake up callback!!\n"); 
     22        return 0; 
     23} 
     24 
     25static void wakeup_timeout(struct gsmd_timer *tmr, void *data)  
     26{ 
     27        struct gsmd *g=data; 
     28        struct gsmd_atcmd *cmd=NULL; 
     29        DEBUGP("Wakeup time out!!\n"); 
     30        if (!llist_empty(&g->busy_atcmds)) { 
     31                cmd = llist_entry(g->busy_atcmds.next,struct gsmd_atcmd, list); 
     32        } 
     33        if (!cmd) {  
     34                DEBUGP("ERROR!! busy_atcmds is NULL\n"); 
     35                return; 
     36        } 
     37 
     38        if (cmd->timeout != tmr) { 
     39                DEBUGP("ERROR!! cmd->timeout != tmr\n"); 
     40                return; 
     41        } 
     42 
     43        gsmd_timer_free(cmd->timeout); 
     44        cmd->timeout = NULL; 
     45 
     46        // It's a wakeup command 
     47        if ( cmd->buf[0]==' ') { 
     48                llist_del(&cmd->list); 
     49                talloc_free(cmd); 
     50                // discard the wakeup command, and pass the real command. 
     51                if (llist_empty(&g->busy_atcmds) && !llist_empty(&g->pending_atcmds)) { 
     52                        atcmd_wake_pending_queue(g); 
     53                } 
     54        } else { 
     55                DEBUGP("ERROR!! Wakeup timeout and cmd->buf is not wakeup command!! %s\n",cmd->buf); 
     56        } 
     57} 
     58 
     59static struct gsmd_timer * wakeup_timer(struct gsmd *g) 
     60{ 
     61        struct timeval tv; 
     62        tv.tv_sec = GSMD_MODEM_WAKEUP_TIMEOUT; 
     63        tv.tv_usec = 0; 
     64        DEBUGP("Create wake up timer\n"); 
     65 
     66        return gsmd_timer_create(&tv,&wakeup_timeout,g); 
     67} 
     68 
     69/// adding a null '\r' before real at command. 
     70static int atcmd_wakeup_modem(struct gsmd *g)  
     71{ 
     72        DEBUGP("try to wake up\n"); 
     73        struct gsmd_atcmd * cmd= atcmd_fill(" \r", 2, null_wakeup_cb, g, 0, wakeup_timer); 
     74 
     75        llist_add_tail(&cmd->list, &g->pending_atcmds); 
     76        if (llist_empty(&g->busy_atcmds) && !llist_empty(&g->pending_atcmds)) { 
     77                atcmd_wake_pending_queue(g); 
     78        } 
     79 
     80        return 0; 
     81} 
     82 
     83static int gta01_detect(struct gsmd *g) 
     84{ 
     85        /* FIXME: do actual detection of machine if we have multiple machines */ 
     86        return 1; 
     87} 
     88 
     89static int gta01_init(struct gsmd *g, int fd) 
     90{ 
     91        int rc; 
     92 
     93        /* 
     94         * We assume that the GSM chipset can take 
     95         * input immediately, so we don't have to 
     96         * wait for the "AT-Command Interpreter ready" 
     97         * message before trying to send commands. 
     98         */ 
     99        g->interpreter_ready = 1; 
     100 
     101        return 0; 
     102} 
     103 
     104struct gsmd_machine_plugin gsmd_machine_plugin = { 
     105        .name = "TI Calypso / FIC firmware", 
     106        .ex_submit = &atcmd_wakeup_modem, 
     107        .detect = &gta01_detect, 
     108        .init = &gta01_init, 
     109};