2010年4月28日 星期三
2010年4月27日 星期二
2010年4月26日 星期一
2010年4月23日 星期五
Android Device Driver and framework implementation
2. 抽象類別將所有複雜的溝通細節處理掉,使得ap的class撰寫變的單純許多。
3.母類別會有預設函數的實作,若子類別打算overrided該預設函數則當外部呼叫到該函數會優先呼叫子類別的實作的預設函數。
4. 在JMain類別中: Employee linda = new SalesSecretary("Linda Fan","Female")
5. EX3_01中的Person類別為一個抽象類別(Display()內容從缺),相較之下Employee為一個具體類別,可以用來new出新的物件。
6. 4月26日從高老師第一本書第3章開始學習,第3章的內容可以先保留到熟悉android程式設計架構後再來review。
7. public abstract class Shape implement IGraph{ ... } 代表什麼意義?
8. 4月27日由4.2節開始研讀。
9. OnClickListener listener = new OnClickListener() { public void onClick(){...}},為實作listener物件的OnClick 方法。
10. 4月28日由4.5節開始研讀。
11. 編譯kernel時,DMATEK LCD 480X272 FOR ET043002DH6 ---45pin/40pin 是否有差異?
12. Android系統燒寫過程: (1)燒寫u-boot (2)燒寫kernel (3)燒寫Android 檔案系統 (ramdisk-uboot.img、system.img、userdata.img)
13. 4月30日高老師的教材(Android編程36計)研讀先停在第四章。
14. android user space process 發現硬體not ready時,framework會去polling硬體,若硬體持續在not ready狀態下時,會將執行權交給其他的process,應此當實做不符合framework架構的process(使用blocking I/O)會讓framework狀況出現異常。
15. 每個AP均為一個物件對kernel而言為一個thread與一般standalone的AP為獨立的Process有所不同(猜測)。
16. 在android driver實作上,須減少使用system call而要多使用 sysfs 或 proc來存取driver (announces by Google)
17. 上層的java應用程式透過JNI與底層.so(c/c++ module)的sharelibrary做溝通。
18. 如何加入driver至android system(錄音檔1 45分)。
19. ../framework/base/core/java/ <= 對應上層java層(包含許多framework的類別),當內建的class無法存取硬體時,可以擴充framework加入新的class進來讓別人來繼承使用。
20. ../framework/basr/core/jni/ <= 對應底層HAL層。
21. HAL Stub的工作往上符合HAL介面,往下去做與driver的溝通工作(open、read、write...)。
22. AP無法直接與Stub溝通,而是需要透過虛擬機,虛擬機往下會接到.so程式庫 => 需要修改jni目錄下的程式碼使so檔能夠與Stub做溝通。
23. android framework把driver整合的非常好 (相對於Qt)。
24. android porting 並非像過去的linux方式,只單純修改kernel即可(因為沒有整合driver與kernel的framework所以只需整理好BSP即可)。
25. android framework整合了特定的driver,去做porting,就不單純只是把kernel與BSP修改好而已,需要再考慮框架本身。
26. Android framework須考量3個層面; (1)driver是否需要用到android features (2)架構端的移植(Dalvik虛擬機負責執行procedure call 1.5Ver之後開始支持x86、armv4、armv5+、mips、coretex) (3)建立產品分支,預設為generic(反映框架只能擴充而不要去修改)。
27. 3份checklist: (1)driver (2)DalvikVM (3)product branch。
28. Porting技術面: (1)API相容(新的API在舊的框架上run) (2)產品分支 (3)框架修改 (4)Kernel的設定。
29. kernel可以分為vanilla與non-vanilla 版本。
30. 鼓勵將自己的driver移出做成patch在整合進vanilla kernel不須浪費時間去mantain自己的kernel。
31. 在Android下ap可以決定哪些部份需要做省電 <= 透過wavelock 提供的API在應用層進行操作。
32. Google提供Binder driver來做IPC的工作。
33. 應用層呼叫getSystemService()來存取硬體,由框架去new一個Service物件(物件的生成由框架負責,減少Ap的大小 <=> Java SE)。
34. 當框架去new一個object時,VM會去產生一個process,例如: 想畫圖,VM會去生成一個Surface的Process去抓到framebuffer的driver,同時框架也會生成一個Surface物件。
35. android share memory並非在兩個process之間換資料,而是
36. Activity(相當於main為ap的進入點)負責畫UI與處理使用者的輸入。
37. android ap 會被包裝成apk檔,執行起來每個apk檔對應一個Process(不管有多個activity)而其中會有activity的thread與Surface的thread,因此交換資料是在同一個apk檔中。
38. logcat 是負責產生訊息給console的driver,SDK Tools adb也可以讀取console 訊息。
39. PMEM為存取硬體的萬用解決方案,可以不必撰寫複雜的driver,只需查詢該硬體的I/O Memory 交由PMEM將所有的I/O Memory mapping到user space,ap只需透過HAL Stub 來存取硬體。
40. 傳統的driver寫作由於沒有PMEM的支持,必須寫很多Memory存取的程式。
41. logger.c是將自己註冊給misc,但misc依然使用了register_chrdev(),logger是間接透過misc與系統做註冊。
42. misc裡面堆放雜項的driver,假若driver不屬於usb、i2c、pci..等既有的類別,將該driver放置於misc中。
43. 分層註冊的目的在於避免數以萬計不同類型的driver向系統註冊。
44. logger.c中的排成機制實作需多研讀其架構。
45. program counter有可能會落在user space 或 kernel space。
46. adb daemon會透過socket讀取logger.c傳送的訊息。
47. 研讀sysfs與linux 2.6 kernel & driver 的關係(平田豐 p.401)。
48. linux kernel 2.6 將ioctl分做 : (1). unlocked_ioctl (2).compat_ioctl。
49. 大部分的embedded system均無swap partition所以沒有swap out 的現象,可以直接存取記憶體位址。
50. sleep_on的作用: (1).把process放置waitqueue節點 (2)將節點放入waitqueue (3)修改process狀態 (4)呼叫排程器。
51. 當宣告wait queue 於私有資料結構時,實作read / write system call遇到blocking狀態時,需自行手動進行排程,而不能呼叫sleep_on()。
52. 先open()再fork()一個child process(),此時兩個process會共用一個struct file 所以必須留意可重複進入的問題,ex: logger.c :190行與209行。
53. logger.c中的mutex與pthread programing中的mutex為相同的東西。
54. 下午2的錄音倒數20分鐘須反覆聆聽以了解當使用者點選icon啟動應用程式,所伴隨框架內部的行為模式!
55. zygote啟動 -> 執行VM -> 註冊 jni Table ->使用者按下icon -> 框架啟動activity -> activity 呼叫getSystemService() 去new xxxManager -> Manager會去new Service -> Service透過jni介面去存取底層的so檔(driver) -> 完成硬體存取的準備工作!
2010年4月22日 星期四
2010年4月21日 星期三
以 GDB 重新學習 C 語言程式設計
2. 快快樂樂學GDB: http://jserv.sayya.org/debugger/
新公司服勤規定by Grace
2. 基本上有周休二日,但須配合客戶的需求,有可能會有周六加班的情況出現!
3. am:9:30超過即算遲到,需超時補回被扣掉的實際工作時數。
4. 11:40 至 12:40 算用餐時間,超過一樣會欠1hr個工時。
5. 視情況於pm:8:00之後在D棟會有免費餐點供應。
2010年4月20日 星期二
2010年4月19日 星期一
2010年4月18日 星期日
DMA-6410L開發平台練習
2. 長高科技教材目錄: http://www.dmatek.com.tw/tn/viewbook.asp?id=52
3. DNS 需設定成中華電信 168.95.1.1 而非202.x.x.x。
4. 編譯核心前須執行 su root
export PATH=$PATH:/root/4.3.1-eabi-armv6/usr/bin-ccaches
5. netcfg eth0 dhcp 必須要能執行,若無法執行,要重新啟動switch的dhcp功能。
6. mokoid_elcair-20100511.tar.bz2 檔案包解開後 make PRODUCT-dma6410xp-eng 可以順利編譯成功。
7. 開機進入u-boot後,如欲使用tftp寫入SDcard與NandFlash時,記得防火牆要先關閉,使用tftpd32時,無線網路可以同時打開。
8. 利用logcat utility 觀察LedTest的行為。
9.透過tcp-ip與target端進行adb 連線的方法與步驟: http://www.dmatek.com.cn/bbs/announce/announce.asp?BoardID=10&id=476 or
10. 使用sd-card開機時須小心插卡,以防止開機失敗(Console 訊息沒有出現)。
11. 須手動 mount SD-card : mount -t vfat /dev/block/mmcblk0p1 /sdcard
12. 遇到s3c-nand: ECC uncorrectable error detected問題: http://hi.baidu.com/leona_leon/blog/item/1031f174a1bf0c16b151b91f.html
13. driver porting for 6410L : http://anemospring.blogspot.com/2010/01/android-cupcakefbnanddm9000ae.html
14. Error generating final archive:Debug certificate expired on Issue: http://liaobingyun.blog.163.com/blog/static/1298121112010620143648/
15. 在6410平台加入alsa sound功能: http://c39600.pixnet.net/blog/post/31135908
16. Vitual Box 設定共享資料夾: http://blog.roodo.com/BlackBox.X/archives/12664165.html
17. 修改led.c 加入MKDEV() 的巨集,建立device node,解決目前底層沒反應的問題。
2010年4月17日 星期六
C and C++ Programing 英文教學網站
2. C Programing : http://www2.its.strath.ac.uk/courses/c/
3. C ++ Language Tutorial: http://www.cplusplus.com/doc/tutorial/
4. C++ Primer中文版: http://www.3dwoo.com/showBookDetail.asp?nb=25140
2010年4月13日 星期二
未來工作選擇項目
2. Linux嵌入式系統軟體工程師: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=6a524a2d4c3e475e393a426b4c6c3e67548784b2f3c7447292929292740592e2d008j97&intro=1&jobsource=checkc&page=1
3. 手機軟韌體研發: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=66784b755e74465e393a426b4c6c3e67548784b2f3c7447292929296c40592e2d008j54&intro=1&jobsource=checkc&page=1
4. SOC/IC 設計工程師: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=6472445c3738406958343d684256391a73a724527272727233f6a342260j52&intro=1&jobsource=checkc&page=1
5. 通訊軟韌體工程師: http://www.104.com.tw/jobbank/cust_job/job.cfm?j=544e46282f3c426b346c3f2344323a219503e472929292926415c362240j52&intro=1&jobsource=checkc&page=1
2010年4月12日 星期一
Linux IPC 程式設計
2. mesaage passing system可以分做:
(1). persistent asynchronous communication
(2). persistent synchroinous communication
(3). transient asyncronous communication
(4). transient synchronous communication
3. transient與 persistent 差別在傳送後的訊息是否保存到接收端接收到才清除為止;persistent 方式會保存資料直到接收端接收到資料為止,transistent則是發現當接收端無法接收資料,自動將資料清除掉。
synchronous communication 也稱做blocking communocation傳送端會等到確定接收端已接收到資料後才會往下執行接下來的task,相對地asynchronous communication則是傳接收端均不特別等待此筆資料的傳送,各自執行預定要執行的task。
4. UDP 通訊屬於 第 (3) 類的通訊方式,因此傳送端只管現在有資料要傳,但不管對方是否確實有收到。
5. 傳送端與接收端必須先建立一個Link,Link可以分做:
(1). direct與 indirect : direct link 必須指定傳送與接收者的名稱。 indirect link 則不須指定名稱,只需透過緩衝區 mailbox / port 來收送資料。
(2). unboundded-buffer 與 boundded-buffer : 緩衝區有無長度限制。
6. IPC 為行程間的通訊,Process依關係可以分為: related process (父母與子女)與 unrelated兩種。
7. Linux IPC技術有: shared memory、Pipes FIFO、sockets、mapped memory。
8. 參考shm_allocate.c 中的share memory實作: 依序4個步驟 allocate => attach => detach => deallocate。
9. ipcs指令可以追蹤目前的IPC狀態。
10. shm_read.c編譯執行後會出現Segmentation Fault狀況! (已解決: 須先執行 shm_allocate)
11. mapped memory 與 shared memory 類似,差別在於mapped mempry是使用share file來進行通訊。
12. mapped memory會將共享檔案所分配到的virtual address 分割為以page size為單位大小的空間,使檔案存取變為記憶體式的存取。
13. 完成mmap之後將原先開啟的fd關閉是由於我們已經可以在記憶體中直接操作檔案了。
14. mmap 中的參數 MAP_SHARED為設計IPC機制必須設定的參數。
15. 當程式呼叫到exit會自動作detach的動作。
16. shmdt()只是將virtual address 與 shared memory對應消除,但allocate出來的share memory扔然存在,需再呼叫shmctl()可以完全清掉share memory區段。
17. mmap_write.c編譯執行後會出現Segmentation Fault 的問題。
18. Pipes為一種單向的通訊方式,用於 (1)Process 產生的Thread間的溝通 (2)Parent 與 child Process的溝通。
19. fdopen()為GNU/Linux提供的function call。
20. pipe.c 中parent 與 child 的fd交換號碼之後會出現Segmentation Fault問題(或許pipe(fd)即將fd[0]初始化為寫入檔案描述子,fd[0]為讀取檔案描述子)。
21. Socket是Process間的雙向IPC通訊介面,又分為Internet Domain Sockets 與 UNIX Domain Sockets。
22. UNIX Domain Socket s又稱為local sockets 用於本地端的Process通訊使用。
23. Internet Domain Socket 則用來與遠端主機的process溝通。
24. 以FTP Server 的例子解釋Socket的使用方式: 在server端先啟動server程式,這個程式會等待並接收client 使用者的連線請求,這個等待的動作稱為Accept。而使用者端則須啟動client 程式做連線初始化與server端連線,此動作稱為connect,也可以說socket通訊機制為一個主從式架構的機制。
25. server.c 實驗卡在server ip addr的設定。
26. Practical TCP/IP Sockets in C : http://cs.baylor.edu/~donahoo/practical/CSockets/
27. server端的socket初始化:
28. 思考server端在執行到listen()時系統的行為狀態為何? 是在背後執行的狀態?
2010年4月11日 星期日
Linux Network Device Driver
2. network device 不一定等於網路卡裝置。
3. network subsystem提供TCP/IP Stack給device 使用。
4. TCP/IP 的實作分為4層: BSD Socket 、 inet Sockeet 、TCP、IP,凡透過這條路徑傳遞Data均符合network device的定義。
5. 奇怪的應用: lcd panel 改走tcp/ip傳輸,遠端主機將data丟至lcd panel所對應的ip addr就會在lcd panel上顯示圖片。
6. 學習如何使用API在User application來利用TCP/IP傳輸資料。
7. Socket Programing : http://cs.baylor.edu/~donahoo/practical/CSockets/
8. 2.4.14 kernel ::bonding.c 為一個頻寬合併的driver。
9. struct net_device中函數指標 hard_start_xmit(struct sk_buff *skb, struct netdevice* dev)
中變數skb 指向網路封包,dev指向device driver的net_device資料結構,當有資料傳送到這個裝置的ip addr或者是這個ip addr 有資料要送出去時,kernel會callback此函數指標所指的函數。
10. 函數指標 get_stats指向一個負責維護網路資訊的函數,driver的作者須自行維護,當有查詢命令過來kernel會callback此函數,將網路資訊(net_device_stat)return回去。
11. net_device結構中,name[IFNAMESIZ]存放的是裝置的名稱,啟動一個網路裝置: ifconfig lcd0 192.168.1.100 =>kernel會自動callback open 將裝置初始化。
12. 控制網路卡的driver為NIC。
13. 經由TCP/IP 做I/O是定義為由user space 到 kernel space,kernel space to hardware則未定義。
14. skbuff 指標指向網路封包資料的起始位址。
15. dev_queue_xmit 的實作在 /net/core/dev.c ,為上層為了傳送封包給下層時使用。
16. tx_timeout 的用途? 進行錯誤處理 <=講義(二)投影片p.80
17. 系統呼叫netif_stop_queue(),會將網路介面強制關閉,此外亦可使用tx_timeout來做關閉。
18. 被關閉後的網路介面需呼叫netif_wake_queue()來將介面重新啟動。
19. 接收封包分兩階段: (1). 從硬體拿/傳遞資料,depend on 硬體的實作是否有interrupt handler
ex: 按下按鈕之後啟動interrupt handler 將按鍵資料存入一個封包中,再將封包丟至IP層(上層),IP層會做處理,丟到User space process。 (2) 參考講義((二)投影片p.82
20. kernel目前約有110多個sub-system,目的只有處理I/O,觀察註冊含樹,fops...等等資訊來掌握sub-system架構也等同於掌握了kernel內部的架構。
21. IP層以下並沒有區分 TCP / UDP協定。
22. 在分層架構下,Driver 工程師並不需要了解tcp/ip的內部api實作,即可完成network device driver的撰寫。
2010年4月10日 星期六
選購公路車
2. 參考頁面: http://dejavugreen.pixnet.net/blog/post/29401622
3. CT盤換3盤的問題: http://www.mobile01.com/topicdetail.php?f=318&t=1227680&last=14666900
4. shamal(瞎貓) 與 跑零輪組差異: http://www.mobile01.com/topicdetail.php?f=316&t=1085814&p=1php?f=316&t=1085814&p=1
5. 組車預估花費: ULTEGRA 6700 =>NT23500
FULCRUN RACING 3 => NT20500
CERVELO 車架 =>NT44000
3T龍頭+手把帶+龍頭=>NT3000
Selle ITALIA =>NT3000
6. 2010SRAM FORCE v.s. ULTEGRA 6700 : http://www.mobile01.com/topicdetail.php?f=316&t=1322492&p=3
7. 網友推薦: 車架 => Cervelo S1
變速系統 => Ultegra 6700
輪組 => Shimano C50-TU
手把與龍頭 => 3T Team
坐墊 => Airone CX
輪胎 => Corsa EVO CZ 2
剎車皮 => Swiss stop
2010 Toupe Team
8. 2010 CERVELO S1: http://tw.myblog.yahoo.com/fee99leo/article?mid=1604&prev=1608&next=1597
撰寫c程式不發呆 & 每天10分鐘 掌握c++
1. 先將ch3 ~ ch5 的範例程式測試一遍
2. 初學者撰寫程式的步驟: (1)理解問題 (2)演算法設計 (3)解法推導與實作
3. 打字速度必須到達不影響邏輯表達的程度
4. cerr 為標準錯誤輸出流與cout是幾乎相同的function
5. 異常處理(Exception handle)使用try/catch 架構 在try中執行正常操作,在error中執行異常處理,只要try區塊中任一函數執行出現異常,即拋出異常(cin.exceptions(cin.failbit)),程式執行轉到catch區塊繼續。
6. #include
7. sscanf(const char * str , const char * format,...) ,其中format "%*s or %*d"為刻意忽略第一個字串中的某一段字串。
8. 使用 std::runtime_error 需#include stdexcept
9. C++例外處理類別: http://caterpillar.onlyfun.net/Gossip/CppGossip/StandardException.html
10. 優質代碼參考網站: http://www.happycodings.com/
11. fputs(str,stdout)與puts(str)均為寫入string 到 stdout,差別在於puts會自動加入換行字元。
12. 開啟一個檔案之後,若有意再進行寫入動作,標準實作必須呼叫fflush or fseek。
13. fgets(buffer,size,stream) 為從stream所指向的檔案流抓取size個字元到buffer。
14. heap 與 stack 的差異:(待整理)
15. 掌握c++ 的第13章 記憶體: heap 、 stack 、pointer,須反覆閱讀。
16. 使用enum 必須記得初始化enum結構變數,才不會出現g++編譯錯誤。
17. 掌握c++ 第15章 的範例無法編譯成功。
18. getter & setter函數的功能? getter()負責取得class的私有變數的值;setter()負責修改私有變數的值,但不返回該私有變數。
19. 掌握c++第19章的範例程式: anAccumulator 有實作default constructor 而 aController 則否。
20. Class由兩個部分組成,class的宣告在.h檔,class的實作在.cpp檔。
21. aRequest::anOperator aRequest::Operator(void) const <=表示Operator()為一個getter函數。
22. anAccumulator::Apply(const aRequest &theRequest)為一個setter函數。
23. anAccumulator::anAccumulator(void): myValue(0) <= 為實作一個default constructor。
24. aController::SelfTest()中為何TestAccumulator 物件可以有多個instance ?
25. ControllerModule.cpp中: while(Request.Operator() != aRequest::stop){ ... } 為何還要在呼叫Operator()一次?
26. 在UML類別圖中,不顯示每個Class的default
27. aRequest:aRequest (const anOperator theOperator, const float theOperand) 為建構子。
28. aRequest::aRequest(const aRequest &theRequest) 為複製建構子。
29. 第21章overloded運算子的單元須閱讀陳錦輝的補充單元說明。
30. 第22章介紹到繼承、virtual、多型等觀念需多次複習。
閱讀 Mobile Broadcasting with WiMAX: Principles, Techology, and Applications
目錄與內容簡介: http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=0240810406&sid=43774
1. 4月14日略讀完前3章,大致了解wimax的發展過程,與複習無線通訊的基礎架構。
2. 4月16完成前4章的略讀,了解802.16e的機制下,PHY與MAC層的觀念。
3. 4月22日讀到第5章,該章節介紹有關cell 的規劃,與MIMO技術的基本介紹,主要技術規格需求需視客戶所在地區的規範而定,ex: Frequency reuse factor per cluster、STBC MIMO、AAS MIMO....。
4. 4月23日讀到第7章,主要是介紹現在全球的wimax部屬狀況,包含早期的fixed wimax 與 近期的mobile wimax,另外我們所使用的通訊產品其中是包含了相當多的標準組織所制定的規範於其中,ex: ieee、etsi、3gpp、mpeg..。
5. 第8章描述一個wimax soc內部的方塊圖,須反覆閱讀。
6. 在Chipset硬體實現方面,OFDM 信號處理是直接使用SOC(合併多個硬體單元)/FPGA/DSP進行,但Samsung SPH M8000 內部是使用軟體實作搭配PXA272 520MHz CPU的方式來實作MAC protocol。
7. dbm與mw的對映: http://www.mobile01.com/topicdetail.php?f=110&t=42057

2010年4月9日 星期五
4/12 由講義(二) 8.3節開始研究BTTV應用與8.4節Linux Driver 的分層架構
2. vmalloc 使用到 kmalloc(GFP_KERNEL)
3. 多REVIEW 講義(二)P.161 圖8-2的Memory-mapped 概念圖
4. RAM與I/O MEM的差別在於RAM並不屬於reserved page
5. driver 中的fops->mmap 與 user space process 中的 mmap(GLIBC提供)所負責的工作有哪些 <= 參考講義(二)p.162
6. 講義(二)p.172中為何user space process 執行ioctl VIDEOCAPTURE是使用copy_from_user()?
7. BTTV driver 路徑: /drivers/media/video/bttv-driver.c , bttv.h
8. 將講義(二)p.174的driver架構圖整理起來
9. static struct vdeo_device *video_device[VIDEO_NUM_DEVICES] <=代表宣告video_device結構陣列。
10. v4l.c 在嵌入式原理與實務的第七章有介紹,為整合bttv driver的影像應用程式。
11. bttv-driver.c 中 會呼叫 videodev.c的video_register_device()將下層函數的功能註冊給上層函數。
12. v4l.c只與videodev.c做溝通,也就是說v4l.c下ioctl命令會透過videodev呼叫到bttv-driver.c所提供的命令功能。
2010年4月7日 星期三
USB driver 與 Network device driver 開發
2. USB 的驅動架構是採用封包方式,而不使用傳統的read/ write 方式,亦可自行新增fops,建構裝置檔將資料傳回給user space process。
3. OS底下的USB只進行一樣工作 => I/O 存取 (丟封包的方式)
4. Input device 為處理人為輸入的一個sub-system。
5. 配合與講義(二)的投影片P.68與後面第十章研讀usbmouse.c。
6. tty終端機應用的架構(由上到下): application -> tty -> input device subsystem -> user space standard input / output。
7. usb_device_id <= 建立一個table讓kernel知道這個driver所支援的硬體裝置。 8. 滑鼠移動 =>產生中斷由usb-core收到 => 傳送urb封包給device driver 的 callback function。
9. 滑鼠 <= interrupt transfers webCam <= isochronous transfers 10. 函數呼叫順序: usb_alloc_urb => usb_fill_[control bulk int]_urb => usb_free_urb
11. usb_fill_xxx_urb 系列函數中參數 usb_complete * complete 為一含數指標,該函數的工作在於讓driver可以知道剛才丟給裝置的urb封包已經被處理完成了(透過usb-core callback complete函數)。
12. 同上函數中,pipe參數的設定(transmit / receive)會決定complete 函數的實作方式。
13. 當complete function 被callback後,可以將transfer buffer 指標指向下一筆資料。
14. input device 也是一個subsystem ,負責接收人為輸入,當driver接收到資料欲傳送給user space process時,必須透過input device subsystem來丟。
15. 重要資料結構: usb_device、usb_driver、urb。
16. input device sub-system 中重要的資料結構: input_dev







