RIL 机制---消息从reference-ril到Modem

6, reference-ril-->Modem

reference-ril.c中调用流程图如下,


onRequest方法中会处理所有消息,但是处理流程完全一样, 以RIL_REQUEST_DIAL消息为例来论述消息的处理, onRequest中相关代码如下,

case RIL_REQUEST_DIAL:
     requestDial(data, datalen, t);
     break;
另一方面,有些消息需要回调给ril,然后到RILJ。
default:
       RLOGD("Request not supported. Tech: %d",TECH(sMdmInfo));
       RIL_onRequestComplete(t, RIL_E_REQUEST_NOT_SUPPORTED, NULL, 0);
      break;

首先看回调的消息, RIL_onRequestComplete定义如下,

static const struct RIL_Env *s_rilenv;
#define RIL_onRequestComplete(t, e, response, responselen) s_rilenv->OnRequestComplete(t,e, response, responselen)
#define RIL_onUnsolicitedResponse(a,b,c) s_rilenv->OnUnsolicitedResponse(a,b,c)
#define RIL_requestTimedCallback(a,b,c) s_rilenv->RequestTimedCallback(a,b,c)

该回调消息后面会论述。

 

requestDial方法如下,

static void requestDial(void *data, size_t datalen __unused, RIL_Token t)
{
    RIL_Dial *p_dial;
    char *cmd;
    const char *clir;
    int ret;

    p_dial = (RIL_Dial *)data;

    switch (p_dial->clir) {
        case 1: clir = "I"; break;  /*invocation*/
        case 2: clir = "i"; break;  /*suppression*/
        default:
        case 0: clir = ""; break;   /*subscription default*/
    }
    asprintf(&cmd, "ATD%s%s;", p_dial->address, clir);//封装AT指令
    ret = at_send_command(cmd, NULL);//继续发送
    free(cmd);
    /* success or failure is ignored by the upper layer here.
       it will call GET_CURRENT_CALLS and determine success that way */
    RIL_onRequestComplete(t, RIL_E_SUCCESS, NULL, 0);//回调
}

at_send_command方法如下,

int at_send_command (const char *command, ATResponse **pp_outResponse)
{
    int err;
    err = at_send_command_full (command, NO_RESULT, NULL, NULL, 0, pp_outResponse);
    return err;
}

at_send_command_full_nolock方法逻辑如下,

1,调用writeline方法通过串口将数据发送到Modem

2, 阻塞当前线程,等待Modem回应.

3,将回应发送给请求的AT线程。

 

首先论述第一步,在下个章节中论述第二步和第三步。

at_send_command_full_nolock方法有关代码如下,

err = writeline (command);

writeline方法如下,

static int writeline (const char *s)
{
    size_t cur = 0;
    size_t len = strlen(s);
    ssize_t written;
    if (s_fd < 0 || s_readerClosed > 0) {
        return AT_ERROR_CHANNEL_CLOSED;
    }
    RLOGD("AT> %s\n", s);
    AT_DUMP( ">> ", s, strlen(s) );
    /* the main string */
    while (cur < len) {
        do {
             //s_fd就是Modem与RILC之间的串口
            written = write (s_fd, s + cur, len - cur);
        } while (written < 0 && errno == EINTR);

        if (written < 0) {
            return AT_ERROR_GENERIC;
        }

        cur += written;
    }
    /* the \r  */
    do {
        written = write (s_fd, "\r" , 1);//以换行结尾
    } while ((written < 0 && errno == EINTR) || (written == 0));

    if (written < 0) {
        return AT_ERROR_GENERIC;
    }
    return 0;
}

这样,通过串口的方式,将数据从reference-ril发送到Modem了。

s_fd串口是在reference-ril的读取子线程(读Modem)中打开的,然后通过at_open方法赋值给atchannel.c的s_fd,将会在下一章中论述。


小结:这一章比较简单,以RIL_REQUEST_DIAL消息为例论述了reference-ril将消息通过串口发送给modem的流程。

通过这三个章节,数据终于从RILJ发送到Modem了。Modem往上发送消息都要分为2大类,稍微麻烦一些。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值