




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android 蓝牙AVRCP功能的实现作者:Macro LiuAVRCP的按键定义:sdkemulatorkeymapsAVRCP.klkey 200 MEDIA_PLAY_PAUSE WAKEkey 201 MEDIA_PLAY_PAUSE WAKEkey 166 MEDIA_STOP WAKEkey 163 MEDIA_NEXT WAKEkey 165 MEDIA_PREVIOUS WAKEkey 168 MEDIA_REWIND WAKEkey 208 MEDIA_FAST_FORWARD WAKEBCM(broadcom)宏定义需要打开:BOARD_HAVE_BLUETOOTH_BCM := trueBT音频控制的代码externalbluetoothbluezaudiocontrol.c(1) 按键的MAPstatic struct const char *name;uint8_t avrcp;uint16_t uinput; key_map = PLAY,PLAY_OP,KEY_PLAYCD , STOP,STOP_OP,KEY_STOPCD , PAUSE,PAUSE_OP,KEY_PAUSECD , FORWARD,FORWARD_OP,KEY_NEXTSONG , BACKWARD,BACKWARD_OP,KEY_PREVIOUSSONG , REWIND,REWIND_OP,KEY_REWIND , FAST FORWARD,FAST_FORWARD_OP,KEY_FASTFORWARD , NULL ;(2) 按键处理static void handle_panel_passthrough(struct control *control, for (i = 0; key_ != NULL; i+) uint8_t key_quirks;if (operands0 & 0x7F) != key_mapi.avrcp)continue;DBG(AVRCP: %s %s, key_, status);key_quirks = control-key_quirkskey_mapi.avrcp;if (key_quirks & QUIRK_NO_RELEASE) if (!pressed) DBG(AVRCP: Ignoring release);break;DBG(AVRCP: treating key press as press + release);send_key(control-uinput, key_mapi.uinput, 1);send_key(control-uinput, key_mapi.uinput, 0);break;send_key(control-uinput, key_mapi.uinput, pressed);break;HCIDUMP数据分析以Sony耳机DRC-BT15为例#adb shell#hcidump X左键: ACL data: handle 12 flags 0x02 dlen 12 L2CAP(d): cid 0x0042 len 8 psm 0 0000: 30 11 0e 00 48 7c 4c 00 0.H|L. HCI Command: Exit Sniff Mode (0x02|0x0004) plen 2 0000: 0c 00 . HCI Event: Max Slots Change (0x1b) plen 3 0000: 0c 00 05 . HCI Event: Mode Change (0x14) plen 6 0000: 00 0c 00 00 00 00 . HCI Event: Command Status (0x0f) plen 4 0000: 0c 01 04 08 . ACL data: handle 12 flags 0x02 dlen 12 L2CAP(d): cid 0x0042 len 8 psm 0 0000: 40 11 0e 00 48 7c cc 00 .H|? HCI Event: Number of Completed Packets (0x13) plen 5 0000: 01 0c 00 02 00 .播放/暂停: ACL data: handle 12 flags 0x02 dlen 12 L2CAP(d): cid 0x0042 len 8 psm 0 0000: 50 11 0e 00 48 7c 4b 00 P.H|K. ACL data: handle 12 flags 0x02 dlen 12 L2CAP(d): cid 0x0042 len 8 psm 0 0000: 60 11 0e 00 48 7c cb 00 .H|? HCI Event: Number of Completed Packets (0x13) plen 5 0000: 01 0c 00 02 00 .右键: ACL data: handle 12 flags 0x02 dlen 12 L2CAP(d): cid 0x0042 len 8 psm 0 0000: 70 11 0e 00 48 7c 46 00 p.H|F. ACL data: handle 12 flags 0x02 dlen 12 L2CAP(d): cid 0x0042 len 8 psm 0 0000: 80 11 0e 00 48 7c c6 00 .H|? HCI Event: Number of Completed Packets (0x13) plen 5 0000: 01 0c 00 02 00 . HCI Event: Max Slots Change (0x1b) plen 3 0000: 0c 00 01 . HCI Event: Mode Change (0x14) plen 6 0000: 00 0c 00 02 c8 00 .?然后将control.c的日志打印出来:按一次”“播放/暂停键”:D/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = 46 对应PAUSE_OPD/ACRVP ( 237): key_quirks = 0, pressed = 1按键按下D/ACRVP ( 237): control-uinput = fffffffe,send_key = 201对应MEDIA_PLAY_PAUSED/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = c6 (= 0x46 0x80 表示按键释放了)D/ACRVP ( 237): key_quirks = 0, pressed = 0按键释放D/ACRVP ( 237): control-uinput = fffffffe,send_key = 201 对应MEDIA_PLAY_PAUSE再按一次”“播放/暂停键”:D/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = 44 对应PLAY_OPD/ACRVP ( 237): key_quirks = 0, pressed = 1 按键按下D/ACRVP ( 237): control-uinput = fffffffe,send_key = 200 对应MEDIA_PLAY_PAUSED/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = c4D/ACRVP ( 237): key_quirks = 0, pressed = 0 按键释放D/ACRVP ( 237): control-uinput = fffffffe,send_key = 200 对应MEDIA_PLAY_PAUSEnext key:D/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = 4b对应FORWARD_OPD/ACRVP ( 237): key_quirks = 0, pressed = 1D/ACRVP ( 237): control-uinput = fffffffe,send_key = 163 对应MEDIA_NEXTD/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = cbD/ACRVP ( 237): key_quirks = 0, pressed = 0D/ACRVP ( 237): control-uinput = fffffffe,send_key = 163prev key:D/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = 4c 对应BACKWARD_OPD/ACRVP ( 237): key_quirks = 0, pressed = 1D/ACRVP ( 237): control-uinput = fffffffe,send_key = 165 对应D/ACRVP ( 237): - handle_panel_passthrough -D/ACRVP ( 237): operands0 = ccD/ACRVP ( 237): key_quirks = 0, pressed = 0D/ACRVP ( 237): control-uinput = fffffffe,send_key = 165 MEDIA_PREVIOUS从上面可以看到bluetooth的协议栈blueZ是没有问题的将 frameworksbaselibsuiEventHub.cpp的LOG打开,只能看到了control.c的日志,EventHub的getEvent完全不响应观察所有log日志发现,openDevice里也没有装载AVRCP.kl初步判断event有问题event分析:$ adb shell# cd /proc/bus/input# cat devicescat devices# cat devicescat devicesI: Bus=0019 Vendor=0001 Product=0001 Version=0001 参考s3c-keypad.cN: Name=s3c-keypad input_dev-name = DEVICE_NAME;P: Phys=s3c-keypad/input0 input_dev-phys = s3c-keypad/input0;S: Sysfs=/devices/virtual/input/input0 virtual的?U: Uniq=H: Handlers=event0B: EV=3B: KEY=4000400 0I: Bus=0019 Vendor=0001 Product=0001 Version=0100参考vpad_buttons.cN: Name=s3c-eintkey input-name = pdev-name, gpio_keys_device_= s3c-eintkey,P: Phys=gpio-keys/input0 input-phys = gpio-keys/input0S: Sysfs=/devices/platform/s3c-eintkey/input/input1 为什么这里是platform目录?U: Uniq=H: Handlers=event1B: EV=3B: KEY=100000 0 0 0I: Bus=0018 Vendor=0000 Product=0000 Version=0000 参考amri_ts.cN: Name=amri_ts amri_ts_ = amri_tsP: Phys= 没有定义S: Sysfs=/devices/platform/s3c2440-i2c.0/i2c-0/0-0033/input/input2 为什么这里是platform目录?U: Uniq=H: Handlers=event2B: EV=bB: KEY=400 0 0 0 0 0 40000800 40 0 0 10000B: ABS=2650000 0I: Bus=0000 Vendor=0000 Product=0000 Version=0000N: Name=ecompass_dataP: Phys=S: Sysfs=/devices/virtual/input/input3U: Uniq=H: Handlers=event3B: EV=9B: ABS=307bf从上面可以看到,完全没有AVRCP的event。解决办法:Kernel$ make menuconfigCONFIG_INPUT_UINPUT解决后的状况:$ adb shell# cd /proc/bus/input# cat devices显示增加了一个eventI: Bus=0005 Vendor=0000 Product=0000 Version=0000N: Name=AVRCPP: Phys=S: Sysfs=/devices/virtual/input/input4U: Uniq=H: Handlers=event4B: EV=100007B: KEY=10300 168 0 0 0 0 0B: REL=0看openDevice的信息:D/EventHub( 84): EventHub:readNotify nfd: 87D/EventHub( 84): Opening device: /dev/input/event4D/EventHub( 84): Getting keys.D/EventHub( 84): Getting absolute controllers.D/EventHub( 84): keylayoutFilename = /system/usr/keylayout/AVRCP.kl I/EventHub( 84): New keyboard: device-id=0x10003 devname=AVRCP propName=hw.keyboards.65539.devname keylayout=/system/usr/keylayout/AVRCP.klI/EventHub( 84): New device: path=/dev/input/event4 name=AVRCP id=0x10003 (of 0x4) index=4 fd=196 classes=0x1D/EventHub( 84): Adding device /dev/input/event4 0x361800 at 4, id = 3, classes = 0x1D/EventHub( 84): Reporting device opened: id=0x10003, name=/dev/input/event4按键时也可以看到EventHub的信息了:Log如下:D/ACRVP ( 236): - handle_panel_passthrough -D/ACRVP ( 236): operands0 = 46D/ACRVP ( 236): key_quirks = 0, pressed = 1D/ACRVP ( 236): control-uinput = 14,send_key = 201 control.c发出201号键,按键按下了D/EventHub( 84): /dev/input/event4 got: t0=937, t1=582930, type=1, code=201, v=1 表示从event4得到201号键 MEDIA_PLAY_PAUSED/EventHub( 84): iev.code=201 keyCode=85 flags=0x00000001 err=0D/EventHub( 84): /dev/input/event4 got: t0=937, t1=600241, type=0, code=0, v=0D/AudioHardware( 61): AudioStreamOutALSA:setParameters() routing=0D/ACRVP ( 236): - handle_panel_passthrough -D/ACRVP ( 236): operands0 = c6D/ACRVP ( 236): key_quirks = 0, pressed = 0D/ACRVP ( 236): control-uinput = 14,send_key = c9D/EventHub( 84): /dev/input/event4 got: t0=937, t1=664391, type=1, code=201, v=0 control.c发出201号键,按键释放了D/EventHub( 84): iev.code=201 keyCode=85 flags=0x00000001 err=0D/EventHub( 84): /dev/input/event4 got: t0=937, t1=664406, type=0, code=0, v=0D/A2DP ( 61): a2dp_stopD/A2DP ( 61): bluetooth_stopE/Bluetooth
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国家能源九江市2025秋招法学类面试追问及参考回答
- 博尔塔拉自治州中石化2025秋招面试半结构化模拟题及答案炼化装置操作岗
- 中国移动荆州市2025秋招笔试性格测评专练及答案
- 承德市中石化2025秋招笔试行测50题速记
- 2025年机务教员考试试题及答案
- 江西地区中石油2025秋招面试半结构化模拟题及答案机械与动力工程岗
- 国家能源营口市2025秋招笔试综合知识题专练及答案
- 九江市中储粮2025秋招质检化验岗高频笔试题库含答案
- 儋州市中石油2025秋招笔试模拟题含答案法律与合规岗
- 中国广电乌海市2025秋招笔试行测经典题及答案
- 教育领域PPP项目融资方案
- 【MOOC】学术英语演讲-南京航空航天大学 中国大学慕课MOOC答案
- 普通饮片车间共线生产风险评估报告
- 《机械制图(多学时)》中职全套教学课件
- 英语日常交际用语200句
- GB/T 8492-2024一般用途耐热钢及合金铸件
- 读懂诗家语省公开课金奖全国赛课一等奖微课获奖课件
- 山西省职校技能大赛(植物病虫害防治赛项)参考试题库(含答案)
- 安全生产培训内容
- 老年人认知障碍的早期识别与干预
- 小兵张嘎夺枪记(课本剧)
评论
0/150
提交评论