CMSIS-DAP 6 USB -1 - USB core IRQ handler
收錄於 : 關於Ameba的一百篇
前篇 : CMSIS-DAP - 5 - USB - 前置準備
USB protocol 是走 polling , 這邊的 interrupt 指的是 CMSIS DAP 所用的 NXP LPC11Uxx ,
USB core 產生的 USB IRQ interrupt .
開始寫程式時, 我們可以參考 ARM mbed 設計的 Program Architecture 圖
也可以參考 NXP LPCWare 所定的 USB ROM stack
事實上, 在 ARM 所定的 CMSIS-Driver 也有一個 USB Device Driver 的寫法
架構也可以參考.
剛看了一下 mbed 程式 USB device, 真的有用 C++ 來寫 HAL .
目前還是先用 C code, 參考這程式改寫過來. 之後來重頭 porting CMSIS++.
程式放在 : github 的 cmsis-dap exam4 中
還在 porting 當中. baby steps to giant strides... Keep walking.
----
Implementation
1. NVIC
首先掛上 usb interrupt IRQ. 要改在 startup_LPC11xx.c,
雖然有 NVIC_SetVector
這是 CMSIS-Core 定義 NVIC (interrupt) 相關的 function APIs.
這樣就可以在 USB HAL 這層註冊即可. 但因為 目前沒設計 RAM vector table.
所以暫且先直接註冊在 一開始的 vector table, 用 NVIC_EnableIRQ 來做
2. USB init / usb interrupt handler
主體在 usbhal_lpc11u.c, 這個檔是和 LPC11Uxx 硬體相關的設定. LPC11Uxx 文件
一開始 usbhal_init 並不會產生 interrupt.
而是要到 usbhal_connect 所做的 LPC_USB->DEVCMDSTAT
把 DCON (bit16) 設起來後, 硬體才會開始動作, 產生相對應的 interrupt
3. 目前先做到 interrupt endpoint 0 要處理的一開始
但沒有 debug 訊息怎麼知道有沒有做到 interrupt handler ?
只好靠 LED 閃爍 方式來傳遞訊息.
dap_led_fast_blink()
下回繼續兜 USB descriptor
PS1: Virtualbox 的問題是 usb descriptor 還沒有時, 沒找到方法導進去...
PS2: 下回繼續放在 exam4 , git 工具可以知道修改的地方
---
Ref: http://blog.csdn.net/myarrow/article/details/8484113
Ref: http://www.beyondlogic.org/usbnutshell/usb3.shtml
Ref: http://wiki.csie.ncku.edu.tw/embedded/USB
一個 Transaction 由 Token / Data / Handshake 所組成:
Packet:
packet 是 USB 傳輸的基本單位.
看來這塊直接 USB HW 做掉了
(1) 起始為 SOF packet
結束 EOF 並不是 packet. 而是電平狀態. 此時不能傳 data
packet 傳輸中不能被切斷
( 一個 transaction 有好幾個 packet, 一個 transaction 也不能被打斷 )
(2) TOKEN packet
常用有
IN : data Device -> Host
OUT : data Host -> Device
SETUP : data Host -> Device
( 以 host 為視角 )
(3) Data packet
有 DATA0, DATA1, DATA2, 和 MDATA 幾種
(4) Handshake packet
常用有 ACK, NAK 和 STALL
ACK 表示正確收到. 所以 IN 的 ACK 是由 Host 發的
OUT, SETUP 的 ACK 是由 Device 發的
設備忙碌時, 回 NAK
設備出錯時, 回 STALL
Endpoint :
USB 的說法是以 Host 為主, 所以 OUT 就是 Host 到 Device, IN 就是 Device 到 Host.
一個 device 最多有 16 個 IN 和 16 個 OUT endpoint.
endpoint 0 是每個 USB device 都會有的. 主要為 規劃 與 控制 資料的傳輸
Neo 大大怎麼開始玩USB了,USB core 很複雜,尤其是host。
回覆刪除一起玩呀 :) Host - https://developer.mbed.org/handbook/USBHost
刪除等 Ameba 要接鍵盤, 就要做 USB host 的 HID 了...
刪除