页次: 1
还真有网友移植了bluedroid到 RT-Thread
http://blog.csdn.net/dong60382/article/details/38361521
中期总结:
1. 一直以来都非常感谢林少导师可以给我这次机会,并且一直帮助我解决问题!没有丝毫的抱怨,尽心尽力!谢谢林少导师!谢谢CSDN提供的这次夏令营平台!
2. 目前项目完成情况:
目前从android 4.2上下载的bluedroid代码经过修改,已经可以在rt-thread2.0上成功编译了。
3.第一个月的体会与收获:
bluedroid是一个比较大的项目,代码量很大,里面有很多东西需要考虑,错误很多,同时收获也很多,尽管很艰难,但我会坚持下去!加油!
1) 第一周总结:
第一周看了rt-thread的编程指南,熟悉了rtt的基本编程。
a. rtt对象模型的实现:
封装:隐藏内部实现(采用static修辞把作用范围局限在一个文件的内部);
继承:代码复用(在声明子结构体中将第一个成员定义成父结构体,这样就可以在定义子结构体的变量中,通过强制类型转换,得到父结构体中的成员和方法);
多态:同一消息为不同的对象接受时可产生完全不同的行动(通过函数指针实现的).
b. 线程管理:
创建:rt_thread t rt_thread_create ( const char* name, void (*entry) (void* parameter), void * parameter, rt_uint32_t stack_size, rt_uint8_t priority, rt_uint32_t tick);
初始化:rt_err_t rt_thread_init (struct rt_thread * thread, const char* name, void (*entry) (void* parameter), void * parameter, void* stack start, rt_uint32_t stack size, rt_uint8_t priority, rt_uint32_t tick);
删除:rt_err_t rt_thread_delete (rt_thread_t thread);
脱离线程:rt_err_t rt_thread_detach (rt_thread_t thread);
c. 线程间同步与通信:
关闭中断:
调度器上锁:
信号量:
互斥量:
事件:
邮箱:
消息队列:
d. I/O设备管理:
注册设备:rt_err_t rt_device_register(rt_device_t dev, const char* name, rt_uint8_t flags);
初始化所有设备:rt_err_t rt_device_init_all(void):
查找设备:rt_device_t rt_device_find(const char* name);
打开设备:rt_err_t rt_device_open (rt_device_t dev, rt_uint16_t oflags);
关闭设备: rt_err_t rt_device_close(rt_device_t dev);
……
设备驱动实现的步骤:
1. 实现RT-Thread中定义的设备公共接口,开始可以是空函数(返回类型是rt_err_t的可默认返回RT_EOK)。
2. 根据自己的设备类型定义自己的私有数据域。特别是可以有多个相同设备的情况下,设备接口可以用同一套,不同的只是各自的数据域(例如寄存器基地址)。
3. 按照RT-Thread的对象模型,扩展一个对象有两种方式:
(a) 定义自己的私有数据结构,然后赋值到RT-Thread设备控制块的private指针上。
(b) 从struct rt device结构中进行派生。
4. 根据设备的类型,注册到RT-Thread设备框架中。
2) 第二周总结:
使用Scons构建工程:
创建一个 SConstruct 文件:(SConstruct 是 scons 的配置文件,类似使用 make 工具时的 Makefile 文件 );
创建一个SConscript文件:(SConscript文件是用来指定哪些文件会加入编译 ,尽量保持编译参数CPPPATH 一致,否则可能会造成命令行太长错误,以及TypeError: unhashable type: list错误);
[html] view plain copy
SConscript:
import os
Import('RTT_ROOT')
Import('rtconfig')
from building import *
src = Glob('*.c')
CPPPATH = [os.path.join(GetCurrentDir(),'..','include'),os.path.join(GetCurrentDir())]
group = DefineGroup( 'bluedroid' , src , depend = [], CPPPATH = CPPPATH)
Return('group')
将所有文件加入到scons工程中进行编译。
3) 第三周总结:
熟悉bluedroid中所有文件的结构和作用:
Audio_a2dp_hw:
A2DP全名是Advanced Audio Distribution Profile 蓝牙音频传输模型协定!这个文件为bluedroid a2dp音频设备实现了hal。
Bta:
1. ag(audio gateway):蓝牙音频网关的实现
2. Ar(audio/video registration):音频/视频注册模块的实现
3. Av(advanced audio/video):更先进的音频/视频实现
4. Dm(device manager):bta设备管理实现
5. Fs(file system):包含bta文件系统编译时间可配置常数以及回调函数
6. Gatt:gatt客户端的主要功能和状态机
7. Hh(HID host):人性化接口设备(HID),连接鼠标键盘
8. Hl(HeaLth):健康设备模式的主要功能函数和状态机
9.Jv(Java):
10.Pan(蓝牙个人局域网):pan主要功能实现和状态机
11.Pb(phone book):电话薄访问服务器的私人文件
12.sys(system):bta系统管理的实现
Btif:
1. Co:call-out(bta的调出函数)
2. Src:
Bluetooth.c: 蓝牙HAL实现
btif_av.c: 蓝牙av实现
btif_config.c: 存储在本地的BT适配器和远程设备属性(xml)
btif_core.c: 包含HAL和BTE接口之间的核心功能函数
btif_dm.c: 包含设备管理(DM)相关功能
btif_hf.c: 免提模式蓝牙接口
btif_hh.c: HID主机配置文件的蓝牙接口
btif_hl.c: 医疗设备规范的蓝牙接口
btif_media_task.c: 这是多媒体模块的BTIF系统。它包含任务的实现av,HS和HF模式音频和视频处理
btif_pan.c: PAN模式蓝牙接口
btif_profile_queue.c:蓝牙远程设备的连接队列的实现。
btif_rc.c: 蓝牙AVRC实现
btif_sm.c: 通用BTIF状态机的API
btif_sock.c: 蓝牙Socket接口
btif_sock_rfc.c: 虚拟串口模式蓝牙接口
btif_sock_sdp.c: 服务发现
btif_sock_thread.c: socket select thread创建socket通信的线程
btif_sock_util.c: socket操作的一些相关函数
btif_storage.c: 存储在本地的BT适配器和远程设备属性(xml)
btif_util.c: 其它辅助功能
Gki:
1. Common:
2.Ulinux
HCI:
bt_hci_bdroid.c: 蓝牙主机/控制器接口库实现
bt_hw.c: 蓝牙供应商提供的回调函数
bt_utils.c: 其它辅助功能
Btsnoop.c: 生成一个蓝牙窥探文件
hci_h4.c: HCI传输发送/接收
hci_mct.c: HCI多通道传输
Lpm.c: 低功耗模式实现
Userial.c: 串行端口打开/读取/写入/关闭实现
userial_mct.c: 多通道打开/读/写/关闭功能
Utils.c: 帮助功能函数
Main:
bte_conf.c: 根据目前在conf文件条目进行运行时模块配置
bte_init.c: 此模块包含了初始化堆栈组件的例程,在BTU任务开始之前调用。
bte_logmsg.c: BTE日志信息封装
bte_main.c: BTE核心堆栈初始化和关闭代码
bte_version.c: BTE版本
Stack:
1. a2dp:
a2d_api.c: 高级音频传输模式OMMON的API(支持A2DP)
a2d_sbc.c: 实用功能,以帮助建立和解析SBC编解码信息单元与媒体有效载荷。
2. Avct:
avct_api.c: 音频/视频控制传输协议的API
avct_ccb.c: 操作AVCTP连接控制块的函数
avct_l2c.c: AVCTP模块接口至L2CAP
avct_lcb.c: 此模块包含链路控制状态机和操作链路控制块函数
avct_lcb_act.c: 链路控制状态机的行为函数
3. avdt:
avdt_ad.c: 此模块包含AVDTP适配层(adaption)
avdt_api.c: 音频/视频分发传输协议的API
avdt_ccb.c: 通道控制块状态机和操作该通道控制块的功能函数
avdt_ccb_act.c: 与通道控制块状态机相关的操作功能函数
avdt_l2c.c: AVDTP适配层模块接口L2CAP
avdt_msg.c: 用于分析和生成AVDTP信令消息的功能
avdt_scb.c: 流控制块及其操作函数
avdt_scb_act.c: 流控制块状态机相关的操作功能函数
4. Avrc:
avrc_api.c: AVRCP必须命令接口API
avrc_opt.c: AVRCP可选命令接口API
avrc_sdp.c: AVRCP SDP相关的功能
5. Bnep:
bnep_api.c: BNEP API
bnep_main.c: BNEP 主要功能函数
bnep_utils.c: BNEP实用功能函数
6. Btm:
btm_acl.c: 处理ACL连接,保持和嗅探模式,支持数据包类型。
btm_ble.c: BLE设备的控制及安全功能
btm_ble_addr.c: BLE地址管理
btm_ble_bgconn.c:BLE白名单的操作
btm_ble_gap.c: BLE GAP
btm_dev.c: 蓝牙设备管理
btm_devctl.c: 处理BTM接口功能,包括休息,HCl缓冲大小等
btm_inq.c: 处理查询(handle inquiries),包括设置发现模式,控制基带的方式, 维护查询响应的小型数据库
btm_main.c: BTM控制块的定义
btm_pm.c: 管理ACL链路模式功能(活跃,持有,停和嗅探模式)
btm_sco.c: 处理SCO连接,连接,断开连接,改变支持数据包类型。
btm_sec.c: 蓝牙安全管理器功能
7. Btu:
btu_hcif.c: HCI传输接口,(事件接受至l2cap等事件处理程序,命令传输)
btu_init.c: 加载和关闭核心协议栈组件的例程
btu_task.c: 蓝牙上层处理循环,RFCOMM L2CAP,SDP和BTIF 为一体GKI任务。他们之间的这种btu_task切换
8. Gatt:
att_protocol.c: ATT协议功能
gatt_api.c: GATT接口API
gatt_attr.c: GATT服务器属性访问请求处理函数。
gatt_auth.c: GATT认证处理功能
gatt_cl.c: GATT客户端功能函数
gatt_db.c: GATT数据库的建立和查询
gatt_main.c: 主要的ATT功能函数
gatt_sr.c: GATT服务器功能函数
gatt_utils.c: GATT实用函数
9. Hcic:
Hciblecmds.c: HCIC单元格式和发送HCI命令
Hcicmds.c:
10. Hid:
hidh_api.c: HID主机API
hidh_conn.c: 连接接口功能函数
11. L2cap:
l2c_api.c: L2CAP接口API
l2c_ble.c: 与ble管理相关的功能函数
l2c_csm.c: L2CAP信道状态机(channel state machine)
l2c_fcr.c: 流量控制和重传(Flow Control and retransmissions)
l2c_link.c: 与链路管理相关
l2c_main.c: L2CAP入口点
l2c_ucd.c: L2CAP UCD 代码
l2c_utils.c: L2cap实用函数
12. Mcap(多通道适配协议):
mca_api.c: Multi-Channel Adaptation Protocol 接口API
mca_cact.c: 控制通道操作功能函数的实现
mca_csm.c: 控制通道的状态机的实现。
mca_dact.c: 数据通道功能的实现
mca_dsm.c: 数据信道状态机
mca_l2c.c: MCAP在L2CAP接口上的实现
mca_main.c: MCAP主控制块的实现
13. Pan:
pan_api.c: pan规范接口api
pan_main.c: 支持pan命令和事件的功能函数
pan_utils.c:
14. Rfcomm:
port_api.c: 串行端口API
port_rfc.c: 端口仿真实体和RFCOMM通信
port_utils.c: 端口仿真实体函数
rfc_l2cap_if.c: L2CAP接口函数
rfc_mx_fsm.c: RFCOMM单元的多路通道的状态机和操作例程
rfc_port_fsm.c: RFCOMM单元的端口的状态机和操作例程
rfc_port_if.c: 供RFCOMM之上运行的应用程序调用
rfc_ts_frames.c: 发送TS 07.10帧
rfc_utils.c: 使用的RFCOMM单元的实用函数
15. Sdp:
sdp_api.c: SDP接口API
sdp_db.c: 处理数据库函数
sdp_discovery.c: SDP发现功能
sdp_main.c: SDP主函数
sdp_server.c: SDP服务器功能。这主要是处理客户端请求
sdp_utils.c: SDP实用函数
16. Smp:
Aes.c: AES实现,使用唯一的8位字节操作加密状态
smp_act.c:
smp_api.c: SMP的应用程序接口。
smp_cmac.c: AES128 CMAC算法实现
smp_keys.c:
smp_l2c.c: SMP l2cap接口上的实现
smp_main.c: SMP主函数
smp_utils.c: SMP L2Cap实用函数
通过修改裁剪,将需要的文件加入工程编译通过!
4) 第四周总结:
让bluedroid在rtt上链接通过!
源码分析:
1. 顶层bluetooth.c实现了android的hal层协议,通过操作bluetooth_device_t来控制蓝牙设备;
2. 底层bt_hci_bdroid.c实现tHCI_IF接口,控制hci数据收发;
3. 设置属性操作:
bluetooth.c :: set_adapter_property -> btif_core.c :: btif_set_adapter_property
btif_set_adapter_property对属性BT_PROPERTY_ADAPTER_SCAN_MODE设置的处理,先保存discovery mode为BTA_DM_NON_DISC,表示不可发现,保存connecable mode为BTA_DM_NON_CONN,表示不可连接。然后,调用external/bluetooth/bluedroid/bta/dm/bta_dm_api.c :: BTA_DmSetVisibility方法
BTA_DmSetVisibility构造一个tBTA_DM_API_SET_VISIBILITY *p_msg,填入discovery mode, connetiable mode等参数,然后调用external/bluetooth/bluedroid/bta/sys/bta_sys_main.c :: bta_sys_sendmsg
bta_sys_sendmsg调用gki_buffer.c :: GKI_send_msg发送一条GKI信息到BTA,GKI_send_msg有三个参数,第一个参数是线程id,也作为task id, 通过bta_sys_init获得,第二个参数是mailbox id,第三个是上一步封装好的p_msg ,GKI_send_msg首先对p_msg进一步封装成event,通过链表存到mailbox id对应的任务队列中,调用gki_ulinux.c :: GKI_send_event进行发送
GKI_send_event设置事件掩码gki_cb.com.OSWaitEvt[task_id] |= event;, 通过pthread_cond_signal(&gki_cb.os.thread_evt_cond[task_id]);通知另外线程。
4. 第二月计划:
进一步完善代码!将一些注释掉的未实现的一些功能函数代码在rtt下实现!然后调试运行!
第一周:
1. 在rtt平台上完成对蓝牙配置文件的读取,
2. 完成对bluedroid串口的适配
3. 移植libbt库
之后: 熟悉协议,运行代码并测试协议栈
大家好, 我克隆这个项目 https://github.com/whyengineer/esp32_baidu_rest.git
编译烧录进去之后,
发现可以获取到IP, 但是不停重启, 要奔溃了
I (2845) wifi: state: assoc -> run (10)
I (2868) wifi: connected with whycan.cn, channel 11
I (3838) event: ip: 192.168.43.114, mask: 255.255.255.0, gw: 192.168.43.1
I (3839) event:: got ip:192.168.43.114
I (3839) main:: ~~~~~~~~~~~
I (3843) main:: ETHIP:192.168.43.114
I (3847) main:: ETHPMASK:255.255.255.0
I (3852) main:: ETHPGW:192.168.43.1
I (3856) main:: ~~~~~~~~~~~
I (3859) webserver:: webserver start
I (3860) I2S: DMA Malloc info, datalen=blocksize=512, dma_buf_count=4
I (3864) gpio: GPIO[16]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
I (3871) I2S: DMA Malloc info, datalen=blocksize=512, dma_buf_count=4
I (3887) I2S: Req RATE: 8000, real rate: 8012.000, BITS: 16, CLKM: 78, BCK: 8, MCLK: 2048000.000, SCLK: 256384.000000, diva: 64, divb: 8
I (3917) gpio: GPIO[16]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 0| Pulldown: 0| Intr:0
E (4881) sdmmc_req: sdmmc_host_wait_for_event returned 0x107
E (4881) sdmmc_cmd: sdmmc_card_init: go_idle_state (1) returned 0x107
Guru Meditation Error of type IllegalInstruction occurred on core 0. Exception was unhandled.
Register dump:
PC : 0x40114845 PS : 0x00060230 A0 : 0x00000000 A1 : 0x3ffe2300
A2 : 0x0000000a A3 : 0x00000001 A4 : 0xffffffff A5 : 0x00000000
A6 : 0x00000000 A7 : 0x00000000 A8 : 0x80114845 A9 : 0x3ffe22b0
A10 : 0x0000005d A11 : 0x3ffdf73c A12 : 0x3ffc6b8c A13 : 0x3ffe2358
A14 : 0x3ffe2360 A15 : 0x3f40b2a0 SAR : 0x00000004 EXCCAUSE: 0x00000000
EXCVADDR: 0x00000000 LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff
Backtrace: 0x40114845:0x3ffe2300 0x7ffffffd:0x3ffe23f0
Rebooting...
ets Jun 8 2016 00:22:57
页次: 1