發表文章

目前顯示的是 6月, 2009的文章

Android Mutlitouch Input Architecture

圖片
  現在的任務是要在Android 上面啟用 Mutlitouch的功能,首先找了一下網路上的做法,要改Synaptics的Driver,因為G1是使用Snaptics的觸控版,在別人patch過的很明顯可以看到Driver可以拿到兩個座標,可是Android所定義的 MotionEvent只能傳遞X, Y, Pressure, Size,Size的定義是觸控版手指頭上面壓下去之後的圈圈大小,這個值可能沒甚麼用,人家就拿來給Mutlitouch應用了。 先說明修改過之後 User看到的是甚麼,如果收到的Size <=1 的話,那麼就是代表是 Single Touch,否則 X, Y 就是兩個點的中心點,Size的左 16 bit 則是 abs(x1-x2), 右 16 bit則是 abs(y1-y2),這樣在User Level就可以得到旋轉跟放大縮小。 目前只有iPhone的SDK是可以直接把點座標全部傳給User Level去,這樣如果要作多人遊戲的話,才可以使用座標,特地看了一下Windows 7 的SDK,看起來在 .Net 新增的 NameSpace: Windows7.Mutlitouch 也是沒有傳遞多點座標,只有Rotate 跟 Zoom 的事件,我沒有實際寫程式試試,可能有辦法取得座標也不一定。 透過Synaptics 的source 發現他是使用 input_report_abs(ts->input_dev, ABS_X, x); 來傳遞值的,所以就找ABS_X是在哪裡定義的,在linux/include/linux/input.h 下面有定所有輸入的值為何,可以看到絕對值系列還有一個ABS_RX,原本是給搖桿用的,但透過這個值,我們應該可以傳遞兩個座標了。 Driver回報上去之後,User Level要怎麼接收呢?我以為是某一個類似scanf的函式,找到就OK了,freedom問file descriptor 是甚麼?我才想到把file operations串起來的就是要透過file descriptor,試了一下G1,發現他的TouchPanel 是 /dev/input/event2,所以我就在Android Source裡面搜尋 /dev/input,發現了 EventHub.cpp 這個檔案,在此檔案裡面搜尋

BeagleBoard OMAP3530 Linux SDIO Expansion Libertas Trace

  這兩個月的工作就是在讓BeagleBoard上面的Expansion Slot可以跑MMC的功能,然後讓SDIO WiFi可以Work。弄了很久,結果發現是硬體的功能好像有問題Orz。 Linux Kernel MMC/SD Source Trace 首先至少會有三個部分,Linux MMC Core (drivers/mmc/core)、MMC Controller 的Driver (drivers/mmc/host/omap_hsmmc.c)、SDIO Card的Driver (drivers/net/wireless/libertas)。 Core 中負責的是 MMC 的Protocol的部分,例如要送甚麼Command,怎麼Parse 卡片回來的Response之類的。這裡也是Bus Driver的所在地,但我對Bus Driver沒有看很懂~ Hsmmc (high speed mmc)則是負責要怎麼送出資料(設定DMA之類的),所以會跟硬體有關。 Libertas則是負責跟SDIO無線網卡的溝通。 drivers/mmc/core/core.c 中的mmc_rescan會去掃描目前的卡片類型,下面是我查到的卡片類型會送出的命令序列,這裡有一份很好的參考文件,可以去找SDIO Simplified Specification Version 2.00.PDF。原本SDIO SPEC是要簽NDA的,但後來釋出簡化版的讓Linux可以將SDIO包到Kernel Source裡面,但有一些比較屬於硬體的Timing過程就沒有公布了~ MMC/SD/SDIO Command 詢問過程 SDIO: 0 8 5(SDIO_SEND_OP_COND) 5 3 7 52 52 52 SD: 0 8 5 55 41 0 8 55 41(SD_APP) 2(Send All CID) 上面都失敗之後就換MMC MMC: 1(MMC_SEND_OP_COND) 上面可以看到SDIO會回第一個5的CMD,而SD不會回應,所以就改為送出55,MMC則是都不回應,最後會回應CMD 1。 如果問到5有回應之後,就會交給 drivers/mmc/core/sdio.c的mmc_attach_sdio、drivers/mmc/core/sd.c的mmc_at

選擇下載 Android Source 的伺服器

  昨天下載 Android Source的時候,sync repo就一直出現 cannot fetch XXX,想說是伺服器不穩,後來用 while loop 下載一樣不行。 今天freedom就教了一下可能可以解決的辦法,使用 dig android.git.kernel.org,我是看到有三個ip,再試一下,看查詢結果有沒有變,如果只有這三台,接下來就使用repo sync,然後趕快用 netstat –n | grep 9418 (git 的 port),看哪一個IP比較穩,最後再寫到 /etc/hosts 裡面,讓repo只連到這台去抓。 照做之後,我又在home 目錄重新作一次,就可以下載了~