Category Archives: 工作

自製好用的linux 快速最愛目錄

在Windows 都會有一些可以快速切換目錄的軟體,但我在linux下都沒用過,雖然有pushd跟popd,但還是無法滿足我的需求。我希望像windows那樣可以按下某個快速鍵之後就切換到某個目錄去,其實主要原因是因為android build system路徑都很長~ 寫了下面的script,放到.bashrc or /etc/bash.bashrc,這樣就可以使用 cc 會顯示最愛目錄,cc 1直接切換到最愛目錄一,cca可以把目前目錄加到最愛目錄,ccr可以從最愛目錄中把目前目錄刪除。 pushd看自己要不要用,後來覺得會印出太多訊息就mark掉了,ccr因為我有設定  set -o noclobber,所以要使用>| 才能覆寫檔案~ export FavoriteDir=~/FavoriteDir function cchelp(){   echo cc number   echo cca — add PWD to favorite folder   echo ccr — remove PWD from favorite folder   echo ccs … Continue reading

Posted in 工作 | 1 Comment

make modpost – unrecognized command line option “-m”

我覺得這好像是BUG。 今天抓了2.6.18-8的kernel source要編譯 ralink的driver,到最後會說找不到modpost。所以自己再編modpost,找到的方式為 在 kernel source下面打 make scripts/mod/modpost然後就會看到標題的錯誤了~unrecognized command line option “-m” 網路上找了好久都沒找到解答,而且我之前在CROSS_COMPILE的時候好像也有遇過,超爛的問題,一度要放棄的時候,試試 make scripts,客,這時候說sumversion.c 沒有 define PATH_MAX,幫他定義一下,make,OK~ driver 也就可以順利編譯出來了~

Posted in 工作 | Leave a comment

bash shell pipe 的寫法

以前大多使用 | >,較少用到 < 現在看到文章才知道為甚麼以前試都不行ls | cat = cat <(ls) ls一定要加擴弧,且跟<之間不能有空白

Posted in 工作 | Leave a comment

Android Source 互相 sync

剛主管來問說我們central的android source是誰在維護的?我說沒有一個central repository,又不是SVN,為什麼需要Central的呢?剛測試一下,git這部分還滿方便的,先從android抓相同的source,接著修改完之後,使用git status, git commit把檔案commit到本地庫去。 如果我也需要對方的patch的話,就直接下 git pull username@ip:Path[mtube@mtube-acer] ~/mydroid_cupcake/frameworks/base$git pull USERNAME@IP:~/mydroid_cupcake/frameworks/base 但相反的,如果對方要直接push到我這邊來的話,他下的指令是沒有用的,可能要用其他方法吧~[mtube@mtube-acer] ~/mydroid_cupcake/frameworks/base$git push USERNAME@IP:~/mydroid_cupcake/frameworks/base

Posted in 工作 | Leave a comment

Ubuntu 使用 Bridge 模式, ExtractRootFSFromScratch Ubuntu, chroot

我需要一個Debian ARM (aurel) 版本的 RootFS,這樣就可以用他的裡面的工具程式,所以打算QEMU來安裝一下,於是從網路上下載了 kernel 跟 initrd,就準備使用qemu-system-arm 來安裝了,結果到了要從網路上下載套件來安裝的時候,一直無法抓到遠端套件,進shell看,以為是IP配措之類的,所以打算把Qemu設為 Bridge 模式,雖然我心裡覺得預設的NAT模式應該是可以的。 到 /etc/network/interfaces原本是auto eth0iface eth0 inet dhcp加上auto br0iface br0 inet dhcp   bridge_ports eth0   bridge_maxwait 0 存檔出來之後apt-get install bridge-utilsifdown eth0ifup br0這裡我就不太清楚為甚麼要使用 br0 取得IP 接下來建立 /etc/qemu-ifup #!/bin/sh echo "Executing /etc/qemu-ifup" echo "Bringing … Continue reading

Posted in 工作 | 1 Comment

Dll Injection 簡介

公司最近因為加上了網路控管,之前使用VPN的方式躲過,但實在是太慢了,所以又另找解法,經由強者者同事告知,原來只要製造出假Process就可以順利上網,但要創造出假的Process,我只有想到兩種方法,一種很簡單,一種很複雜,第一種就是你把隨便一隻程式改名,例如把notepad.exe,改為Orz.exe,這樣檢查程式就會以為Orz.exe已經再執行了,缺點是可能會耗一點GDI的資源,雖然執行起來之後就隱藏了,但完美主義的我總是覺得不夠漂亮。 第二種則是現在要講的稱為Dll Injection技術,先講一下用途為何,某支沒有Source的程式呼叫WindowsAPI的時候,你希望可以改寫WindowsAPI的行為,這就需要用到Dll Injection,技術上來說就是對方的程式會改為呼叫你寫的Code,至於要不要繼續呼叫WindowsAPI,就看你的Code怎麼寫。 像上面的需求,一般列出Windows,應該是用EnumWindow,所以我就需要寫一個EnumWindow的取代函式,讓其使用。但要修改這部分則沒有那麼簡單,因為OS有實做Virtual Memory的關係,每個Process都是各自的記憶體空間,所以對方的Process是無法呼叫到你的Process裡面的函式的。DLL在Windows是一個特例,因為DLL Code在記憶中是共用的,所以可以被其他Process映射過去執行。至於要怎麼映射,這裡則是我覺得學Windows API滿精彩的一部分~ 當年接了一個CASE,需求是當USB裝置插入的時候,程式可以得知,一直寫不出來,但手中有一個小程式可以做到這個功能,只是他會跳出MessengeBox來,所以我把小程式隱藏,然後攔截他呼叫的MessageBox函式,再通知我的程式,這樣就OK了~ 下面是我當年的筆記,其實重點就是要知道現在正在執行的Code是在哪一個空間執行,DLL裡面會實做下面幾個函式int __stdcall HOOK_MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption,UINT uType)這個是取代MessageBox的函式,也就是小程式會呼叫到這裡 int replace_IAT(const char *pDllName,const char *pApiName,bool bReplace)此函式執行的時候已經是在小程式空間裡了,用途是把原本WindowsAPI MessageBox的指標換為上面那個函式 LRESULT CALLBACK GetMsgProc(int,WPARAM, LPARAM);所有Window Message的Callback,給小程式使用。 extern "C" __declspec(dllexport) BOOL SetAPIHook(HWND hWndRetA,DWORD dThreadIdA )此函式是給我的程式呼叫的,呼叫之後就會想辦法讓上面那個函式在小程式的空間執行,至於怎麼辦到的,則是使用SetWindowHookEx,這個API就看下面的註解吧,反正他會把某視窗 … Continue reading

Posted in 工作 | Leave a comment

ddwrt的VPN設定

最近公司引進了網路存取管理,其實就是要抓盜版啦,如果不裝MIS的軟體掃描,就無法上網。因為我在宿舍也是用公司的AP,所以今天晚上就沒法連到外網了,突然靈機一動,連到辦公室的電腦,因為那邊有申請例外IP,所以可以透過RDP來上網,但這樣太痴了,我突然想到可以使用VPN,所以就ddwrt的設定打開了,成功上網~ 下面是網路上找到的教學,留存一份 我使用的版本為:DD-WRT v24-sp1 (07/27/08) vpn + PPTP(看起來比較方便) PPTP設定方式:點選Services頁面,再點選PPTP,預設是Disable,選擇Enable之後,會多出數個選項首先是server ip輸入wrt54gs的lan ip,一般應該是192.168.1.1client ip(s)設定欲分配給遠端登入電腦的ip,可以設定單一ip位址,或者輸入一個範圍如192.168.1.200-240。chap-secrets輸入登入用的帳號跟密碼,一行為一組。設定得格式為id * pw * (ex: jian * jian *)接著就是儲存設定,然後重新啟動wrt54gs。 Windows Client的設定在控制臺的網路連線,增加VPN網路連線連線的主機名稱設定為AP的WAN IP。 然後帳號密碼使用 jian 就可以登入了~ OpenVPN設定方式: 在windows下安裝OpenVPN 1.0.3(我使用的版本),準備開始製作static.key 1.cmd模式下鍵入 openvpn –genkey –secret static.key(注意每次鍵入所產生的key會不同喔!),會在目錄下出現一個static.key的檔案,檔案請好好保存。 2.登入AP,USER:root pass:admin防火牆設定在command防火牆內鍵入iptables -I INPUT 1 -p … Continue reading

Posted in 工作 | Leave a comment

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent (三)

最後就是模擬Key的部份了,其實比讀取還簡單,這都得歸功於Input Subsystem的設計,Service只要呼叫EventReader.SimulateKey(KeyboardFD, code); 這裡的KeyboardFD 就是/dev/input/eventX,而Code則是可以去看 KernelSource/include/linux/input.h 裡面有提到 Backspace = 14, 下面是c的code 1: JNIEXPORT jint JNICALL Java_ITRI_MTube_EventReader_SimulateKey(JNIEnv *env, jclass c, jstring KbdFD, jshort code) 2: { 3: struct input_event event; 4: int fd; 5: const jbyte *FD; 6: FD = (*env)->GetStringUTFChars(env, … Continue reading

Posted in 工作 | Leave a comment

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent (二)

所以我們的Native Code就是從/dev/input裡面讀資料了,這是有標準寫法的,可以去搜尋evtest,這也是一個好物~Driver回報的時候,最後會使用SYNC Flag,而User Level程式在讀的時候也是這樣子,當Android層的Service呼叫c的ReadPointer時,c會進入一個無窮迴圈直到他讀到sync,如果沒資料就會被block住(Good,不佔用cpu),如果讀到Sync之後,Service就再透過jni去讀取c剛剛從driver讀到的x,y,touch。原理就是這麼簡單,下面是Code,MT的部份是為了支援Linux 2.6.30之後的Multitouch功能,目前用不到。 1: #include "ITRI_MTube_EventReader.h" 2: #define SYN_MT_REPORT 2 3:  4: #define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */ 5: #define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */ 6: #define ABS_MT_WIDTH_MAJOR 0x32 /* … Continue reading

Posted in 工作 | 1 Comment

20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent (一)

  20090826 Android上使用觸控面板(TouchScreen)模擬KeyEvent 最近我們的機器上已經可以跑Android了,使用TI OMAP3530,這顆SOC不錯,網路上有許多人在幫忙porting Android到BeagleBoard上,所以使用人家的beagledroid git就可以了。但如果要使用expansion pin(ex: gpio、mmc、rs232 的bus)時,常常會發生電壓不夠,而需要另外接voltage/level translation,比較麻煩而已,因為TI不一定會想要賣給你幾顆Level Translation的IC,所以我們就必須用要Sample的方式來取得。我們的觸控面板使用dmc的晶片,分析Android Framework的Source Code之後,發現他是讀標準的input subsystem,所以driver要有註冊到input subsystem才行。我拿到兩種觸控板的Driver都沒有,一個是TSC的,一個就是DMC的。 要改Driver成Android可以使用也不是那麼麻煩,只要在probe裡面呼叫 input_register_device,然後再用set_bit、input_set_abs_params就好,這樣在/dev/input下面就會新增一個File Description了,但其實這個File Description是evdev.c弄出來的,evdev真是一個好物,關於Input Subsystem可以去google搜尋,有很多好的分析文章,而且看完之後大有收獲。當註冊完之後,接下來就是要回報了,什麼時候要回報,當然是我們從硬體拿到資料的時候,所以就是在irq函式裡面囉,於是把byte值轉為對應的座標,再使用input_report_XXX來回報至上層。 在修改這部份的時候,有想過校正的問題,這裡解釋一下校正的用意,一般來說觸控板原本的左上右下各會有一個座標,我拿到的dmc是(0,0)跟(2046,2046),但Android系統是(800,480),所以就需要加減乘除,當然如果觸控面板有瑕疵的話,左上也有可能不是(0,0),可能是負的,所以我們每次拿到一支新手機的時候,都要先做校正的動作。 第一版我是直接寫死在IRQ函式裡面,也就是固定左上右下座標,但這樣如果換了解析度就很麻煩,第二版使用module_param,想說可以在insmod的時候重新指定,結果發現如果編成module的話,再載入module之後,需要重新擦拔usb線,Driver才會probe到Device,而如果builtin到kernel裡面就不會有這個問題。我不知道這個問題怎麼發生的? 第三版就是要改為儲存校正的資料到檔案裡面去,然後driver載入時再去讀檔案裡面的座標。但我發現,在Driver裡面好像無法使用Open函式勒?!感覺open好像是給User Level的程式在用的,所以我又繞了一圈,先用一支User Program來讀取校正的檔案,然後再透過ioctl將值回傳給Driver。到這邊,觸控面板(TouchScreen)的使用應該是ok了。 只剩下在拖拉的時候,不知道為什麼座標好像會抖動,例如我在拉出Menu的選單,手在拖曳的時候,選單都會不定時向右邊跳一下,一開始以為是重複回報座標的問題,後來濾掉重複的座標還是會有,目前無解。 ===================================================================== 接下來就是手機都需要的按鍵部份,應該沒有手機可以完全沒有實體按鍵的吧,這部份因為我們的ID(Industry Design)沒有留按鍵的地方,所以這個重責大任就要交給觸控面板(TouchScreen)了,為什麼是重責大任呢?不然你點進去某個程式之後,沒有Back和Home鍵,你就再也出不來了。剛好,我們的觸控面板比顯示面板大一點,所以下面還有一小塊區域是Android處理不到的。所以想法就是Android的解析度為800×480,可是我在Driver層把它轉為800×600,那如果使用者按到480以上的區域就代表是Back鍵。這裡我需要的是有一個Service可以攔到所有的Pointer座標,然後再向系統送出一個Back鍵的訊息,為什麼要用Service,是因為要能夠在背景執行,否則現在在使用Browser,就抓不到座標值了。很遺憾的,這兩個功能我都做不到,第一個是有看到某支程式可以讓使用者自定Gesture來執行程式,所以應該是有這個功能的,但我不會寫,第二個則是Android禁止的,某支應用程式不能對其他應用程式送出Key,這個動作的學名叫做InjectKey。 所以要怎麼辦呢?只好透過jni, http://davanum.wordpress.com/2007/12/09/android-invoke-jni-based-methods-bridging-cc-and-java/ 為了避免文章消失,我還是做一下備份好了,重點是在第五步。 Step #1: Compile the project using ant. … Continue reading

Posted in 工作 | Leave a comment