星期四, 10月 14, 2010

omap36xx的vibrator

我是沒看原來 android 釋出的原始碼,不過按照 TI 釋出的這份code,vibrator 主要是對 /sys/class/timed_output/vibrator/enable 寫入時間,寫入以後,就會開始震動。時間的單位是 ms。

但是 kernel 的 code 就沒有這部份的 driver,唯一會在 /sys 建出這檔案的 driver 是 vib-omap-pwm.c ,可是,這檔案裏面只有操作硬體 timer ,跟震動一點關係都沒有。後來是從 2.6.35 那邊拿原本是 input driver 的 twl4030-vibra.c 來改。

改的時候遇到一點小 trouble,最初的想法是用 timer 來做,但是 kernel 裡的 timer 是用 soft interrupt 完成的,所以在 timer 被觸發的時候,如果用 i2c 去寫的話,會導致 kernel panic (因為i2c 也會利用 soft interrupt 去等),這時候就得利用 workqueue,在 timer 觸發的時候,不要第1時間用 i2c 去寫,而是丟到 workqueue 裡,kernel 會儘快安排時間去執行這部份。

於是,這樣就搞出 vibrator driver 了。

沒有留言: