切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 10272阅读
  • 26回复

[无线]1元POS机,蓝牙模块AP6210B折腾 -- 初始化原理探索 [复制链接]

上一主题 下一主题
离线fnems0012
 
发帖
53
M币
106
专家
1
粉丝
15
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2016-06-30
本文是在各位前辈探索的基础上做出的。
为理解本文内容,建议先阅读以下帖子:
1
[34480016] VMWare Ubuntu Linux 玩米刷 (发表于 2016-1-30)
http://www.amobbs.com/thread-5643137-1-1.html
2
[spyke] 论坛首拆目前最流行POS机的蓝牙模块 AP6210B(发表于: 02-21)
http://bbs.mydigit.cn/read.php?tid=1552542
3
[sbiyou] [外设]蓝牙模块AP6210B折腾记之-一步一步教你分析初始化数据 (发表于: 05-13)
http://bbs.mydigit.cn/read.php?tid=1656231
4
[ytplwzl] 研究AP6210B的最新成果 (发表于: 05-14)
http://bbs.mydigit.cn/read.php?tid=1656716
5
[ytplwzl] AP6210B攻坚战最新战报。。。(发表于: 05-15)
http://bbs.mydigit.cn/read.php?tid=1657833

此外,本文的分析工具采用Python脚本编写,虽然大家不需要懂得Python语言,但如果想亲自执行一下脚本的话需要安装Python,此部分请自行解决。

- - - - - - - - 进入正题 - - - - - - - -
根据上述帖子能确定AP6210B内部芯片是bcm20710a1。
帖子1提到了在Ubuntu系统下驱动这个模块的方法,代码文件可查找brcm_patchram_plus.c
这个文件的作用是根据参数指令的设置,把固件(bcm20710a1.hcd,HCD二进制数据文件)通过串口从PC机发送到AP6210B模块,使模块初始化。
初始化之后模块就处于待机状态了。

分析brcm_patchram_plus.c可以知道初始化的流程,流程与帖子3大致是一致的。
所以,固件(HCD文件)只是初始化的一部分。
固件我能找到的有两个来源:
http://dl.cubieboard.org/public/Cubieboard/benn/firmware/ap6210/
http://github.com/thesawolf/android_device_rockchip_rk3188/tree/master/libs/bluetooth/firmware
这两个来源的固件内容是一样的。

固件由一系列的CMD Packet组成。
CMD包的结构见帖子3,简略来说,是两个字节的指令码、一个字节的长度,后面都是指令附带的数据。对HCD文件的分析可知指令都是4C FC,应该是向模块发送数据的指令。既然是写固件,又是分段写的,那么肯定会有地址。下面图片可以验证猜想。



红色为写固件指令4C FC,蓝色为数据长度。按照常理,长度后面应该会有地址。第一个包长度为2C,后面蓝色疑似地址00;
第二个包长度为FF,后看疑似地址28;第三个包长度为FF,后面疑似地址0123。
由于00 + 2C - 4 = 28; 28+FF-4 = 0123(都是十六进制),因此推测地址有四个字节,包长度等于4个字节的地址+若干字节数据。最大包长度为FF(255),即最大数据为251字节。

我写了Python分析固件的脚本,后面也用来分析截获的串口通讯数据。
脚本请在1楼下载,保存成.py文件就可以了。写的比较乱,请见谅~脚本用法很简单,执行的时候后面输入一个文件参数即可。



再后面,像帖子1一样把AP6210B模块的关键Pin以及PCB上的测试点接线引了出来。
PCB上的测点识别见我的帖子:
一元蓝牙POS机PCB测试点识别(发表于: 05-15)
http://bbs.mydigit.cn/read.php?tid=1658643

引出来的线路有GND,V33,RST,SWDIO,SWCLK,BOOT0,BOOT1,BT_RST,BT_RTS,BT_TX,BT_RX,BT_CTS,BT_WAKE



把RX与GND连接到USB串口上,可以读到初始化的数据。



在PC端我用的工具是RealTerm,开源软件,界面很整洁,功能也很强大。



利用Realterm的Capture功能可以将截获的数据保存到二进制文件。
由于初始化过程中速率是变化的,所以至少要采集两次数据。一次是115200bps,一次是921600bps。
初始化过程的详细描述见帖子3,简单总结为:
1)波特率默认为115200bps,复位(指令 03 0C),设置波特率为921600bps(指令18 FC)
步骤1)之后波特率提升到921600bps
2)发送固件数据(起始指令 2E FC,发送数据指令 4C FC)
3)结束发送固件数据(指令 4E FC)
步骤3)之后波特率又复位到默认的115200bps
4)复位,设置波特率为921600bps
步骤4之后波特率又更改到921600bps
5)后续设置。

后续设置较为复杂,执行的指令也很多。下图从4E FC之后的指令都是步骤5)的后续设置。由于波特率存在变化,下图中步骤4)被删掉。


我截获的数据见附件
cap-term-bt.zip

其中
cap-term-bt_rx_init1-115200.bin是115200bps速率下截获的原始数据,MCU发送到AP6210B;
cap-term-bt_rx_init1-921600.bin是921600bps速率下截获的原始数据,MCU发送到AP6210B;
cap-term-bt_rx_init1-921600-trim2.bin是921600bps速率截获的原始数据中,删掉115200bps部分(步骤1,步骤4),剩下的有意义的数据。


分析cap-term-bt_rx_init1-921600-trim2.bin可以看出,这个固件与网上能够找到的固件不一样,看起来精简许多(换句话说就是尺寸小);
此外固件中有部分ASCII字符串,可以看出固件不同。
网上的固件:


截获的固件:




有了这些数据,应该可以写自己的MCU程序来驱动AP6210B了,虽然不知道固件内容是什么。


[ 此帖被fnems0012在2016-06-30 13:54重新编辑 ]
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共15条打赏M币+37专家+1
12
离线fnems0012
发帖
53
M币
106
专家
1
粉丝
15
只看该作者 1楼 发表于: 2016-06-30
请登录后查看
[ 此帖被fnems0012在2016-06-30 13:42重新编辑 ]
本帖最近打赏记录:共3条打赏M币+9
离线oled

发帖
5062
M币
53
专家
4
粉丝
101
只看该作者 2楼 发表于: 2016-06-30
请登录后查看
离线lishibai

发帖
21619
M币
117
专家
11
粉丝
133
只看该作者 3楼 发表于: 2016-06-30
请登录后查看
离线fnems0012
发帖
53
M币
106
专家
1
粉丝
15
只看该作者 4楼 发表于: 2016-06-30
请登录后查看
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共1条打赏M币+3
离线wanglq
发帖
64
M币
21
专家
0
粉丝
5
只看该作者 5楼 发表于: 2016-06-30
请登录后查看
离线mysohu150

发帖
1014
M币
3176
专家
1
粉丝
20
只看该作者 6楼 发表于: 2016-06-30
请登录后查看
离线wsss1234

发帖
16880
M币
1291
专家
5
粉丝
54
只看该作者 7楼 发表于: 2016-06-30
请登录后查看
离线2545889167

发帖
13268
M币
20754
专家
302
粉丝
4860
只看该作者 8楼 发表于: 2016-06-30
请登录后查看
离线98xpj

发帖
475
M币
4925
专家
7
粉丝
32
只看该作者 9楼 发表于: 2016-06-30
请登录后查看
快速回复
限80 字节
“新手上路”发帖需审核后才能显示(请认真发帖),达到数码9级后取消此限制
 
上一个 下一个