1、觸控式無線通訊裝置,組 員98951043 陳嘉弘98951044 游亞琦98951045 蘇 瀚98951038 詹秉茂98951053 江瑞華,第 四 組,指導老師 李 志 賢 黃 馨 瑧 陶 世 軒,一、功 能 與 構 想,1.1 動機與目標,如能透過無線網路通訊,可以達到有效節費 的目的。 透過無線網路傳輸可達成傳統手機所無法達成 的功能。,使用電信公司所提供的通訊服務現實的問題:通話成本,1.2 背景研究,Skype採用P2P 架構,優點在於直接連線,不需 經過伺服器中介處理通話資料,營運成本大幅降低,網路電話吸引人的特色:與IP網路結合 後的行動性,語音IP化的時代即將全面來臨,1
2、.3 功能描述,利用可觸控液晶螢幕進行操作機器功能 圖片、相片瀏覽網路電話、即時通訊音樂播放文章瀏覽影片觀賞錄音小遊戲,二、 系 統 軟 硬 體 架 構,2.1 硬體規格,ARM9 DMA-2440 開發平台,2.2 硬體建置狀態圖,2.3 軟體平台架設與設定,Linux核心之作業系統ubuntu 8.10版 Qt 介面設計主選單,三、 觸 控 面 板 相 關 研 究,3.1 觸控面板USB相關部分研究,端點 (Endpoint),控制 (CONTROL) 岔斷 (INTERRUPT) 整批 (BULK) 平穩 (ISOCHRONOUS),核心是以struct usb_host_endpoin
3、t來描述USB端點 不過關於端點的實際資訊是存放於另一個結構: struct usb_endpoint_descriptor,2. 介面 (Interfaces),介面是USB端點的組合,Linux核心以struct usb_interface結構來 描述USB介面,struct usb_host_interface *altsetting unsigned num_altsetting struct usb_host_interface *cur_altsetting,3. 模式 (Configuration),USB介面的運作狀態構成所謂的模式,4. USB urb,位於Linux核心裡的
4、USB程式,都是透過一種稱為urb的結構來與USB裝置互動,Urb的產生與摧毀 : usb_alloc_urb( ) usb_free_urb( ) 提交Urb : usb_submit_urb( ) 完工函式 撤銷urb : usb_kill_urb( ) usb_unlink_urb( ),5. 註冊USB驅動程式,任何USB驅動程式都必須產生的主要結構是struct usb_driver,static struct usb_driver skel_driver = .owner = THIS_MODULE, .name = “skeleton”, .id_table = skel_tab
5、le, .probe = skel_probe, .disconnect = skel_disconnect ;,usb_register_driver( ) usb_deregister( ),6. probe 與 disconnect,安插新的USB裝置,USB core會將該裝置的 資訊傳給每一個已註冊的驅動程式的probe作 業方法,當USB core認為驅動程式已不再需要控制 其目標裝置時,呼叫disconnect讓驅動程 式可執行清理動作,struct usb_interface usb_get_interface( ),User,Hardware,kernel,觸控面板軟體架構,
6、3.2 觸控面板驅動程式架構 (Part 1),1. 註冊USB驅動程式,Touch_init,Interface,USB core,Touch_driver,Touch_fops,usb_register,2. urb的提交與控制,Touch_init,Interface,USB core,usb_register,Touch_driver,Touch_fops,probe,urb,usb_get_interface,usb_submit_urb,3. 寫入、讀出資料,Touch_init,Interface,USB core,usb_register,Touch_driver,Touch_
7、fops,urb,touch,buffer,User,readData,4. 卸載USB驅動程式,Touch_exit,Interface,USB core,usb_deregister,Touch_driver,Touch_fops,urb,將driver insert入module的訊息,將driver登記至USB core,觸控面板insert入module的訊息,拔除觸控面板後的訊息,3.2 觸控面板驅動程式架構 (Part 2),1. 註冊USB驅動程式,Touch_init,Interface,USB core,Touch_driver,usb_register,載入ti503.k
8、o,會立即執行usb_mouse_init利用usb_register(,驅動程式分析 : ti503.c,2. urb的提交與控制,Touch_init,Interface,USB core,usb_register,Touch_driver,probe,urb,usb_get_interface,usb_submit_urb,input_dev,進入 usb_mouse_probeendpoint = &interface-endpoint0.desc 獲取硬體的端點資訊pipe = usb_rcvintpipe(dev,endpoint-bEndpointAddress) 配置中斷接收p
9、ipemaxp = usb_maxpacket(dev,pipe,usb_pipeout(pipe) 返回對應端點能夠傳輸的最大packet數,4 bytes mouse = kzalloc(sizeof(struct usb_mouse),GFP_KERNEL) 配置放置資料所需空間,驅動程式分析 : ti503.c,usb_mouse_probe (續)input_dev = input_allocate_device() 配置這個input device的記憶體空間mouse-data = usb_buffer_alloc(dev,5,GFP_ATOMIC,&mouse-data_dma
10、) 申請用於傳輸資料的空間mouse-irq = usb_alloc_urb(0,GFP_KERNEL) 建立一個urb usb_to_input_id(dev,&input_dev-id) 為此一usb input device製作一個struct input_id,驅動程式分析 : ti503.c,usb_mouse_probe(續)input_dev-evbit0=BIT_MASK(EV_KEY)|BIT_MASK(EV_REL)input_dev-keybitBIT_WORD(BTN_MOUSE)=BIT_MASK(BTN_LEFT)|BIT_MASK(BTN_RIGTHT)|BIT_
11、MASK(BTN_MIDDLE)input_dev-relbit0 = BIT_MASK(REL_X)|BIT_MASK(REL_Y),驅動程式分析 : ti503.c,usb_mouse_probe(續)設置input系統的資料及函式:input_set-drvdata(input_dev,mouse)input_dev-open = usb_mouse_openinput_dev-close = usb_mouse_close,驅動程式分析 : ti503.c,usb_mouse_probe(續)usb_fill_int_urb(mouse-irq, dev, pipe,mouse-dat
12、a, 40, usb_mouse_irq, mouse,endpoint-bInterval),驅動程式分析 : ti503.c,初始化urb: mouse-irq : 要被初始化的urb的pointer mouse-data : 接收資料的buffer的pointer usb_mouse_irq : 完工函式,usb_mouse_open usb_submit_urb(mouse-irq,GFP_KERNEL) usb_mouse_close usb_kill_urb(mouse-irq),驅動程式分析 : ti503.c,3. 寫入、讀出資料,Touch_init,Interface,US
13、B core,usb_register,Touch_driver,urb,buffer,input_dev,irq,Inputsubsysytem,LeftRight,X, Y,完工函式,驅動程式分析 : ti503.c,usb_mouse_irq,接收中斷訊號 將data分析成我們需要的格式 存入緩衝區 使用input_report_key( )控制左右鍵動作 使用input_report_rel( )控制游標移動,4. 卸載USB驅動程式,Touch_exit,Interface,USB core,usb_deregister,Touch_driver,urb,input_dev,驅動程式
14、分析 : ti503.c,usb_mouse_exit,usb_deregister(&usb_mouse_driver),usb_mouse_dissconnect,usb_kill_urbinput_unregister_deviceusb_free_urbusb_buffer_freekfree,usb_mouse_close,usb_kill_urb,3.3 輸入子系統(input subsystem)分析,統一分散的驅動程式,包含多種輸入裝置 (鍵盤、滑鼠、觸控板) 提供一個功能(input report)用以處理應用程式的事件 擷取並簡化輸入驅動程式的共用部分,加強一致性,ti50
15、3使用了輸入子系統所提供的函式,定義於input.h input_report_key(struct input_dev *dev, unsigned int code, int value) input_event(dev,EV_KEY,code,!value); input_report_rel(struct input_dev *dev, unsigned int code, int value) input_event(dev,EV_REL,code,value); input_sync(struct input_dev *dev) input_event(dev,EV_SYN,SYN
16、_REPORT,0); ,ti503使用了輸入子系統所提供的函式,input_event 定義於 /driver/input/input.c void input_event(struct input_dev *dev,insigned int type, unsigned int code, int value) switch (type) case EV_KEY: change_bit(code,dev-key); case EV_REL: case EV_SYN: dev-sync = 1; ,3.4 觸控面板 系統實做,1. 開發觸控面板右鍵功能,範圍之外的再次點擊,長壓大約3秒以上,
17、二次點擊抓取困難 更改原始資料不便,自動開啟右鍵功能,由AP層克服,限制於同支AP才能運作 無法解決未來欲開發的模擬滑鼠所需的功能,開發右鍵功能,開 發 前,開 發 後,打開“ /dev/TI503-0 ”連接到觸控板的driver 使用迴圈,將觸控板資訊讀取出來,2. 使用getdata.c抓取觸控板資料,利用TSe.x1及TSe.x2 來判斷x座標利用TSe.x3及TSe.x4 來判斷y座標,read (TS,&TSe,sizeof(TS_EVENT) 0 TSe.touched =1 (TSe.s0 = 0xc8) | (TSe.s0 = 0x88) | (TSe.s0 = 0xc9),
18、3. 觸控面板校正程式,觸控板分別以12個bits紀錄X,Y座標,範圍04096,一般電腦的解析度為1024*768,ARM板的解析度為480*272,校正目的,利用校正程式將讀到的座標轉換成符合 PC或ARM板的座標,假設PC解析度為1024 * 768,#define TX 1024#define TY 768,抓取第一個點(左上角)當基準 (0 , 0),if (count1 = 0) x0=TSe.x; y0=TSe.y; ,讀到筆尖離開便去抓第二點,if (TSe.s0 = 0x88) break; count1+ ;,抓取第二個點(右下角)當基準 (4096 , 4096),if
19、(count2 = 0) x1=TSe.x; y1=TSe.y; ,讀到筆尖離開,將資料進行轉換,if (TSe.s0 = 0x88) break; count2+ ;,將兩點做線性轉換,得到校正後的座標,xc = (float)(TSe.x-x0) / (float)(x1-x0) * (float)TX;yc = (float)(TSe.y-x0) / (float)(y1-y0) * (float)TY;,超過範圍的座標直接歸0或取最大值,if (xc TX) xc = TX; If (yc TY) yc = 0;,4. 使用buffer,動機,解決方法,存取完整的中斷資料 游標移動不順
20、暢,使用指標 writeP, startP, endP記錄目前資料位置 配置一個陣列,startP記錄陣首位置、endP記錄陣尾位置 由writeP記錄當前資料位置,隨著每一筆資料進來往下移動 只有當data0是0xc8, 0xc9, 0x88時才會進入迴圈,5. 記錄data進入irq的次數,動機,解決方法,第一次點擊觸控板時,游標直接移至(0, 0) 因為記錄座標的陣列初始為0 相對座標是由新進座標減掉前一個座標,設全域變數count = 0 當data0 = 0xc8時,便將count+1 當data0 = 0x88時,將count歸0 限制只有當count 為 0或1時,才會回報座標,
21、6. 使用j1、j2,動機,解決方法,因在觸控板上連點時極難點在相同點上,想要連 點進去資料夾時無法成功,利用連點時,第二下點擊與第一下點擊的時間間隔極短抓取每次點擊(c8)的系統時間jiffies,先以j2接收,當偵 測到離開(88)時,將j2的資料傳給j1,以便以j1接收下次 的點擊時間 若j2-j1的時間小於80,判斷為連點,將相對座標rel_x、rel_y 設為0,7. 使用j3、j4,動機,解決方法,因當觸控板拖曳游標移動至目的地放開時,會有點擊 效果,導致若離開點為工具列時便會自動點擊進入,利用單點時,點擊和離開的時間間隔極短 將傳送左鍵點擊功能放在偵測到離開觸控板(88)時,並
22、在每次接收到點擊(c8)時以j3記錄系統時間jiffies,離開 時(88)以j4紀錄jiffies若j4-j3 再封裝進UDP消息段 - 再封裝在進IP資料包,4.1 RTP相關研究,RTP(Real-time Transport Protocol),不提供任何機制確保把資料及時遞送到接收端不擔保在遞送過程中不丟失資訊包或資訊包次序不被打亂,RTP 欄位格式,RTP 欄位說明,V:版本,代表RTP所使用的版本P:填充,該欄位設定為1時代表為此封包的尾端但填充資料不屬於所承載資料的一部分填充資料最後一個位元組記載全部有多少位元組的填充資料通常使用於加密演算法上X:擴充位元,表示在原有標頭欄位後
23、還有擴充的欄位,RTP 欄位說明,X(擴充位元)欄位格式:,RTP 欄位說明,CC:CSRC辨別碼欄位裡CSRC使用的數目M:標誌位元,用作重要事件如標記影像串流封包中框架(frame)的界限識別值PT:承載型態位元,用來辨識RTP所承載的格式以及其承載意義以聲音流而言,如果發送端在會話或者廣播的中途決定改變編碼方法,可透過這個欄位來通知接收端,RTP 欄位說明,序號欄位:當送出一筆RTP資料封包時,就會在該欄位數字加一可判定是否遺失封包,並嘗試恢復封包順序序號通常為隨機產生時間戳記:反映RTP資料資訊包中第一個位元組的採樣時刻(時間)接收端用來去除由網路引起的資訊包抖動為接收端播放提供同步功
24、能,RTP 欄位說明,SSRC:同步源識別字(Synchronization Source Identifier)標識RTP資訊包串流的起源SSRC在新的資訊包流開始時源端隨機分配的號碼當傳送端改變了傳輸位址,SSRC也必須同步更改CSRC數目:提供源(Contributing SouRCe)的簡稱在RTP標頭中紀錄與這個封包有關的SSRC資訊,這些SSRC合起來就叫做CSRC標示封包的承載是來自於哪些傳送端以音訊傳輸為例,所有傳送端的音訊封包其辨別碼會被加在這個欄位,以便區別封包的說話者,RTCP (Real-time Control Protocol),即時傳輸控制協議RTCP 負責傳送控
25、制訊息,RTP 負責傳送實際資料用來監視服務品質和傳送有關與會者的資訊,RTCP 的封包型態,RTCP_SR:RTP傳送者回報訊息RTCP_RR:RTP接收者回報訊息RTCP_SDES:來源描述的訊息RTCP_APP:應用程式特殊使用的訊息BYE:來源端用再見訊息,宣告自己即將離開會議,4.2 相關程式碼研究,擷取speak-freely 7.6a之GSM語音編碼壓縮程式碼部份OSS (Open Sound System)Linux 4.2版驅動程式GTKTerm ARM板終端機介面,安裝OSS驅動(如果系統未安裝)下載Linux 2.6版核心的RPM包輸入rpm ivh (該下載包名稱).r
26、pm檢查音量控制程式的麥克風音量等選項,main.c程式解說,main.c程式解說,main.c:初始化音訊裝置、初始化GSM壓縮與建立RTP通訊規則定義好數位音訊資料的數量與緩衝區大小,main.c程式解說,初始化RTP與RTCP等參數所需要的內容宣告,開啟音訊裝置、RTP與RTCP、初始化音訊裝置與GSM壓縮先對RTP封包以輪詢方式進行socket傳輸,main.c程式解說,進行封包檢查,看是否封包有效或是過期將RTP封包拆解取出GSM音框將GSM音解碼輸出至聲音驅動裝置若偵測到聲音裝置有資料反方向進行擷取、編碼與包裝RTP傳送再輸出至聲音驅動,main.c程式解說,main.c程式解說,
27、timertick():監控封包的流量與狀況,sound.c屬於在操作聲音裝置比較底層的功用,它決定音訊裝置採樣的位元數、頻率及通道數目,main.c程式解說,將main.c、sound.c、rtp.h、sp.h、gsm.h、libgsm.a等檔案分別編譯出servxx與clixx兩支程式分別在客戶端與伺服端執行之即可,main.c程式解說,main.c使用步驟,1、連結ARM板與PC端,共需要兩台ARM板2、使用觸控板操控滑鼠啟動GTKTerm功能3、使用GTKTerm登錄進ARM板4 、分別開啟clixx及servxx執行檔5、進行通話,4.2 無線通訊 系統實作,. Porting :
28、Kernel Cramfs AP. Result :建構出voip的環境,函式庫 & 套件的建立無線上網Client & Server,. Tool linux-2.6.14 busybox-1.13.2 arm-linux-uclibc cross-3.4.1 smdk-tools-v0.20 wireless_tools.29 speak_freely-7.6a,4.2 遭遇問題與其解決方法,(1) 映像檔過大solution ,編譯Kernel 時 , 關掉 Initial RAM filesystem and RAM disk (initramfs/initrd) support 另外
29、再燒Ramfs ,$/ mkfs.cramfs srcfile dest.cramfs 最後分別把Kernel & Ramfs 燒至正確位置,(2) Make Wireless Card Modulessolution ,修改Makefile CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc CPP=/usr/local/arm/3.4.1/bin/arm-linux-g+ LD=/usr/local/arm/3.4.1/bin/arm-linux-ld,Cross compile後,相依產生Module,(3) Cross Compile Instructi
30、on,ARM平台上未提供無線網路相關指令,solution ,wireless_tools.29, iwconfig : 無線網卡的啟用 iwlist : 無線區網的搜尋,(4) 相容性,solution ,Kernel 、 C Code 、 Make Drivers Compiler 的差異,版本不符 採用相同的compiler lib匱乏 從別的compiler拷貝,(5) Bind error,參考李俊傑老師的上課範例 分別建立RTP , RTCP 的連線solution 只要設定2個不同的PORT即可搞定,(6) sound_pcm_write_bits failed,當 ioctl
31、音訊裝置時 , 讀取失敗 solution 嘗試幾種常見的採樣格式試出16bit是最理想的狀態,(7) Segmentation fault,音訊裝置 GSM 編碼 RTP 封裝 solution 使用指標 , 並配置空間 適時切割資料處理量,(8) 待解決問題,目前在 RTP 傳送時 , 未能正確送至另一端 僅能聽見自己的聲音來回錄放音 solution 朝 RTP 封裝 , 去修正問題,五、 預 定 進 度 及 分 工,5.1 團隊分工規劃,研讀USB相關資訊,5.2 專案規劃進度一覽,10月,11月,12月,1月,研讀QT,主介面,觸控組,分析程式碼,Porting+整合,開發程式碼,聲
32、音存取,無線通訊,通訊組,5.3 實際進度與目標評估,最初目標,AP組: 利用RTP協定 , 讓兩台ARM進行語音傳輸 觸控組: 以觸控板取代滑鼠,成為PC上的一個輸入裝置 將驅動程式移植上開發板,取代原本的觸控螢幕,完成成果,AP 組: 2台ARM , 可利用無線網路連線 可在 ARM , 收放音 觸控組: 自製AP抓取觸控板資訊 初版校正程式完成 完成PC端驅動程式開發,可以模擬滑鼠功能,尚未完成之目標,AP 組: RTP 封包未正確收發 ARM對ARM之間的訊息傳輸 觸控組: 尚未移植上開發板 以絕對座標的方式註冊觸控面板 模擬滑鼠拖曳功能尚未完成,六、 安裝流程及使用說明,將觸控板接上
33、處理器後連結上電腦手動移除預設的觸控板驅動程式 (sudo) rmmod usbtouchscreen.ko載入驅動程式模組 (sudo) insmod ti503.ko,6.1 安裝流程,觸控組,無線通訊組,設 IP ifconfig eth0 up ifconfig eth0 xx netmask oo Driver insmod zd1211.ko (裝) rmmod zd1211.ko (缷),依照安裝流程將觸控板驅動程式(ti503.ko)載入 後,即可使用一般滑鼠功能。 輕點一下觸控板為點下滑鼠左鍵 長點於觸控板上為點下滑鼠右鍵 連點兩下觸控板為連點兩下滑鼠左鍵,6.1 說明手冊,
34、觸控組,無線通訊組,Server . /servxx Client $ . /clixx ,七、 參 考 資 料,Linux裝置驅動程式之開發詳解 宋寶華 編著 松崗出版Linux驅動程式 第三版 Jonathan Corbet, Alessandro Rubini, Greg Kroah-Hartman Linux驅動程式開發 陶世軒老師上課講義 Linux 驅動程式開發實戰 悅知文化,參考書籍,驅動程式及USB,ARM,嵌入式Linux系統開發 陳裕生老師上課講義 ARM9 S3C2440嵌入式系統實作(ADS應用實驗篇) 長高科技 編著 ARM9 S3C2440嵌入式系統實作 (LINU
35、X及MiniGUI上層應用實驗篇) 長高科技 編著 Embedded Linux 開發實務徹底研究 旗標出版社,參考網站,TOMOYO Linux http:/tomoyo.sourceforge.jp http:/www.usb.org/home http:/fred- http:/ http:/mirror.linux.org.au/linux-mandocs/2.6.12.6/struct_urb.html http:/zh.wikipedia.org/w/index.php?title=USB&variant=zh-hant http:/www.beyondlogic.org/usbnutshell/usb1.htm,linux輸入子系統(input subsystem),驅動程式及USB,http:/ http:/ http:/ http:/