GSM 07.10 MUX(multiplexer protocol)
GSM 07.10 MUX(multiplexer protocol)
multiplexer protocol是GSM中比较重要的协议,在GSM 07.10中对该协议做了详细的描述。它是衔接手机(TE(Terminal Equipment))和模组(MS(Mobile Station))之间的纽带,TE和MS通信,一般是通过一个串口进行,问题在于串口只有一个,而通信的数据类型却有很多种。比如AT Command、voice、 fax、 data、 SMS、CBS、 phonebook、电量状态、GPRS和USSD 等等。如果传输时一个一个来,每种类型的数据都以独占的方式传输(比如在使用GPRS上网时,就不能接收/发送短信),虽然技术上可行,但是对用户来说不太友好。
multiplexer protocol就是用来解决这个问题的:让不同类型的数据在一个串口上传输,而不至于发生紊乱。想想我们的网卡,通常也只有一个,但可以用它来传输任何数据类型,可以用HTTP协议浏览网页,用FTP协议下载/上传文件,用即时通信协议聊天,这些事情同时进行,而不会发生任何干扰,这一切都是由TCP/IP这一系列的协议来保证的。
multiplexer protocol采用的方法是把一个串口模拟成多个串口,对上层应用程序来说,每一个虚拟的串口和普通串口几乎没有差别,只是每个虚拟串口都只能传输特定类型的数据。下面moto的定义:
VOICE_CALL | “/dev/mux0” |
---|---|
SMS_MO | “/dev/mux1” |
SMS_MT | “/dev/mux2” |
PHONEBOOK | “/dev/mux3” |
MISC | “/dev/mux4” |
CSD | “/dev/mux5” |
GPRS1 | “/dev/mux6” |
GPRS2 | “/dev/mux7” |
CSD | “/dev/mux8” |
GPRS1 | “/dev/mux9” |
GPRS2 | “/dev/mux10” |
LOGGER_CMD | “/dev/mux11” |
LOGGER_DATA | “/dev/mux12” |
TEST_CMD | “/dev/mux13” |
AGPS | “/dev/mux14” |
NET_MONITOR | “/dev/mux15” |
多个虚拟串口上的数据最终要在一个串口上传输,所以需要用一个标识来区分它们,这就是Data Link Connection Identifier (DLCI)。其中DLC0比较特殊,它用于在MS和TE之间传递管理和控制数据包。比如建立其它DLCI、参数协商和退出multiplexer状态等等。
multiplexer protocol的协议栈
- 最上层是应用层,应用层协议与具体应用有关,比如传递AT Command、Voice和GPRS数据,不同应用的协议是不一样的。
- 最下层是物理层,即串口协议,描述了诸如起始位,校验方式和速率等等。
- Multiplexer Layers: 传递字节流数据。
- Convergence Layers: 传递结构化数据。
MUX帧结构
multiplexer protocol有三种工作模式:基本模式、不带错误恢复的高级模式和带错误恢复的高级模式。
multiplexer protocol定义了下面这些类型服务:
- Start up services 进入multiplexer模式。
- DLC establishment services 建立DLC连接,每个连接对应一个虚拟串口。
- Data services 传输数据。
- Power Control services 电源管理,进入睡眠和唤醒。
- DLC Release services 断开DLC连接。
- Close down services退出multiplexer模式。
- Control Services 控制服务,主要用于设置一些参数,比如超时时间,重传次数和速率等等。
基本协议数据单元(PDU)格式如下:
Flag | Address | Control | Length Indicator | Information | FCS | Flag |
---|---|---|---|---|---|---|
1 octet | 1 octet | 1 octet | 1 or 2 octets | Unspecified length but integral number of octets | 1 octet | 1 octet |
- Flag是帧开始与结尾的标记,占一个字节,是一个常量值,在Basic模式里为0x9F。一次可传输多个帧,上一帧的结尾标记可作为下一帧的开始标记;
- Address占一个字节,3~8bit表示MUX通道编号,1bit是扩展位,固定为1,2bit标记当前是命令帧还是响应帧;
- Ctrl占一个字节,表示数据包的类型,其中5bit是P/F位;
- Len占一到两个字节,1bit是扩展位,如果内容字段长度小于0x7F,Len占一个字节,扩展位为1,内容长度占Len的2~8bit;
- Information是实际传输的数据。
- FCS 是校验字节,是Flag后面,Info前面内容的校验信息,如果是UI类型的帧,还包含Info部分,校验算法文档有给出;
Control是用来描述数据包类型的,其描述如下:
Frame Type | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Notes |
---|---|---|---|---|---|---|---|---|---|
SABM (Set Asynchronous Balanced Mode 建立逻辑通道) | 1 | 1 | 1 | 1 | P/F | 1 | 0 | 0 | - |
UA (Unnumbered Acknowledgement 响应建立通道) | 1 | 1 | 0 | 0 | P/F | 1 | 1 | 0 | - |
DM (Disconnected Mode 响应取消逻辑通道) | 1 | 1 | 1 | 1 | P/F | 0 | 0 | 0 | - |
DISC (Disconnect 取消逻辑通道) | 1 | 1 | 0 | 0 | P/F | 0 | 1 | 0 | - |
UIH (Unnumbered Information with Header check) | 1 | 1 | 1 | 1 | P/F | 1 | 1 | 1 | - |
UI (Unnumbered Information) | 1 | 1 | 0 | 0 | P/F | 0 | 0 | 0 | Optional |
所有在TE和MS间传输的帧都是上面描述的结构,部分控制帧没有Info字段,用Ctrl表示帧类型,AT命令等数据内容通常使用UIH类型帧传输。
上述的PDU(short address/short length)在程序中表示如下:
typedef struct{__u8 ea:1;__u8 cr:1;__u8 d:1;__u8 server_chn:5;
} __attribute__((packed)) address_field;typedef struct{__u8 ea:1;__u8 len:7;
} __attribute__((packed)) short_length;typedef struct{address_field addr;__u8 control;short_length length;
} __attribute__((packed)) short_frame_head;typedef struct{short_frame_head h;__u8 data[0];
} __attribute__((packed)) short_frame;
在linux下虚拟串口,主要是实现一个tty_driver,和其它驱动程序一样,要实现诸如打开、关闭、读、写、控制等函数。下面我们看看数据的发送过程,也就是write函数的实现。
函数原型:
static int mux_write(struct tty_struct * tty, int from_user, const unsigned char *buf, int count)检查状态:dlci = tty2dlci[line];if( ts0710->dlci[0].state == FLOW_STOPPED ){TS0710_DEBUG("Flow stopped on all channels, returning zero /dev/mux%d/n", line);return 0;} else if( ts0710->dlci[dlci].state == FLOW_STOPPED ){TS0710_DEBUG("Flow stopped, returning zero /dev/mux%d/n", line);return 0;} else if( ts0710->dlci[dlci].state == CONNECTED ){准备数据包:send_info->frame = d_buf;queue_uih(send_info, c + 1, ts0710, dlci);发送数据包:mux_sched_sendstatic void queue_uih(mux_send_struct *send_info, __u16 len, ts0710_con *ts0710, __u8 dlci)
{__u32 size;长数据包:if (len > SHORT_PAYLOAD_SIZE) {long_frame *l_pkt;size = sizeof(long_frame) + len + FCS_SIZE;l_pkt = (long_frame *) (send_info->frame - sizeof(long_frame));set_uih_hdr((void*)l_pkt, dlci, len, ts0710->initiator);l_pkt->data[len] = crc_calc((__u8*) l_pkt, LONG_CRC_CHECK);send_info->frame = ( (__u8*)l_pkt ) - 1;} else {短数据包:short_frame *s_pkt;size = sizeof(short_frame) + len + FCS_SIZE;s_pkt = (short_frame *) (send_info->frame - sizeof(short_frame));set_uih_hdr((void *)s_pkt, dlci, len, ts0710->initiator);s_pkt->data[len] = crc_calc((__u8*) s_pkt, SHORT_CRC_CHECK);send_info->frame = ( (__u8*)s_pkt ) - 1;}send_info->length = size;
}static void set_uih_hdr(short_frame *uih_pkt, __u8 dlci, __u32 len, __u8 cr)
{uih_pkt->h.addr.ea = 1;uih_pkt->h.addr.cr = cr;uih_pkt->h.addr.d = dlci & 0x1;uih_pkt->h.addr.server_chn = dlci >> 1;uih_pkt->h.control = CLR_PF(UIH); /*奇怪:为什么不是SET_PF */if (len > SHORT_PAYLOAD_SIZE) {SET_LONG_LENGTH( ((long_frame*) uih_pkt)->h.length, len );} else {uih_pkt->h.length.ea = 1;uih_pkt->h.length.len = len;}
}
Multiplexer是一个对称的协议,也就是说协议连接的双方是对等的,谁都可以发起请求,设置控制参数,或者断开连接(不过要注意应用层协议是非对等的)。
DLC的创建与释放流程
应用打开设备准备发送数据前,MUX驱动会阻塞在打开进程中,直到打开成功。MUX驱动在收到打开消息时,会向打开通道发送SABM帧,如果DLC0此时没有被打开,还会先在DLC0上执行一次打开操作,待DLC0打开成功后才允许打开别的DLC通道。
一般来说,CP侧收到SABM帧后会响应UA帧表示建立通道,AP收到UA帧再返回打开成功状态。关闭DLC时发送DISC帧,等待响应DM帧时表示DLC关闭成功。理论上打开与关闭是对等的,AP与CP侧都可以主动发起,但项目实现中只有AP可以发起打开与关闭,并且HSIC通道0固定运行MUX协议,不能被关掉。以下给出理论上DLC打开与关闭流程。
另外,MUX驱动中还支持一个MSC(Modem Status Command), PN(Port Negotiation)等,主要是AP与CP侧MUX驱动同步一些状态,参考协议文档了解具体信息。
文章转载于:
multiplexer protocol研究笔记
GSM 07.10 MUX 协议驱动解析
GSM 07.10 MUX(multiplexer protocol)相关推荐
- android mux协议,GSM 07.10 MUX 协议驱动解析
PXA1802使用HSIC接口与AP连接,HSIC枚举实现7个虚拟通道ttyUSB0~6,为方便扩展,Marvell在HSIC虚拟通道0上实现了3GPP GSM-07.10 MUX协议,MUX协议提供 ...
- Java黑皮书课后题第10章:*10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal
10.20(近似e)编程练习题5.26使用下面数列近似计算e(略),为了得到更好的精度,在计算中使用25位精度的BigDecimal 题目 首次尝试 代码 运行 关于揪bug 第二次尝试 代码 运行结 ...
- Java黑皮书课后题第10章:*10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数
10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数 题目 破题 代码 运行结果 题目 10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数 破题 类似编程 ...
- Java黑皮书课后题第10章:*10.17(平方数)找出大于Long.MAX_VALUE的前10个平方数。平方数是指形式为n^2的数
例如,4.9以及16都是平方数,找到一种有效方法,使程序能快速运行 题目 破题 特别提醒 代码 题目 *10.17(平方数)找出大于Long.MAX_VALUE的前10个平方数.平方数是指形式为n^2 ...
- Java黑皮书课后题第10章:**10.9(Course类)如下改写Course类
10.9(Course类)改写Course类 题目 程序 代码 qingdan.java Test9.java Test9_Course.java 运行实例 题目 程序 Test9.java:测试程序 ...
- Java黑皮书课后题第10章:*10.6(显示素数)编写一个程序,然后按降序显示小于120的所有素数。使用StackOfIntegers类存储这些素数,获取之后按逆序显示它们
*10.6(显示素数) 题目 程序说明 代码 Test6.java Test6_StackOfIntegers.java 运行实例 题目 *10.6(显示素数)编写一个程序,然后按降序显示小于120的 ...
- Java黑皮书课后题第10章:10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点
10.4(MyPoint类)设计一个名为MyPoint的类,代表一个以x坐标和y坐标表示的点 题目 程序 代码 Test4.java Test4_MyPoint.java 运行实例 UML 题目 程序 ...
- Java黑皮书课后题第10章:10.3(MyInteger类)设计一个名为MyInteger的类
10.3(MyInteger类)设计一个名为MyInteger的类 题目 程序说明 代码 Test3.java Test3_MyInteger.java 运行实例 UML 题目 程序说明 测试程序:T ...
- Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中
Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中 题目 程序说明 题目槽点 代码:Test2_BMI.java 运行实例 题目 程序说明 Test2_BMI.java ...
最新文章
- Android动画原理
- 缺少linux内核,Linux内核缺页
- 学习笔记13-C语言-字符串函数、缓冲区
- 数学是发明还是发现?(一)
- 1111 复习 形状的打印
- springboot系列十二 Spring-Data-ElasticSearch Jpa、QueryBuilder、MatchQuery、位置搜索、GeoPoint...
- 通俗易懂的Python入门基础详细教程
- 小爱同学app安卓版_小爱同学app下载_小爱同学官网版手机客户端下载 安卓版 V2.8.60 - 罐头安卓网...
- 模电笔记1 | 信号的放大与分贝计算
- 什么是CSS hack及写法
- python遍历文件夹下的所有图片
- Redis的Mster/Slaver
- 怎么把分钟转化成秒_一分钟短视频文案范文怎么写?短视频文案必爆公式分享(附文案范文模板)...
- 1.camera硬件接口学习-DVP,MIPI-CSI2,USB
- 电商产品精修训练营第3天_ps修复画笔工具_ps修补工具_ps仿制图章工具
- JavaScript判断当前浏览器是否为IE或者Edge
- linux内核漏洞查询,GitHub - F1uYu4n/linux-kernel-exploits: linux-kernel-exploits Linux平台提权漏洞集合...
- python爬虫爬取豆瓣电影排行榜并通过pandas保存到Excel文件当中
- 常识-天文历法-为什么1900年不是闰年
- Windows 10系统Internet Explorer无法显示该网页怎么办?
热门文章
- 【python】判断闰年
- MySQL 整体架构与 SQL 执行原理,数据库事务原理
- 已解决org.springframework.context.annotation.ConflictingBeanDefinitionException异常的正确解决方法,亲测有效!!!
- 静态路由设置实例解析
- 2.利用docker+雨巷云打造私有网盘之安装nextcloud14.0.13
- jquery遍历得到的 Map 数据,
- 可怕的冷读术:十二种瞬间打开陌生…
- c语言今天是星期天,今天是星期天作文400字
- Mac干货 如何快速的在Mac上安装Windows双系统?虚拟机Parallels Desktop +Bootcamp安装
- 网络填坑之路(6)ethtool - 命令管理以太网卡