Android-IRリモコンが無効です


質問:
SDKをアップグレードしたためリモコンが使えなくなり、ir駆動のコードは修正されず、完全に一致しており、アップグレード前にリモコンは使えますが、アップグレードは使えません.
問題の分析:
1、駆動と印刷を行い、キーメッセージが送信されたかどうかを確認する
void ir_input_event_irCallback(void *pParam, int iParam)
input_が呼び出されましたreport_keyおよびinput_syncはキー送信を行いましたが、これは問題ないはずです.
2、上位層はandroidシステムが持っているgeteventを利用してキー値を取得する
D:\hisi-tools\sdk-tools>adb shell
	# getevent
	getevent
	add device 1: /dev/input/event1
	name: "nexus ir input"
	could not get driver version for /dev/input/mouse1, Not a typewriter
	add device 2: /dev/input/event0
	name: "Darfon USB Optical Mouse"

logcat印刷:
I/EventHub( 1794): New keyboard: device->id=0x10000 devname='nexus ir input' propName='hw.keyboards.65536.devname'keylayout='/system/usr/keylayout/qwerty.kl' I/EventHub( 1794): New device: path=/dev/input/event1 name=nexus ir input id=0x10000 (of 0x1) index=1 fd=102 classes=0x1
デバイスの作成に成功したことを説明し、デバイスノードがないという問題はなく、基本的に送信側と受信側のデバイス登録に問題がないことを確認することができる.
   
3、struct input_を確認するdev構造におけるkeyに関する設定
unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
key_dev->evbit[0] = BIT_MASK(EV_KEY); for (i = 0; nexus_ir_input_inputkeys[i].inputev; i++)
set_bit(nexus_ir_input_inputkeys[i].inputev, key_dev->keybit);
問題もなく...これが低いのはどこの問題ですか???
4、linux kernel送信プロセスに印刷を加える
見てみろsyncおよびinput_report_keyの実行フロー
コードパス:
drivers/input/input.c 
static inline void input_report_key(struct input_dev *dev, unsigned int code, int value) {
input_event(dev, EV_KEY, code, !!value);
}
static inline void input_sync(struct input_dev *dev) {
input_event(dev, EV_SYN, SYN_REPORT, 0);
}
すべてinput_を呼び出しますevent --> input_handle_event()-->ここでは、キーcaseポイントを本当に処理することに重点を置く必要があります.
static void input_handle_event(struct input_dev *dev,
			       unsigned int type, unsigned int code, int value)
{
	int disposition = INPUT_IGNORE_EVENT;

	printk(KERN_ERR "input_handle_event call..(type=%d,code=%d) 
",type,code); switch (type) { case EV_SYN: switch (code) { case SYN_CONFIG: disposition = INPUT_PASS_TO_ALL; break; case SYN_REPORT: if (!dev->sync) { dev->sync = 1; disposition = INPUT_PASS_TO_HANDLERS; } break; case SYN_MT_REPORT: dev->sync = 0; disposition = INPUT_PASS_TO_HANDLERS; break; } break; case EV_KEY: if (is_event_supported(code, dev->keybit, KEY_MAX) && !!test_bit(code, dev->key) != value) { if (value != 2) { __change_bit(code, dev->key); if (value) input_start_autorepeat(dev, code); else input_stop_autorepeat(dev); } disposition = INPUT_PASS_TO_HANDLERS; } break; ... if (disposition != INPUT_IGNORE_EVENT && type != EV_SYN){ printk(KERN_ERR "input_handle_event INPUT_IGNORE_EVENT"); dev->sync = 0; } if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event){ printk(KERN_ERR "input_handle_event INPUT_PASS_TO_DEVICE"); dev->event(dev, type, code, value); } if (disposition & INPUT_PASS_TO_HANDLERS){ printk(KERN_ERR "input_handle_event INPUT_PASS_TO_HANDLERS"); input_pass_event(dev, type, code, value); } }

EV_でKEYと一番後ろの3つのif条件を印刷すると、問題点が見つかります.
理由:
input_report_key(nexus_ir_input_event_device.input_key_dev, nexus_ir_input_inputkeys[i].inputev, irEvent.repeat); input_sync(nexus_ir_input_event_device.input_key_dev); input_report_key(nexus_ir_input_event_device.input_key_dev, nexus_ir_input_inputkeys[i].inputev, 0); input_sync(nexus_ir_input_event_device.input_key_dev);
irEvent.repeatこの値はfalseである0であり、
case EV_KEY: if (is_event_supported(code, dev->keybit, KEY_MAX) &&     !!test_bit(code, dev->key) != value) {
ここで判定に失敗し,入ることなく,,,それによって後の3つのif条件がすべて間違っていることを引き起こす.
正しいプロセス:
<3>input_handle_event call..(type=2,code=0)  <3>input_handle_event INPUT_IGNORE_EVENT <3>input_handle_event INPUT_PASS_TO_HANDLERS <3>input_handle_event call..(type=2,code=1)  <3>input_handle_event call..(type=2,code=8)  <3>input_handle_event call..(type=0,code=0)  <3>input_handle_event INPUT_PASS_TO_HANDLERS
問題解決:
input_report_key(nexus_ir_input_event_device.input_key_dev, nexus_ir_input_inputkeys[i].inputev,1); 
とても撒きやすくて、、、、ははは、しかしこの问题は私に1时间10分を过ぎて、更にこの问题を记录して20分を记录して、ははは...