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 都會有的. 主要為 規劃 與 控制 資料的傳輸






留言

  1. Neo 大大怎麼開始玩USB了,USB core 很複雜,尤其是host。

    回覆刪除
    回覆
    1. 一起玩呀 :) Host - https://developer.mbed.org/handbook/USBHost

      刪除
    2. 等 Ameba 要接鍵盤, 就要做 USB host 的 HID 了...

      刪除

張貼留言

熱門文章