Android SMD数据通信概述

在Linux中,基于SMD的数据通信是以信道的形式作为一个设备存在的,作为一种双向信道,其接口的实现遵循Linux设备驱动规范。在Qucalcomm平台上,SMD的缓冲大小为8192bit,最大信道数为64,SMD的头大小为20bit。

SMD的相关代码实现主要位于aurora\msm\msm\arch\arm\mach-msm目录下。主要文件包括:smd.c、smd_nmea.c、smd_qmi.c、smd_rpcrouter.c、smd_rpcrouter_clients.c、smd_ rpcrouter_device.c、smd_rpcrouter_servers.c、smd_tty.c等。

SMD信道需要同时维护接收信道、发送信道的状态和数据信息,SMD的信道定义如下:

struct smd_channel {
        volatile struct smd_half_channel *send; //发送握手信道
        volatile struct smd_half_channel *recv; //接收握手信道
        unsigned char *send_buf; //发送信道数据
        unsigned char *recv_buf; //接收信道数据
        unsigned buf_size;
        struct list_head ch_list; //信道列表
        unsigned current_packet;
        unsigned n;
        void *priv;
        void (*notify)(void *priv, unsigned flags);
        int (*read)(smd_channel_t *ch, void *data, int len); //读数据
        int (*write)(smd_channel_t *ch, const void *data, int len); //写数据
        int (*read_avail)(smd_channel_t *ch); //是否可读
        int (*write_avail)(smd_channel_t *ch); //是否可写
        int (*read_from_cb)(smd_channel_t *ch, void *data, int len);
        void (*update_state)(smd_channel_t *ch);
        unsigned last_state;
        char name[20];
        struct platform_device pdev;
        unsigned type;
    };

共享信道的信道状态在其握手信道中记录,握手信道的定义如下:

struct smd_half_channel {
        unsigned state;
        unsigned char fDSR;
        unsigned char fCTS;
        unsigned char fCD;
        unsigned char fRI;
        unsigned char fHEAD; //头部
        unsigned char fTAIL; //尾部
        unsigned char fSTATE; //状态
        unsigned char fUNUSED;
        unsigned tail;
        unsigned head;
    };

在实际实现中,SMD信道分配被封装在SMEM(Shared Memory Manager)模块中,系统提供了smem_init()、smem_alloc()、smem_get_entry()等内存操作函数供SMD和SMSM操作。

SMD的状态共有SMD_SS_CLOSED、SMD_SS_OPENING、SMD_SS_OPENED、SMD_SS_FLUSHING、SMD_SS_CLOSING、SMD_SS_RESET、SMD_SS_RESET_OPENING等。其变化过程如图1-1所示。

Android SMD数据通信概述_第1张图片

你可能感兴趣的:(Android SMD数据通信概述)