imc-pr3-desc: Update new function name and use new hal entry points
authorGuillaume Zajac <guillaume.zajac@linux.intel.com>
Mon, 8 Oct 2012 13:16:48 +0000 (15:16 +0200)
committerAuke Kok <auke-jan.h.kok@intel.com>
Fri, 8 Feb 2013 20:25:52 +0000 (12:25 -0800)
include/util_imc.h
src/desc_imc_pr3.c
src/util_imc.c

index d337974..b8282e2 100644 (file)
@@ -25,7 +25,6 @@
 #define __TTY_IMC_DUMP_H__
 
 int tty_open (void);
-int ttyerr_open(void);
 
 int fd_read(int nFd, void* buf, size_t nbytes);
 int fd_write(int nFd, void* buf, size_t nbytes);
index 7cc6bf7..135c110 100644 (file)
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>
+#include <sys/ioctl.h>
+#include <net/if.h>
+#include <linux/if_tun.h>
+#include <fcntl.h>
 
 #include <glib.h>
 
 #include <tcore.h>
 #include <plugin.h>
+#include <core_object.h>
+
 
 #include <user_request.h>
 #include <hal.h>
+#include <mux.h>
+#include <at.h>
+#include <queue.h>
 
-#include "tty_imc.h"
+#include "util_imc.h"
 #include "pr3_audio.h"
 
-#define BUF_LEN_MAX 512
+#define BUF_LEN_MAX 4096
+
+#define CHANNEL_MAX 8
+
+#define CHANNEL_MODEM          3
+#define CHANNEL_CALL           1
+#define CHANNEL_SIM            1
+#define CHANNEL_SMS            1
+#define CHANNEL_NETWORK                2
+#define CHANNEL_PS             3
+#define CHANNEL_SAT            2
+#define CHANNEL_SS             2
+#define CHANNEL_NONE           -1
 
 struct custom_data {
-       int tty_fd;
-       guint watch_id_tty;
+       int hal_fd;
+       guint watch_id;
+       void *cb;
+       void *cb_data;
 };
 
-static TReturn hal_power(TcoreHal *hal, gboolean flag)
+static TcoreHal *get_object_hal(const char *obj_name)
 {
-       struct custom_data *user_data;
+       if (strcmp(obj_name, "modem") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_MODEM);
+       else if (strcmp(obj_name, "call") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_CALL);
+       else if (strcmp(obj_name, "sim") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_SIM);
+       else if (strcmp(obj_name, "umts_sms") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_SMS);
+       else if (strcmp(obj_name, "umts_network") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_NETWORK);
+       else if (strcmp(obj_name, "umts_ps") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_PS);
+       else if (strcmp(obj_name, "sat") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_SAT);
+       else if (strcmp(obj_name, "ss") == 0)
+               return tcore_cmux_get_hal_channel(CHANNEL_SS);
+
+       return NULL;
+}
 
-       user_data = tcore_hal_ref_user_data(hal);
-       if (!user_data)
-               return TCORE_RETURN_FAILURE;
+static void on_cmux_init(void *user_data)
+{
+       TcoreHal *hal = user_data;
+       struct custom_data *cdata;
+       TcoreHalPowerCallBack func;
+
+       dbg("Successfully initialized CMUX");
+
+       cdata = tcore_hal_ref_user_data(hal);
+       func = (TcoreHalPowerCallBack)cdata->cb;
+       func(hal, cdata->cb_data);
+}
+
+static void on_response_setupmux(TcorePending *p, int data_len,
+                                       const void *data, void *user_data)
+{
+       TcorePlugin *plugin = tcore_pending_ref_plugin(p);
+       TcoreHal *hal = user_data;
+       TReturn ret;
+
+       dbg("Entry");
+
+       /* Initialize CMUX */
+       ret = tcore_cmux_init(plugin, hal, on_cmux_init, hal,
+                               CHANNEL_MAX);
+       if (TCORE_RETURN_SUCCESS != ret)
+               err("Failed to initialize CMUX");
+
+       dbg("Exit");
+
+       return;
+}
+
+static TReturn hal_power(TcoreHal *hal, gboolean flag,
+                               TcoreHalPowerCallBack func, void *user_data)
+{
+       struct custom_data *cdata;
+
+       cdata = tcore_hal_ref_user_data(hal);
 
        /* power on */
        if (flag == TRUE) {
-               dbg("Phone Power On success (fd:%d)", user_data->tty_fd);
+               TcorePending *pending;
+
+               cdata->cb = (void *)func;
+               cdata->cb_data = user_data;
 
                tcore_hal_set_power_state(hal, TRUE);
+
+               pending = tcore_at_pending_new(NULL, "AT+CMUX=0,0,,1509,10,3,30,,", "+CMUX", TCORE_AT_NO_RESULT, on_response_setupmux, hal);
+
+               if (pending == NULL) {
+                       err("Fail to create AT+CMUX pending request");
+
+                       return TCORE_RETURN_FAILURE;
+               }
+
+               /* Send callback */
+               tcore_hal_send_request(hal, pending);
        /* power off */
        } else {
-               dbg("Phone Power Off success.");
+               tcore_cmux_close();
+
+               g_source_remove(cdata->watch_id);
+               close(cdata->hal_fd);
+
+               g_free(cdata);
 
                tcore_hal_set_power_state(hal, FALSE);
+
+               dbg("Phone Power Off success.");
        }
 
        return TCORE_RETURN_SUCCESS;
@@ -80,24 +178,39 @@ static TReturn hal_send(TcoreHal *hal, unsigned int data_len, void *data)
        if (!user_data)
                return TCORE_RETURN_FAILURE;
 
-       ret = tty_write(user_data->tty_fd, data, data_len);
+       ret = fd_write(user_data->hal_fd, data, data_len);
        if(ret < 0) {
-               err("tty_write failed");
+               err("fd_write failed");
 
                return TCORE_RETURN_FAILURE;
        }
 
-       dbg("tty_write success ret=%d (fd=%d, len=%d)", ret, user_data->tty_fd, data_len);
+       dbg("fd_write success ret=%d (fd=%d, len=%d)", ret, user_data->hal_fd, data_len);
 
        return TCORE_RETURN_SUCCESS;
 }
 
+static TReturn hal_link_object_channel(CoreObject *object)
+{
+       const char *name = tcore_object_ref_name(object);
+       TcoreHal *hal;
+       TReturn ret;
+
+       hal = get_object_hal(name);
+       if (hal == NULL)
+               return TCORE_RETURN_EINVAL;
+
+       ret = tcore_object_set_hal(object, hal);
+
+       return ret;
+}
 
 static struct tcore_hal_operations hops =
 {
        .power = hal_power,
        .send = hal_send,
        .set_sound_path = pr3_audio_set_sound_path,
+       .link_object_channel = hal_link_object_channel,
 };
 
 static gboolean on_recv_tty_message(GIOChannel *channel, GIOCondition condition, gpointer data)
@@ -109,9 +222,9 @@ static gboolean on_recv_tty_message(GIOChannel *channel, GIOCondition condition,
 
        custom = tcore_hal_ref_user_data(hal);
        memset(buf, 0, BUF_LEN_MAX);
-       n = tty_read(custom->tty_fd, buf, BUF_LEN_MAX);
+       n = fd_read(custom->hal_fd, buf, BUF_LEN_MAX);
        if (n < 0) {
-               err("tty_read error. return_valute = %d", n);
+               err("fd_read error. return_valute = %d", n);
                return TRUE;
        }
 
@@ -157,18 +270,21 @@ static gboolean on_init(TcorePlugin *plugin)
        dbg("I'm init!");
 
        /* Phonet init */
-       data = calloc(sizeof(struct custom_data), 1);
-       memset(data, 0, sizeof(struct custom_data));
+       data = g_new0(struct custom_data, 1);
 
-       data->tty_fd = tty_open();
+       data->hal_fd = tty_open();
+       if (data->hal_fd < 0) {
+               g_free(data);
+               return FALSE;
+       }
 
        /* HAL init */
        hal = tcore_hal_new(plugin, "imc-pr3", &hops, TCORE_HAL_MODE_AT);
        tcore_hal_link_user_data(hal, data);
 
-       data->watch_id_tty= register_gio_watch(hal, data->tty_fd, on_recv_tty_message);
+       data->watch_id= register_gio_watch(hal, data->hal_fd, on_recv_tty_message);
 
-       dbg("tty_fd = %d, watch_id_tty=%d ", data->tty_fd, data->watch_id_tty);
+       dbg("hal_fd = %d, watch_id=%d ", data->hal_fd, data->watch_id);
 
        if (pr3_audio_init() != TRUE)
                err("Error in audio initialization")
index f11dc68..3dda67a 100644 (file)
@@ -35,7 +35,7 @@
 
 #define TTY_OPEN_PATH "/dev/ttyIFX0"
 
-int tty_open (void)
+int tty_open(void)
 {
        int fd = -1;