handle12flags0x00dlen12
0000:
08004b0082110e09487cc600..K.....H|?
>HCIEvent:
NumberofCompletedPackets(0x13)plen5
0000:
010c000200.....
>HCIEvent:
MaxSlotsChange(0x1b)plen3
0000:
0c0001...
>HCIEvent:
ModeChange(0x14)plen6
0000:
000c0002c800....?
然后将control.c的日志打印出来:
按一次”“播放/暂停键”:
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=46对应PAUSE_OP
D/ACRVP(237):
key_quirks=0,pressed=1按键按下
D/ACRVP(237):
control->uinput=fffffffe,send_key=201对应MEDIA_PLAY_PAUSE
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=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):
operands[0]=44对应PLAY_OP
D/ACRVP(237):
key_quirks=0,pressed=1按键按下
D/ACRVP(237):
control->uinput=fffffffe,send_key=200对应MEDIA_PLAY_PAUSE
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=c4
D/ACRVP(237):
key_quirks=0,pressed=0按键释放
D/ACRVP(237):
control->uinput=fffffffe,send_key=200对应MEDIA_PLAY_PAUSE
nextkey:
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=4b对应FORWARD_OP
D/ACRVP(237):
key_quirks=0,pressed=1
D/ACRVP(237):
control->uinput=fffffffe,send_key=163对应MEDIA_NEXT
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=cb
D/ACRVP(237):
key_quirks=0,pressed=0
D/ACRVP(237):
control->uinput=fffffffe,send_key=163
prevkey:
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=4c对应BACKWARD_OP
D/ACRVP(237):
key_quirks=0,pressed=1
D/ACRVP(237):
control->uinput=fffffffe,send_key=165对应
D/ACRVP(237):
---handle_panel_passthrough----
D/ACRVP(237):
operands[0]=cc
D/ACRVP(237):
key_quirks=0,pressed=0
D/ACRVP(237):
control->uinput=fffffffe,send_key=165MEDIA_PREVIOUS
从上面可以看到bluetooth的协议栈blueZ是没有问题的
将frameworks\base\libs\ui\EventHub.cpp的LOG打开,只能看到了control.c的日志,EventHub的getEvent完全不响应
观察所有log日志发现,openDevice里也没有装载AVRCP.kl
初步判断event有问题
event分析:
$adbshell
#cd/proc/bus/input
#catdevices
catdevices
#catdevices
catdevices
I:
Bus=0019Vendor=0001Product=0001Version=0001参考s3c-keypad.c
N:
Name="s3c-keypad"input_dev->name=DEVICE_NAME;
P:
Phys=s3c-keypad/input0input_dev->phys="s3c-keypad/input0";
S:
Sysfs=/devices/virtual/input/input0virtual的?
U:
Uniq=
H:
Handlers=event0
B:
EV=3
B:
KEY=40004000
I:
Bus=0019Vendor=0001Product=0001Version=0100参考vpad_buttons.c
N:
Name="s3c-eintkey"input->name=pdev->name,gpio_keys_device_driver.name="s3c-eintkey",
P:
Phys=gpio-keys/input0input->phys="gpio-keys/input0"
S:
Sysfs=/devices/platform/s3c-eintkey/input/input1为什么这里是platform目录?
U:
Uniq=
H:
Handlers=event1
B:
EV=3
B:
KEY=100000000
I:
Bus=0018Vendor=0000Product=0000Version=0000参考amri_ts.c
N:
Name="amri_ts"amri_ts_driver.name="amri_ts"
P:
Phys=没有定义
S:
Sysfs=/devices/platform/s3c2440-i2c.0/i2c-0/0-0033/input/input2为什么这里是platform目录?
U:
Uniq=
H:
Handlers=event2
B:
EV=b
B:
KEY=4000000040000800400010000
B:
ABS=26500000
I:
Bus=0000Vendor=0000Product=0000Version=0000
N:
Name="ecompass_data"
P:
Phys=
S:
Sysfs=/devices/virtual/input/input3
U:
Uniq=
H:
Handlers=event3
B:
EV=9
B:
ABS=307bf
从上面可以看到,完全没有AVRCP的event。
解决办法:
Kernel
$makemenuconfig
CONFIG_INPUT_UINPUT
解决后的状况:
$adbshell
#cd/proc/bus/input
#catdevices
显示增加了一个event
I:
Bus=0005Vendor=0000Product=0000Version=0000
N:
Name="AVRCP"
P:
Phys=
S:
Sysfs=/devices/virtual/input/input4
U:
Uniq=
H:
Handlers=event4
B:
EV=100007
B:
KEY=1030016800000
B:
REL=0
看openDevice的信息:
D/EventHub(84):
EventHub:
:
readNotifynfd:
87
D/EventHub(84):
Openingdevice:
/dev/input/event4
D/EventHub(84):
Gettingkeys...
D/EventHub(84):
Gettingabsolutecontrollers...
D/EventHub(84):
keylayoutFilename=/system/usr/keylayout/AVRCP.kl
I/EventHub(84):
Newkeyboard:
device->id=0x10003devname='AVRCP'propName='hw.keyboards.65539.devname'keylayout='/system/usr/keylayout/AVRCP.kl'
I/EventHub(84):
Newdevice:
path=/dev/input/event4name=AVRCPid=0x10003(of0x4)index=4fd=196classes=0x1
D/EventHub(84):
Addingdevice/dev/input/event40x361800at4,id=3,classes=0x1
D/EventHub(84):
Reportingdeviceopened:
id=0x10003,name=/dev/input/event4
按键时也可以看到EventHub的信息了:
Log如下:
D/ACRVP(236):
---handle_panel_passthrough----
D/ACRVP(236):
operands[0]=46
D/ACRVP(236):
key_quirks=0,pressed=1
D/ACRVP(236):
control->uinput=14,send_key=201control.c发出201号键,按键按下了
D/EventHub(84):
/dev/input/event4got:
t0=937,t1=582930,type=1,code=201,v=1表示从event4得到201号键MEDIA_PLAY_PAUSE
D/EventHub(84):
iev.code=201keyCode=85flags=0x00000001err=0
D/EventHub(84):
/dev/input/event4got:
t0=937,t1=600241,type=0,code=0,v=0
D/AudioHardware(61):
AudioStreamOutALSA:
:
setParameters()routing=0
D/ACRVP(236):
---handle_panel_passthrough----
D/ACRVP(236):
operands[0]=c6
D/ACRVP(236):
key_quirks=0,pressed=0
D/ACRVP(236):
control->uinput=14,send_key=c9
D/EventHub(84):
/dev/input/event4got:
t0=937,t1=664391,type=1,code=201,v=0control.c发出201号键,按键释放了
D/EventHub(84):
iev.code=201keyCode=85flags=0x00000001err=0
D/EventHub(84):
/dev/input/event4got:
t0=937,t1=664406,type=0,code=0,v=0
D/A2DP(61):
a2dp_stop
D/A2DP(61):
bluetooth_stop
E/BluetoothEventLoop.cpp(84):
event_filter:
Receivedsignalorg.bluez.AudioSink:
Stoppedfrom/org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1C
E/BluetoothEventLoop.cpp(84):
event_filter:
Receivedsignalorg.bluez.AudioSink:
PropertyChangedfrom/org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1C
E/BluetoothEventLoop.cpp(84):
event_filter:
Receivedsignalorg.bluez.AudioSink:
PropertyChangedfrom/org/bluez/236/hci0/dev_00_1D_BA_A5_D8_1C
V/BluetoothEventRedirector(244):
Receivedandroid.bluetooth.a2dp.action.SINK_STATE_CHANGED
D/CachedBluetoothDevice(244):
onProfileStateChanged:
profileA2DPnewProfileState2
D/BluetoothA2dpService(84):
A2DPstate:
device:
00:
1D:
BA:
A5:
D8:
1CState:
4->2
D/A2DP(61):
ReceivedBT_RESPONSE-BT_STOP_STREAM
D/dalvikvm(285):
GC_EXPLICITfreed87K,56%free2640K/5895K,external1625K/2137K,paused75ms
MacroLiu
2011-08-01