Beruflich Dokumente
Kultur Dokumente
題目 : USB 驅動程式
指導老師
李志賢 組長
黃馨瑧 老師
孫文駿 老師
潘世恆 老師
組員名單
組長 : 96951130 張銘峻
組員 : 96951127 葉明華
96951131 王品哲
96951132 吳維文
96951135 劉宗漢
緣起
USB 技術發起於 1995 ,用於整合大多數裝置的連接
問題
物理構成:裝置插入 USB 插槽
Device
USB 驅動程式的定位
USER
USB Core
USB 主控器
硬體
基本流程
主機 實體裝置
應用軟體 功能 功能層
邏輯通訊流
實際通訊流
USB 各邏輯單位間之關係
模式通常包含一或多個介面 (interfaces) 。
介面通常具有一或多組設定值 (settings) 。
裝置
配置 配置 配置
介面 介面 介面
端點 端點 端點 端點 端點 端點
軟體需求
Linux kernel 2.6
ELAN WICE
硬體需求
Host : PC
D+ D-
電源線 地線
USB 接頭與纜線
USB 的電源管理
供電方式:
Root port hubs
Bus–powered hub
Self-powered hubs
訊號處理
差動分析:
差動 1: (D+) - (D-) >200mV 且 (D+)
> Vih
差動 0: (D-) - (D+) >200mV 且 (D-)
>Vih
編碼方式 :NRZI(Non Return to Zero
Invert)
USB- 通信協定
USB 的通訊協定基本單位 , 是最下層的資料欄
由數個不同的資料欄形成一個封包
由各種不同的封包 , 組成一個資料交易
由一個或一串序列交易 , 構成傳輸
料交易
通信協定 - 資料欄位的格式
SYNC DATA
PID CRC
ADDR
ENDP
FRAME Number
通信協定 - 資料欄位的格式
同步欄位 (SYNC): 所有封包的開端 , 由 8bit 組成 , 固
定為 00000001
封包辨識元欄位 (PID) :接在同步欄位之後 , 辨識此為
何種封包 , 由 8bit 組成。其中有 4bit 的辨識元 , 和互
為補數的檢查欄
位址欄位 (ADDR) :由 7 個 bit 組成 , 扣除位址 00h
是預備裝置 , 最多可有 127 個裝置
端點欄位 (ENDP): 由 4 個 bit 組成 , 可有 16 個端點做
定址 , 所有 Device 都需要支援端點 0 為控制端點
通信協定 - 資料欄位的格式
訊框號碼欄位 (FRAME NUMBER) :主機以一個
基數遞加 , 直到 7FFH 為止。存於訊框開始的時候
SOF 封包
資料欄位 (DATA) :存於 DATA 封包中 , 在不同的
傳輸形態 , 有不同大小 , 從 0 到 1023 個 byte, 且
為低位元優先 (LBS)
循環重覆核對欄位 (CRC) :用於保護標籤封包合
資料封包的所有非 PID 欄位之資料。而資料封包使
用 CRC16 ,其餘皆是 CRC5
通信協定 - 封包格式
Token
SOF
DATA
Handshake
Spcial
通信協定 - 封包格式
標籤封包 : 用於執行通訊協定之前的前導
動作
其中之 PID 封包可分成 :
IN 、 OUT 、 SETUP 來決定此交易是何
種
通信協定 - 封包格式
SOF 封包 : 屬於標籤封包之一種, PID
獨立出來。目標裝置利用 SOF 來辨別訊
框起點 ( 但是此封包不支援低速 )
SYNC PID Farme numer CRC
資料封包 :PID 分為 DATA0 和 DATA1,
利用彼此交換確保資料傳輸與裝置維持同
步
SYNC PID DATA CRC
通信協定 - 封包格式
交握封包 :PID 裡含有
ACK 、 NAK 、 STALL 。目的在於回報
交易狀態 , 包含資料接收成功、命令認 `
可或駁回 , 流程控制或暫停
SYNC PID
設定式交易 (Setup transaction)
寫入式交易 (In transaction)
讀出式交易 (Out transaction)
通訊協定 - 資料傳輸
SETUP
標籤
控制型傳輸交易:
DATA0
資料
ACK
交握
閒置
主機 裝置
通訊協定 - 資料傳輸
巨量型傳輸交易
IN OUT
標籤
資料 閒置
主機 裝置 閒置
通訊協定 - 資料交易
中斷型傳輸交易:
IN OUT
標籤
資料
主機 裝置 閒置
通訊協定 - 資料交易
等時型傳輸交易
IN OUT
標籤
DATA0 DATA0 資料
閒置
主機 裝置
USB 匯流排列舉
裝置插入
通電狀態
預設狀態
位址狀態
結構確定狀態
( 休眠狀態 )
Client 端
56 instructions
Example Study
EM78M611_USB
Analysis of the code (1)
( Registers setup →(1)JMP INITIAL
→(2)WAIT_USB_IN → (3)USB_MODE
→(4)CALL TRIM_PAGE0 →
(5)USB_INITIAL → (6)MAIN_LOOP
Running WICE
W-ICE 操作流程 (1)
點選“ WICE” 程式
W-ICE 操作流程 (2)
W-ICE 操作流程 (3)
W-ICE 操作流程 (4)
W-ICE 操作流程 (5)
W-ICE 操作流程 (6)
W-ICE 操作流程 (7)
W-ICE 操作流程 (8)
W-ICE 操作流程 (9)
W-ICE 操作流程 (10)
W-ICE 操作流程 (11)
W-ICE 操作流程 (12)
USB-Host 端 (1)
裝置
配置 配置 配置
介面 介面 介面
端點 端點 端點 端點 端點 端點
USB Core : Analysis
/drivers/usb/core/usb.c
This file controls the resources and
manages the whole operation.
/drivers/usb/core/hub.c
This file acts like a gate keeper.
/drivers/usb/core/hcd.c
This file talks to controllers.
USB Core : usb.c
Include “usb.h”,”hub.h”
,<linux/usb.h>
struct usb_device
Analysis of Files (1)
__find_interface()
usb_release_dev() : release it
workqueue
ksuspend_usb_cleanup():
usb_alloc_dev()
USB-Core : devio.c
free_asybc()
async_newpending()
async_removepending()
*async_getpending()
snoop_urb()
async_completed()
destory_asnyc()
USB-Core : devio.c
destory_all_async()
driver_probe()
driver_disconnect()
claimintf()
releaseintf()
findintfep()
USB-Core : devio.c
check_ctrlrecip()
__match_minor()
*usbdev_lookup_by_minor()
file operations
usb_open()
usbdev_release()
proc_control()
proc_bulk()
proc_resetup()
proc_getdriver()
file operations
proc_setconfig()
proc_setinft()
proc_do_submit()
proc_submit()
proc_umlinkurb()
processcompl()
file operations
proc_reaprub()
proc_reapirbnonblock()
proc_disconectsignal()
proc_climitinterface()
realseinterface()
proc_ioctl()
file operations
proc_ioctl_defualt()
usbdev_ioctl()
usbdev_poll()
usb_devio_init()
cleanup()
USB-Endpoint.c
show_ep_wMaxPacketSize()
show_ep_type()
show_ep_interval()
show_ep_direction()
usb_endpoint_major_init()
usb_endpoint_major_clean()
USB-Core : Endpoint.c
endpoint_free_minor()
init_endpoint_class()
release_endpoint_class()
destory_endpoint_class()
usb_create_ep_files()
usb_remore_ep_file()
USB-Core : buffer.c
hcd_buffer_create()
hcd_buffer_destroy()
hcd_buffer_alloc
hcd_buffer_free()
Host Controller Driver
/drivers/usb/host/uhci-debug.c
This is for debugging efforts.
謝謝各位