Android
的耳機檢測其實代碼改動很少的
也是因為少吧,所以一直沒寫文檔。
就這麼拖了將近兩個月。
驅動程式有三個實現版本:
其一是:drivers/char/micco_hsdetect.c
它通過kobject_uevent 上報狀態給使用者空間。
其二是:drivers/input/keyboard/micco_keys.c
它通過 input_report_switch上報事件給使用者空間。
其三是:drivers/switch/switch_micco.c
註冊了一個switch_dev,這個好像是android平台專用的。
參考自:http://blog.csdn.net/absurd/archive/2009/11/01/4754912.aspx
我是用第三種方法做的。
一、在littleton.c中註冊platform_device如下:
#ifdef CONFIG_SWITCH_GPIO
static struct gpio_switch_platform_data headset_switch_data = {
.name = "h2w",
.gpio = 127,
};
static struct platform_device headset_switch_device = {
.name = "switch-gpio",
.dev = {
.platform_data = &headset_switch_data,
}
};
#endif
littleton_init()中註冊platform_device ,包括增加的headset_switch_device。
其中gpio_switch_platform_data 的name可以隨意,但必須與上層的路徑相符,gpio號為耳機檢測的中斷GPIO,這裡的127是指PXA310的GPIO127。
platform_device 的name為/drivers/switch/switch_gpio.c中註冊的platform_driver的name。
static struct platform_driver gpio_switch_driver = {
.probe = gpio_switch_probe,
.remove = __devexit_p(gpio_switch_remove),
.driver = {
.name = "switch-gpio",
.owner = THIS_MODULE,
},
};
註冊成功後可以使用shell查看開發板中/sys/class/switch目錄下多了一個檔案夾h2w。
二、 switch_gpio.c上報訊息。
gpio_switch_probe申請中斷,在中斷處理gpio_irq_handler
()函數中採用schedule_work調用gpio_switch_work。在gpio_switch_work()中通過擷取中斷
GPIO(GPIO_127)的高低電平確定state,並將state通過switch_class.c的switch_set_state()函數上
報。(最好畫一下流程圖)
下載運行開發板,查看開發板中/sys/class/switch/h2w,可以看到包含name、state等內容(查看補充),在沒有插入耳機時cat state 結果為0,插入耳機後cat state 結果為1.
三、 上層HeadsetObserver.java修改(/frameworks/base/services/java/com/android/server)
上層HeadsetObserver.java通過底層上報的state決定如何?通道切換。
需修改如下:
//private static final String HEADSET_UEVENT_MATCH = "DEVPATH=/devices/virtual/switch/h2w";
private static final String HEADSET_UEVENT_MATCH = "DEVPATH=/class/switch/h2w";
參考資料 :http://groups.google
.com/group/a ... ad/41a261bc4498a7c4