2012年12月9日

[Note] USB2.0 Transfer Architecture

今天整理了一個USB Transfer的架構圖~

Transfer Mode       Data Transaction                 Phase (Packet)
----------------------------------------------------------------
Control Transfer     Setup Stage                        Token   - PID/ADDRESS/ENDPORINT/CRC
(控制傳輸)            (設定階段)                             Data   - PID/DATA/CRC
                                                                            Handshake   - PID
                              --------------------------------------------
                              Data Stage                            Token
                              (資料階段)                             Data
                                                                            Handshake
                              --------------------------------------------
                              Status Stage                         Token
                              (狀態階段)                             Data
                                                                            Handshake
----------------------------------------------------------------
Bulk Transfer         IN/OUT                                Token
(大容量傳輸)       (One or More)                        Data
                                                                            Handshake
----------------------------------------------------------------
Interrupt Transfer   IN/OUT                                Token
(中斷傳輸)           (One or More)                        Data
                                                                            Handshake
----------------------------------------------------------------
Isochronous Transfer   IN/OUT                          Token
(等時傳輸)                 (One or More)                  Data
                                                                            Handshake
----------------------------------------------------------------

1. Control Transfer:

USB中最基本的傳輸單元是Packet,而一筆Transaction則由Token/Data/Handshake 3個packet所構成。 由下面這張Control Transfer的USB trace我們可以看見實際USB運作的情況~與上面的表格去做對應。


圖中Transfer#80為一個Control Transfer,可以進一步拆解成三個Transaction分別為Setup(#49046)/Data(#49048)/Status(#49382),而每一個Transaction又可以再進一步拆解成三個packet(Token/Data/Handshake)。




上圖是一個Token Packet,我們可以看到在一個Token Packet當中主要構成的元素有:
Packet Sync/ PID/ Address/ ENDP/ CRC這五種
1. Packet Sync - 一串K-Chirp,J-Chirp組成,同步封包使用
2. Packet ID - 用來告知Device這次傳送的packet的目的功能是甚麼,常用的有setup/in/out/ack/data0/data1/nack等
3. Address - Device的位置
4. ENDP - 在位置之外,更清楚的標明所要傳送或接收對應的endpoint編號
5. CRC - 錯誤檢查碼



上圖是一個Data Packet,Data Packet構成的元素與Token Packet大同小異,主要有:
Packet Sync/ PID/ Data0/ (Data1)/ CRC這幾種
1. Data0 - Control transfer中的Data phase傳送了8 Bytes的Data,可以分成五個欄位
 => bmRequestType (1 byte) : 命令式樣,資料方向與命令接收對象
           bit7 -> 資料方向。 OUT/沒有Data phase為0,IN為1
           bit6:5 -> 命令式樣。00:標準命令,01:USB device class command,10:廠商自訂命令
           bit4:0 -> 命令接收對象。00000:裝置,00001:機能介面,00010:Endpoint,00011:其他。
 => bmRequest (1 byte) : 命令碼
 => wValue (2 bytes) : 命令相依資訊
 => wIndex (2 bytes) : 命令相依資訊
 => wLength (2 bytes) : 資料階段傳送或者接收的位元數。IN的場合,指最大值


最後是Handshake Packet格式,顧名思義Handshake封包中會利用PID來表示傳送的狀況,
可能會有ACK/NAK/STALL/NYET/ERR等幾種不同的Handshake封包

2012年12月7日

[Note] Cortex-M3 NVIC interrupt priority 基本觀念


     當我們在使用STM32中的NVIC中斷時會發現,中斷的優先等級分成了preemption priority (可搶奪優先等級)與subpriority(副優先等級)兩種,當我們在設定每一個interrupt channel的時候都必須設定這兩組數值。
     到底這兩優先等級有甚麼不一樣:

1. Preemption Priority
    當中斷發生時,擁有較高Preemption priority的interrupt channel可以將較低preemptrion priority的interrupt chnannel打斷優先被處理。假如兩個interrupt channel擁有相同peemption priority,則不會發生中斷被打斷的情況發生,後到的interrupt event必須等到現有的中斷被處理完畢後才能被處理。
 
2. Subpriority 
     在兩個interrupt channel的preemption priority相同的前提下,如果兩個subpriority不同的interrupt event同時發生,則subpriority高的interrupt會先被處理,但是如果低優先等級的interrupt channel event 已經在執行,則不能被打斷,高subpriority的event必須等到現有的event被處理完才能被處理。

     
3. STM32中斷優先等級暫存器 (Interrupt Priority Registers)
  STM32每個Interrupt Channel都擁有屬於自己的interrupt priority register, STM32中每個priority register是4個bit(Cortex-M3中定義8-bits),這4-bits可以依據功能分成下面五組


NVIC_PriorityGroup_0 => 0 bits for pre-emption priority, 4 bits for subpriority  


NVIC_PriorityGroup_1 => 1 bits for pre-emption priority, 3 bits for subpriority  

NVIC_PriorityGroup_2 => 2 bits for pre-emption priority, 2 bits for subpriority  

NVIC_PriorityGroup_3 => 3 bits for pre-emption priority, 1 bits for subpriority  

NVIC_PriorityGroup_4 => 4 bits for pre-emption priority, 0 bits for subpriority  


pre-emption priority與subpriority共用這4bits暫存器位置,因此如果設定成NVIC_PriorityGroup_0,暫存器的值將會被辨識為subpriority必須注意到一件事情,那就是假使priority設定值超過了所選定Group中分配給他的位數,將會導致不可預期的錯誤。



下面用一個範例來說明:

NVIC_InitTypeDef NVIC_InitStructure;
// 定義Priority Group
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

一開始先定義了Priority Group為NVIC_PriorityGroup_2,因此其中會有2bits是給preemption priority,2bits給subpriority使用因此不論是preemption priority或者subpriority的值範圍都在0~3(2bits可以表是的最大數值),另外假使一個interrupt channel的preempriton prirority與其他所有的interrupt channel都不一樣,則這個interrupt channel的subpriority可以設為任意值。

2011年12月1日

[Works][Tool] Genuine AVbody M650 BIOS Logo Change

First Software project I'm in charge.
The goal of this software is to change BIOS logo.
The way I use is that replace the ffs file in the BIOS via SMI function call.


2011年9月19日

[Works][APP]BLACKBOX 行車資訊紀錄APP介紹

        BLACKBOX是我試做的第一個Android平台的application,核心目標為簡單,可靠簡單就是使用者不需要去做複雜的設定,當程式被執行時便可以順利的開始使用,有別於一般行車紀錄器專注於影片的錄製,BLACKBOX除了整合了許多行車資訊 (EX.時速,位置,錄影,事故等等)以外,最重要的是具備了符合OpenGeo SMS規範的緊急求救簡訊功能。

當行車的過程中,不幸的發生了碰撞的事故,BLACKBOX可以偵測到並且將預先設定的求救簡訊內容發送給指定的聯絡人,達到求救的功能。收到簡訊的人可以藉此得知事故的地點並把握第一時間的救援時機點,例如當事故發生後駕駛者陷入昏迷的情況,更能彰顯此功能的重要性。


沒有複雜的設定以及功能,一切以簡單易用為目標,BLACKBOX的開發目標是提供一個如同飛機黑盒子般的行車資訊紀錄裝置,一上路只要將手機插上電源並且固定在車架上,可以讓你在開車的過程當中更多了一層保障,當開始錄影紀錄的過程中如果有來電,BLACKBOX可以退到背景去執行不會被中斷。

    BLACKBOX支援工研院所提出的OpenGEO SMS格式的簡訊架構,未來也許可以進一步發展成為一套緊急救援的軟體,透過緊急簡訊的發出,消防隊收到簡訊經過分析可以馬上得知事故的發生地點,省去經由第三人發現撥電話求援的時間,把握救援的黃金時期

目前軟體還在開發當中,只能利用工作之餘的時間去寫這個軟體(累阿!!),期望能夠早日順利寫完這個軟體,讓更多人能夠善用科技帶來的方便性,畢竟,擁有了一台全功能的智慧型手機,如果不能完全的發揮他的功能,是一件很可惜的事情!!



2011年9月1日

[Works][EE] Genuine AVbody M650

進公司後以HW Engineer身分參與的第一個案子,負責Daughter Boards Schematic Design.
這台AIO具有許多的特色:

=> Embracing Sound 認證,相較於一般的AIO擁有更好的音質
=> Proximity Sensor,可以利用手勢去觸發聲音亮度調整
=> Light Sensor,可以感應使用者是否離開電腦前面自動關閉螢幕,達到節能的效果