本文主要是介绍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数据通信概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!