Cpu对modem模块的控制一般通过uart发送at指令来完成。如果通过modem上网的话,这时在uart会同时有大量网络数据传送,需要区分网络数据和at指令。
Gsmmuxd就是完成对modem模块的多路复用,通过gsmmuxd可以实现拨号上网和接打电话、收发短信能同时进行。
多路复用协议参照gsm0710-driver,在该协议中,发往at模块的每个指令封装成如下格式:
其中address表示从哪一个虚拟串口通道来的指令;control表示帧类型;具体的at指令写在information字段。
Gsmmuxd会生成多个虚拟uart对应不同的应用,如接打电话和拨号上网。通过一个真正的uart与at模块通信。从虚拟uart接收at指令,封装成上述复用帧发送到真正uart;从真正uart接收复用帧,从中解析出at指令和串口通道,发送到对应的虚拟uart。
在android系统中,应用层通过调用ril层实现接打电话、收发短信。Ril层实现发送各种at指令到gsmmuxd的虚拟uart。
在我们的应用中,模拟出3个虚拟串口,分别为mux0,mux1,mux2。Mux1接ril层,实现接打电话、收发短信;mux2实现ppp拨号上网。
从at模块接收复用帧,从中解析出通道信息channel,发送到虚拟串口mux[channel-1]。
从虚拟串口mux[port]接收at指令,封装成复用帧(其中通道信息channel为port+1),发送到at模块。
从上面可以看出,从虚拟串口来的at指令,封装成复用帧后,channel至少为1了。Channel为0的复用帧预留给gsmmuxd本身使用了,如gsmmuxd初始化at模块用。同样从at模块发送过来的channel为0的复用帧,不再转发给虚拟串口,而是在gsmmuxd内部处理了。