2017年7月24日

[讀書心得][更快樂:哈佛最受歡迎的一堂課]


ch01 <快樂是甚麼>
=> 怎麼做才能更快樂, 快樂不是一個定點
=> 與其把訓練自律當作改變現狀的手段, 不如培養某些習慣, 建立習慣比維持習慣困難得多
=> 那些習慣的建立能夠讓你更快樂, 一次一個慢慢來, 循序漸進, 成功是逐步累積的結果
=> 每天寫下至少五件值得感謝的事情, 會讓自己比較快樂

ch02 <兼顧現在與未來>
=> 拼命三郎型 : 沒辦法享受目前的工作, 誤把解脫當作是快樂, 解脫應該是一種負面的快樂
                             就像是頭痛一樣, 停止頭痛後感到欣喜, 但是身體很快就適應了, 無法長久感受
                             到快樂的感覺
=> 享樂主義 : 以為享樂才是快樂的全部, 工作就是痛苦的, 缺乏長期目標和挑戰的人生是毫無
                         意義的, 如果我們一味追求享樂逃避痛苦便無法獲得快樂
=> 虛無主義 : 拼命三郎活只在意未來, 享樂主義只在乎眼前, 虛無主義只活在過去
                         懂得享受追求目標的過程, 才能長期保持快樂

2013年7月24日

[Works][FW][Tool] Toshiba/IBM TCxWave Self-service system


For this case, I'm in charge of two parts of this system, they are head I/O board and control panel board respectively :
1. Front Control Panel : In front of the system, there are two major functions on it, power button and brightness adjustment with capacitor sensor.
     a. Firmware Development
     b. Boot-loader Development
     c. Firmware update scheme designed
     c. Host side Firmware Update Utility Development
     d. Function Evaluation Utility Development
2. VFD/MSR board : This is a module with a LCD on it, and a track for swiping card
     a. Firmware Development
     b. Host side Evaluation Utility

2013年4月30日

[Note] Ping協定

大容量輸出(Bulk-out)與控制輸出(Control-out),適用於「Ping協定」。輸出的含意是指從主機端送往裝置端。

「Ping協定」的出發點就是防止長時間大量資料傳送完畢之際,對方竟然傳回NAK信號,要求重新送一次。如此的狀態就代表著介面被佔掉的時間,成為浪費,介面的使用效率不佳。因此,才會規範了這個協定,期待可以提升介面匯流排的使用效率。

他的機制是這樣子的:主機端在傳送64個位元組(如Control Out傳送)或是512位元組(如Bulk Out傳送)的資料到裝置端之前,先行由主機端送出「Ping封包」,觀察其回應是ACK還是NAK,用來確認裝置是否準備就緒。這個概念與網路上的Ping指令是一致的思維。

規格書中,為了詳細描繪「Ping協定」的動作,利用了狀態遷移圖的方式,對主機端的狀態遷移以及HS快速裝置的狀態遷移,有很清楚的交代。

以主機端狀態遷移圖為範例來說,當送出「Ping封包」之後,如果得到NAK的場合,表示裝置端沒有接收的空間,如果執意地將DATA0/1封包丟往裝置端,很有可能的結局就是依然得到NAK的否定確認回應。因此,圖4的主機端狀態遷移圖,顯示如果送出「Ping封包」之後,得到NAK的場合,並不會傳送「OUT封包」以及「DATA封包」,而是再度傳送「Ping封包」,重複確認。

這就是「Ping協定」的基本精神。

接著下來,利用一個具體的實際範例來闡明「Ping協定」動作的細節。

請留意,從主機端送往裝置端時,使用放大鏡來觀察其細部的話,其走過的足跡卻是,從主機端經過USB介面匯流排,到達快速裝置的控制器,再經過裝置內部的局部匯流排(Local Bus),就可以到達讓裝置動作的韌體。其關連性是相當廣泛的。

以大容量輸出傳送(Bulk Out)來說,USB 2.0的主機端(通常是個人電腦),通常是針對裝置端控制器內的特定端點,傳送512位元組的封包。而裝置端控制器的接收端點,一般是利用兩個512位元組的FIFO(FIFO是First In First Out的元件,通常,是作為緩衝的用途)。

當緩衝器接收完主機端送過來的資料之時,會告知裝置內部的韌體,接收封包已經備妥。如此一來內部的韌體就會藉由局部匯流排,實行將緩衝器的資料傳送到系統的記憶體之中。資料傳送完了之際,會通知控制器,那麼控制器就可以騰出緩衝器的空間來。基於這樣子的思考,HS快速裝置,如何來達到介面匯流排使用的最高效率,就是不產生NAK、NYET的情況下,「OUT封包」、「DATA 0/1封包」以及「ACK」的順序遞送。這樣子的時間,有機會是“9.5 us”的光景。

所以,對於一個工程人員來說,韌體撰寫的應答時間以及資料處理時間,該如何地最佳化,是HS快速裝置設計者,要好好下功夫的一道習題。也是重要的一個環節。

2013年4月1日

[Note] USB Device Enumeration Process


<Power Stage>
Device pull high to 3.3V
D+ : Full Speed (High Speed)
D- : Low Speed
Get Port Status Command to hub
Set Port Feature
Reset Device (Pull D+,D- low for 10ms)
Detect full/high speed use chirp J/K
Chirp J : D+
Chirp K : D-
High speed device send Chirp J, Host respond chirp JK to notice device ok.
<Default Stage>
Get Port Status – to see if reset complete
Get Descriptor (Device Type)
Reset
<Address Stage>
Set Address
Get Descriptor
(Device Type) 




2013年1月15日

[Study] Device State Diagram

It's good to understand the USB device life cycle when attached device to host system.




2012年12月27日

[Works][Tool] USB HID Device Enumeration Tool

In order to communicate with HID (Human Interface Device),
We may need some API to help us to call the driver and send and receive data to/from HID


Necessary head file and library file as follow:
1. hidsdi.h / hid.lib
2. hidpi.h
3. setupapi.h / setupapi.lib
4. hidusage.h

The HID enumerate flow with visual C++ as follow:
1. use HidD_GetHidGuid to fetch the GUID of HID
2. use SetupDiGetClassDevs to fetch the HDEVINFO that contain the device list of HID
3. use SetupDiEnumDeviceInterfaces to get the device interface data
4. use SetupDiGetDeviceInterfaceDetail to get the  SP_DEVICE_INTERFACE_DETAIL_DATA
5. Now we can use SP_DEVICE_INTERFACE_DETAIL_DATA to create file use CreateFile function and get a handle
6. Process step 3 - 5 repeatedly until the return value of SetupDiEnumDeviceInterfaces  is false with different  index

2012年12月19日

[Note] HID - Human Interface Device




HID - Human Interface Device
 1. Interrupt IN transfer is necessary in HID
 2. Input Report is also necessary, but Output and Feature Report is optional
 3. Feature reports always use control transfers and are optional
 4. If bInterfaceSubclass = 01h, the device supports a boot interface. A HID with boot interface can communicate with the host even when the host hasn't loaded its HID drivers.
     5. If there is no Report ID item, the report used the default ID of 00h

(Picture from USB bible "USB Complete")






2012年12月11日

[Works][FW] Vibration Sensor Use AVR ATmega

簡單的利用AVR上面的ADC功能,便可以做出一個具有震動偵測的系統~
當系統偵測到有震動反應時,LED燈便會點亮並維持200ms後熄滅~
我們所需要的是一個震動感應器,一顆AVR ATmega MCU,再加上電池及一顆LED燈~




我簡單畫了一個電路圖來說明~
當今天MEAS感應到震動,會造成正負兩支針腳有壓差出現~
方便起見我用正級接到AVR的PC4這隻PIN上~
利用AVR的ADC功能去偵測電位差的產生~
當產生電位差時~會發出中斷訊號進入ISR~
在ISR裡~我做了兩件事情~第一件事是去清除interrupt flag~
第二件事情是去設定PD6為low~此時LED就會亮起~
我再另外利用一個Timer去處理LED燈點亮的時間~
最後我只需要一顆電池~便能夠讓MCU以及LED有穩定的供電~

暫存器設置:
ADMUX = 0b11000101
ADCSRA = 0b10101100
ADCSRB = 0b00000000
DIDR0 = 0b00111111

Note:
1. 必須要在開始做conversion前先Enable ADC function, Set ADCSRA |= (1 << ADSC)
2. 在每次中斷時必須去清除Interrupt flag, Set ADCSRA |= (1 << ADIF),如果為Free run模式,即便沒有清除還是會繼續下一次的conversion。 
3. 要注意使用的single ended input不能有pull-up,否則都會detect到0x3FF(意即Vref)
4. 所偵測的電位必須介於GND ~ Vref之間


2012年12月10日

[Study] STM32 Clock Domain

整理了一張STM32 Clock Domain 圖,忽略掉了prescaler及其他元件更容易辨識~


2012年12月9日

[Note] USB firmware development note

1. Host 要求data前,要先將Data放入endpoint的buffer中,中斷發生是通知韌體可以繼續放入下一筆資料,如果認為在提供資料前等待中斷,也許中斷永遠都不會來臨
2. All Control Transfer must have SETUP/STATUS phase, but DATA phase is not necessary.
    The control transfer without DATA phase can be referred to as Control Write.
3. First data in data phase of control transfer is DATA1, the one in setup phase in DATA0
4. Interrupt Transfer中,資料請求必定為Host所送出
5. HUB上有pull-down電阻,Device上有pull-high電阻,Full Speed Device為D+, Low Speed Device在
    D-上,HUB利用D+/D-電壓來監控是否有Device插上,在Host Reset Command(Set Port Feature)
    後,Device會把Pull-up電阻移走,改接上終端電阻(利用Device FW去對USB_enable pin做控
    制,也必須有額外的硬體電路)
6. Control Transfer中如果命令不被裝置所接受,裝置會回應STALL來告知HOST。但是在SETUP
    階段裝置必須回應ACK,因此STALL是在Data或Status回應。盡可能在Data階段回應。
7. Normally a SOF packet (at full speed) or a Keep Alive signal (at low speed) is sent by the host every 1 ms, and this is what keeps the device awake.