網頁

2014年11月25日 星期二

[Tiva] Project Closing Note

 

做了快一年的案子, 終於要結束了. 比預估的時間多了 3 個月. 雖然不是很滿意, 不過還在控制範圍內. 在還沒有完全冷掉之前, 把一些心得和檢討記下來.

承接專案因由

這完全是偶然.

本來在目前的工作準備要離職, 和朋友一起做. 剛好公司也希望我離職 (沒有專案可以做了), 跟我說不調走就資遣. 當時想, 反正要走了, 就領一下資遣吧, 就同意了. 隔一天, 朋友那邊打電話來, 表示產品方向覺得不妥, 叫我先不要過去, 那就好吧, 先不要過去. 一回神, 想到接下來不就沒工作了嗎 ? 剛好有朋友的公司, 需要做一個專案, 但是擔心能力不夠, 所以就找我幫助. 當下就想, 至少有一點收入會進來, 工作再繼續找好了, 就先答應了.

接下來那個星期, 就開始瞭解這個案子的相關資料, 排定 schedule, 簽訂合約, 準備接這個案子.

一個星期過去之後, 公司又來通知說不資遣 (講白了就是不想花這筆錢), 要我自己離職. 真的滿討厭這種專搞檯面下小動作的行為. 那好吧, 把我調走, 我一面做案子, 一面找工作. 原先要一起做的朋友隔天又打電話來, 說有東西要做了, 要我趕快過去!! 是講好一起來亂的嗎 ?! 

結果就是我接了這個案子.

專案內容簡述

這個案子主要是 porting. 客戶有一個 TI Stellaris 已經完成的測試設備專案, 希望 porting 到 TI Tiva (新一代的處理器). 以下說明主要變更的部份

  • 配合硬體的 schedule, 先用 TM4C123 Launch Pad, 再用 TM4C129 Launch Pad, 再換成 實作的 TM4C129DNCPDT
  • Library 從 TI Stellaris 移轉到 TI Tiva
  • 開發環境從 IAR (付費, 而且很貴) 改到 Code Composer Studio ( TI 自己的, 免費用於 TI 的 solutiom)
  • 編譯程式從 IAR compiler 換成 CCS 的 GCC
  • 作業系統從 SafeRTOS 換成 FreeRTOS
  • Embedded Python 調試及修改
  • PC 端 Visual Studio 的 software 配合修改

 

執行中遇到的問題

以下記錄專案執行中, 遇到的問題點

規格定義不明確

只要是程式相關的專案, 大都會遇到這樣的問題. 不過這次遇到的問題不太一樣, 客戶這套系統是國外部門開發的, 移轉到國內來, 國內也沒有人在用. 只能看著 source code 推測. 雖然後來有提供一些設計文件, 不過已經消耗掉一些時間.

Secondary Boot Loader

這套系統需要能 udpate firmware, 因此需要有 secondary boot loader. 之所以稱為 secondary 是因為 IC 本身就有 boot loader, 可以載入 NAND 上面的程式碼. Seconday Boot Loader 就是被 IC 載入的部份. 它負責更新或是執行主要應用程式.

這本來不是太困難的事. 不過為了相容於原有系統, 所以必需在 build 好的映像檔中, 插入一段資料. Tiva 的映像檔的開頭, 固定是 { 堆疊指標 + 重置向量 + 其他中斷向量 }, 檔案最後, 原系統也另外加了 check sum. 在 IAR 中可以指定一個 structure 在 link 的時候, 固定的位置. 其實 CCS (Code Composer Studio) 也可以, 只是文件沒有說明這件事, 因為 CCS 用的 compiler/linker 是 GCC, 所以它在這部份沒有特別說明.

Release/Debug mode switch

這本來是很簡單的一件事. 不過因為實作了 Secondary Boot Loader, 應用程式的映像檔會有兩種. Release mode 的啟始位置不會是 0x00000000 (已經被 Secondary Boot Loader 佔用). 但是用 JTAG debug 的時候, 它的位置是 0x00000000. 在 CCS 的環境下, 它會使用到兩個 configure file. 這其實也還算簡單. 比較麻煩的是, 要如何在切換 debug/release mode 的時候, 自動去切換這兩個 configuration file. CCS 的 pre-build 可以接受的路徑格式是 Linux 風格, 無法存取到 local 的檔案. 最後只是很簡單的設定兩個批次檔來做切換. 不過還是覺得有點遺憾, 感覺滿蠢的.

C/C++ 混用

原系統的程式碼, 有很多 C/C++ 混用的情形. 在 IAR 的設定中, 是可以把 C/C++ 都當作 C++ 來使用. CCS 也是可以這樣做. 不過,有部份的編譯指引 (#pragma) 不能使用. 尤其是中斷向量必須宣告在 data section. C/C++ 的函式的 naming 是不一樣的,  所以常常發生 linker 找不到 object code 的問題, 有時候沒注意到, 繞了一大圈, 才發現又是一樣的問題.

Heap Configuration 

最麻煩的是 heap. 原系統裡面用到了很多 new 這個 operator, 不過我們的記憶體不是很大, 才 256 K, new 一個包含 7 KB 的 buffer 的 object, 就掛了, 而且很不容易查出來問題是什麼, 更不容易聯想到需要調整 heap 的 大小.

Task Stack

所有的 RTOS 都需要一些 stack 來支持不同 task (或是叫做 thread,…) 的切換. SafeRTOS 的 stack 是在建立的時候給定位址及大小. FreeRTOS 則是在 init 的時候, 先配置一大塊, 而後在 create task 的時候, 自行從這一塊中去分配.

USB Update

原本想要用 USB 的 DFU class 來做 firmware update. 不過因為有兩塊 firmware (Boot Loader/Application), DFU 沒有辦法很好的支援這個動作. 最後還是用一般的 Bulk Transfer. Boot Loader 只檢查需不需要 update Application. 如果需要就更新, 否則就執行 Application. Application 負責對應 PC, 接收 firmware image. 如果收到的是 Boot Loader, 就直接更新, 更新完系統 re-boot. 如果是 Application ( 自己是執行中的 image, 不能自己更新), 就先寫到 NAND 的後段, 並且留一個記號給 Boot Loader, 然後 re-boot, 讓 Boot Loader 去處理更新 Application 的動作.

在把 USB device 從 USB bus 上移除, re-boot 重新連線的時候也遇到過一些問題.

這部份 debug 比較困難. Boot Loader/Application 以及 PC 的軟體都需要同時運行. 而且也不能用 JTAG 進行 trace.

Python

Embedded Python 也是第一次遇到. 在 Embedded system 上內建一個 Python 來執行 PC 傳過來的 script, 這部份我是覺得很有趣. 而且在設備的實作,裝機,調整上, 應該是很有發展性. 不過在處理的時候(大多是在看文件找資料), 也是掉了不少頭髮.

結語

整體來說, 滿有挑戰性, 大致上設定的功能也都完成. 也相當疲倦, 不過總算是沒摔了招牌.

接下來, 要開始準備生涯的下一個階段了.

2014年11月18日 星期二

[Android Studio] New Project


Start Android Studio

執行 studio64.exe (studio.exe), 並選擇 “New Project”
image

Fill Project property

填寫 project 相關的資料.
image

Select Platform

image
image
Accept and Next …
image
下載 SDK
image

image
先選擇一個 Blank Activity:
image
Finish 之後, 出現 Gradle ….
不過, 我有遇到 Java 連線被防火牆擋住的狀況. 不確定是不是和這個有關. 同意之後, 它才開始跑了起來.
image
image
That’s it

[Android Studio] 安裝 Android Studio

 

Android Studio, 顧名思義就是開發 Android app 的 IDE (Integrated Developemnt Environment). 是 Google 所開發, 目前已經從 0.1 發展到 0.8. 原本我也是是用 Eclipse + ADT. 但是有一天, 不小心升級 SDK 到 23 之後, 就沒辦法使用. 雖然網路上可以找到很多如何避開這個問題的方法, 但是, Google 推出自己的 Android 開發平台看起來也是必然的. 那麼, 就趁這個機會來熟悉一下吧.

Download Android Studio

參考以下的 link, 下載適合自己的版本. 目前最新是 Beta v0.8.14. 也有 Windows 版本, Mac OS X 版本, Linux 版本.

https://developer.android.com/sdk/installing/studio.html

我下載了 Windows 的版本. android-studio-ide-135.1538390-windows.zip. 解壓縮至目前目錄, 出現 android-studio 目錄.

Android Studio 的執行版本

在解出來的目錄中, 的 bin 目錄下, 有 studio.exe 及 studio64.exe 這兩個是 32/64 的執行檔案.

Install Android Studio

在 android-studio\bin 下, 找到 studio.exe. 執行後出現這個錯誤. 我們需要 JAVA_HOME 這個環境變數.

image

Add JAVA_HOME variable

打開 Windows 的開始/電腦/系統內容/進階系統設定, 進階頁面的環境變數按紐, 如下圖.

image

image

 

image

* 這是一個雙重錯誤. 我應該要執行 studio64.exe (我的 Windows 7 是 64 位元版本). 但是我執行了 32 位元版本, 所以出現了錯誤的錯誤訊息. 正確的錯誤訊息應該是 64 bit-JDK.

總之, 新增環境變數之後, Android Studio 可以正常執行.

執行 Android Studio

執行 studio64.exe 之後, 出現 Android Studio 的歡迎畫面.

image

2014年9月14日 星期日

[EZ-USB FX3] Added descriptor in USB 2.0


在 USB descriptor 的規格中, 定義了從 device/configuration/interface/endpoint, 從上而下的樹狀結構. 一個 device 可以有數個 configurtion, 一個 configuration 可以有數個 interface, 一個 interface 可以有數個 endpoint, 可以很清楚的瞭解到 device 提供了那些互動的方式.
當功能和 interface 是 1:1 對應的時候, 這些看來都沒有問題.
image
然而, 如果一個 device 如果有一個功能, 用到不同的 interface, 這樣主機端就不能由原先 device 傳回來的 descriptor, 看出這兩個 interface 是屬於同一組 (也許驅動程式根本就是同一個).
image

Interface Association Descriptors

因此, 在 USB 2.0 的規格推出後, 又以 ECN (Engineering Change Note) 的形式, 提出一個新的 descriptor, 在 USB 3.0 這是規格的一部份. 這一個 descriptor 就是在描述 interface 彼此之間的關係.
Offset Field Size Value Description
0 bLength 1 Number Size of Descriptor in bytes 0x09
1 bDescriptorType 1 Constant Interface Association Descriptor 0x0B
2 bFirstInterface 1 Number Interface number of the first interface that is associated with this function  
3 bInterfaceCount 1 Number Number of contiguous interfaces that at associated with this function  
4 bFunctionClass 1 Class Class Code (assigned by USB-IF)  
5 bFunctionSubClass 1 SubClass Sub Class Code (asigned by USB-IF)
6 bFunctionProtocol 1 Protocol Protocol Code (assigned by USB-IF)
7 iFunction 1 Index Index of string descriptor describing this function

2014年9月12日 星期五

[EZ-USB FX3] USB 3.0 Additional Descriptors


SuperSpeed USB 3.0 增加兩個新的 descriptors, 用來儲存 technology 及 device function 的特定資訊.

Binary device Object Store (BOS)

BOS descriptor 作為一個或是更多的 device capability descriptor 的基礎的 descriptor, 提供特定的能力和技術的資訊.
所有的 SuperSpeed USB 3.0 設備都必需支援這一個 descriptor, 並且在 high speed 運行時, 支援 Link Power Management (LPM).
Offset Field Size Value Description
0 bLength 1 Number Size of Descriptor in bytes 0x05
1 bDescriptorType 1 Constant BOS Descriptor 0x0F
2 wTotalLength 2 Number The number of bytes in this descriptor and all of its subordinate descriptors include all sub desceiptors
4 bNumDeviceCaps 1 Number The number of device capability descriptors subordinate to this BOS descriptor.

Device Capability Descriptor

Device Capability Descriptor 描述各不同 Device 的 capability
Offset Field Size Value Description
0 bLength 1 Number Size of Descriptor in bytes
1 bDescriptorType 1 Constant DevCapability Descriptor 0x10
2 bDevCapabilityType 1 Number Device Capability Type
3 Capability-Dependent Var Variable Capability-specific data and format
 

Device Capability Types Codes


Capability Code Value Descriptor
Wireless_USB 01H Defines the set of Wireless USB-specific device level capabilities
USB 2.0 Extension 02H USB 2.0 Extension Descriptor
SUPERSPEED_USB 03H Defines the set of SuperSpeed USB specific device level capabilities
CONTAINER_ID 04H Defines the instance unique ID used to identify the instance across all operating modes
PLATFORM 05H Defines a device capability specific to a particular platform/operating system
POWER_DELIVERY_CAPABILITY 06H Defines the various PD Capabilities of this device
BATTERY_INFO_CAPABILITY 07H Provides information on each battery supported by the device
PD_CONSUMER_PORT_CAPABILITY 08H The consumer characteristics of a port on the device
PD_PROVIDER_PORT_CAPABILITY 09H The provider characteristics of a port on the device
SUPERSPEED_PLUS 0AH Defines the set of SuperSpeed Plus USB specific device level capabilities
PRECISION_TIME_MEASUREMENT 0BH Precision Time Measurement (PTM) Capability Descriptor
Wireless_USB_Ext 0CH Defines the set of Wireless USB 1.1-specific device level capabilities
Reserved 00H,
0DH~FFH
Reserved for future use

2014年9月11日 星期四

[EZ-USB FX3] Notes on USB 2.0 descriptors


USB 的 descriptor 是 host 識別 device 的資料. 當一個 USB 的設備插入 USB port 時, USB host 會主動詢問 USB 設備的相關資料, 以載入相對應的驅動程式, 以及供給電源等動作. USB 設備就是透過 USB descriptor 來傳達這些資訊.
USB descriptor 的結構如附圖. 由一個 Device Descriptor, 包含數個 Configuration Descriptor, 每一個 Configurtion Descriptor 又可以包含數個 Interface Descriptor, 每一個 Interface Descriptor 又可以包含數個 Endpoint Descriptor, 字串的部份則放在 String Descriptor 中.
image

Device Descriptor

USB device 只能有一個 device descriptor, 這個 descriptor 提供設備為主的資訊. 譬如說對應到 USB 的規格的版本, 設備供應商的代號, 產品代號, 等等.

Offset

Field

Size

Value

Description

Note

0

bLength

1

Number

size of the descriptor in bytes

0x12

1

bDescriptorType

1

Constant

DeviceDescriptor (0x01)

0x01

2

bcdUSB

2

BCD

USB Sepcification Number

USB 3.0 0x00, 0x03

USB 2.1 0x10, 0x02

4

bDeviceClass

1

Class

Class Code:
0x00: each interface specifies it’s own claas code
0xFF: the class code is vendor specified
Otherwise:
0xEF
Miscellaneous

5

bDeviceSubClass

1

SubClass

Assigned by USB ORG 0x02

6

bDeviceProtocol

1

Protocol

Assigned by USB ORG 0x01

7

bMaxPacketSize

1

Number

Maximum Packet Size for Endpoint 0 8/16/32/64

8

idVendor

2

ID

Assigned by USB ORG

10

idProduct

2

ID

Assigned by Manufacturer

12

bcdDevice

2

BCD

Device Release Number

14

iManufacturer

1

Index

Index of Manufacturer String Descriptor

15

iProduct

1

Index

Index of Product String Descriptor

16

iSerialNumber

1

Index

Index of Serial Number String Descriptor

17

bNumConfigurations

1

Integer

Number of Possible Configurations
Class/SubClass/Protocol 共同指定了 USB device 的類型. 譬如說, Class = 0xEF, SubClass = 0x02, Protocol = 0x01, 指定了這個 device 是一個 Miscelaneous device ( Class = 0xEF), SubClass = 0x02, Protocol = 0x01, 則說明這個 device 的 Class Code, 是由 Interface Association Descriptor 指定. 也就是需參照 Interface Descriptor.

Configuration Descriptor

Configuration Descriptor 指定裝置在這個 configuration 的狀態下的電力設定及所需要的電力供應. 通常一個設備只會用到一個 configuration, 但是如果設備可以支援自我供電以及 USB 供電兩種方式的時候, 可以有兩個以上的 configuration, 以供 host 選擇, 但是同一時間只能有一個作用中的 configurtion.
舉例來說, 可以有一個高功率需求的 bus 供電 configuration, 以及一個自我供電的 configuration. 如果 USB device 被插入一個有電源供應的系統, 驅動程式可以選擇 bus 供電. 如果是被插入沒有電源供給的系統 (以系統的電池供電), 則可以選擇設備自我供電.
Offset Field Size Value Description  
0 bLength 1 Number Size of Descriptor in bytes 0x09
1 bDescriptorType 1 Constant Configuration Descriptor 0x02
2 wTotalLength 2 Number Total Length of Data returned include all sub desceiptors
4 bNumInterfaces 1 Number Number of Interfaces number of interface in this configuration
5 bConfigurationValue 1 Number Value to use as an argument to select this configuration Configuration value to be selected
6 iConfiguration 1 Index Index of String Descriptor Describing this configuration  
7 bmAttributes 1 Bitmap D7: Bus Powered
D6: Self Powered
D5: Remote Wakeup
D4..D0 reserved (0)
 
8 bMaxPower 1 mA Maximum Power Consumption  

 

Interface Descriptor

interface descriptor 可以看成是一組 endpoints 所組成的功能群組, 以達成特定功能. 例如, 一個多功能事務機, 可以用一個 interface descriptor 來描述 fax 功能的 endpoints, 然後用另一個 interface descriptor 來描述 scanner, 再一個來描述 printer. 和 configuration descriptor 不同的是, interface descriptor 沒有在同一時間內只能有一個在運作中的限制. USB 設備可以有一個或更多的 interface 在運作中.
interface descriptors 有一個 bInterfaceNumber 的欄位, 用以指定這一個 interface. 另外, 還有一個 bAlternateSetting 欄位, 這可以讓 interface 達成動態變更的效果.
假設, 我們有一個設備, 它有兩個 interface, interface 1, interface 2. interface 1 的 bInterfaceNumber 設成 0, 表示它是第一個 interface descriptor, 並且 bAlternativeSetting 設成 0. interface 2 的 bInterfaceNumber 設成 1, 表示它是第二個 interface descriptor, 並且 bAlternativeSetting 設成 0. 當我們可以再加入一個 interface descriptor, 並且把 bInterfaceNumber 設成 1, 表示它也是第二個 interface descriptor, 但是這次把 bAlternativeSetting 設定為 1, 表示這一個 interface descriptor 是另一個 interface descriptor 的替代.
Offset Field Size Value Description  
0 bLength 1 Number Size of Descriptor in bytes 0x09
1 bDescriptorType 1 Constant Interface Descriptor 0x04
2 bInterefaceNumber 1 Number Number of Interface zero based interface descriptor
3 bAlternateSetting 1 Number Value used to select alternative setting 0: Not alternative
1: alternative
4 bNumEndpoints 1 Number Number of Endpoints used for this interface  
5 bInterfaceClass 1 Class Assigned by USB ORG  
6 bInterfaceSubClass 1 SubClass Assigned by USB ORG  
7 bInterfaceProtocol 1 Protocol Protocol Code  
8 iInterface 1 Index Index of String Descriptor  

 

Endpoint Descriptor

每一個 endpoint descriptor 都是用來指定傳輸的型態, 方向, 輪詢間隔, 最大的封包大小. Endpoint 0, 是預設的控制 endpoint, 只會是 control point, 所以不需要 descriptor.
Offset Field Size Value Description  
0 bLength 1 Number Size of Descriptor in bytes 0x07
1 bDescriptorType 1 Constant End Descriptor 0x05
2 bEndpointAddress 1 Endpoint Endpoint Address
0b..3b Endpoint NUmber
4b..6b Reserved ( Zero)
7b Direction
   0 : Out Endpoint
   1 : In Endpoint
zero based interface descriptor
3 bmAttributes 1 Bitmap Bits 0..1 Transfer Type
  00 = Control
  01 = Isochronous
  10 = Bulk
  11 = Interrupt
Bits 5..2 reserved if not Isochronous.
Bits 3..2 Synchronization type
  00 = No Synchronization
  01 = Asynchronous
  10 = Adaptive
  11 = Synchronous
Bits 5..4 Usage type
  00 = Data endpoint
  01 = Feedback endpoint
  10 = Implicit feedback Data endpoint
  11 = Reserved 
0: Not alternative
1: alternative
4 wMaxPacketSize 2 Number Maximum Packet Size .  
6 bInterval 1 Number Polling interval in frame count.
Bulk & Control Endpoint ignored.
Iso must equal 1
Interrupt 1..255
 

 

String Descriptor

string descriptor 提供可讀的資訊. 如果不提供這一個 string descriptor, string index 需要設成 0. string 以 Unicode 編碼, 並且提供多國語言的支援.
String Descriptor Zero, 是用來描述所支持的語言 :
Offset Field Size Value Description
0 bLength 1 Number Size of Descriptor in bytes
1 bDescriptorType 1 Constant String Descriptor 0x03
2 wLANGID[0] 2 Number Supported Language Code Zero ex
0x0409 (English, USA)

wLANGID[1] 2 Number Supported Language Code One ex
0x0C09 (English, Austria)
4 wLANGID[2] 2 Number Supported Language Code X ex
0x0407 (German – Standard)
String Descriptor 1~, 是放置 Unicode 字串的地方.
Offset Field Size Value Description
0 bLength 1 Number Size of Descriptor in bytes
1 bDescriptorType 1 Constant String Descriptor 0x03
2 bString n Unicode Supported Language Code Zero Unicode Encoded String

 

Device Qualifier

device_qualifier descriptor 描述關於高速設備在不同速度下的訊息改變. 例如, 如果設備正在 full-speed 下運作, device_qualifier 傳回它在 high-speed 下運作的資訊. 反之亦然.
Offset Field Size Value Description
0 bLength 1 Number Size of Descriptor in bytes
1 bDescriptorType 1 Constant Device Qualifier Type  
2 bcdUSB 2 BCD USB spec version number.  
4 bDeviceClass 1 Class Class Code
5 bDeviceSubClass 1 SubClass SubClass Code
6 bDeviceProtocol 1 Protocol Protocol Code
7 bMaxPacketSize0 1 Number Maximum packet size for other speed
8 bNumConfigurations 1 Number Number of Other-speed configurations
9 bReserved 1 Zero Reserved for future use, must be zero

2014年9月2日 星期二

[EZ-USB FX3] Debug with J-Link GDB


這邊主要是記錄在使用 J-Link debug 的時候, 需要進行的操作. 因為對每一個 project 都需要設定, 所以只好記錄起來.

Create Debug Configuration

1. 在左邊的 Project Explorer 中, 點選要 debug 的 project, 這個地方是 UartLpDmaMode
image
2. 在上面的 Run 選單中, 選擇 Debug Configurations
image
3. 在左邊的 configurations 中, 選擇 Zylin Embedded debug (Native)
image
4. 在 Zylin Embedded debug (Native) 上按右鍵, 選擇 new

image

 

Modify Debug Configuration

1. 選擇 Debugger 分頁, 把 Main 分頁的 GDB debugger 連結到 C:\Program Files (x86)\Cypress\EZ-USB FX3 SDK\1.3\ARM GCC\bin\arm-none-eabi-gdb.exe”
image

2. 選擇 Commands 分頁, 在 Initialize commands, 加入以下命令
set prompt (arm-gdb)
# This connects to a target via netsiliconLibRemote
# listening for commands on a TCP port on the local machine.
# 2331 if the Segger J-Link GDB Server is being used
# 3333 if OpenOCD is being used
# If OpenOCD is being used, the CPU should be halted
# using the "monitor halt" command.
# Uncomment the appropriate line below:
target remote localhost:2331
# target remote localhost:3333
# monitor halt
monitor speed 1000
monitor endian little
set endian little
monitor reset
# Set the processor to SVC mode
monitor reg cpsr =0xd3
# Disable all interrupts
monitor memU32 0xFFFFF014 =0xFFFFFFFF
# Enable the TCMs
monitor memU32 0x40000000 =0xE3A00015
monitor memU32 0x40000004 =0xEE090F31
monitor memU32 0x40000008 =0xE240024F
monitor memU32 0x4000000C =0xEE090F11
# Change the FX3 SYSCLK setting based on
# input clock frequency. Update with
# correct value from list below.
# Clock input is 19.2 MHz: Value = 0x00080015
# Clock input is 26.0 MHz: Value = 0x00080010
# Clock input is 38.4 MHz: Value = 0x00080115
# Clock input is 52.0 MHz: Value = 0x00080110
monitor memU32 0xE0052000 = 0x00080015
# Add a delay to let the clock stabilize.
monitor sleep 1000
set $pc =0x40000000
si
si
si
si
3. 選擇 Commands 分頁, 在 Run commands, 加入以下命令
load
按下 “Apply” 儲存設定.
image

Run GDB server

1. 啟動 GDB server.
在開始功能表中, 找到 SEGGER, 執行 SEGGER\J-Link V4.9X.x\J-Link GDB Server. 確認以下的設定. 沒有問題的話, 按下 OK 開始.
image
正常的話, 會顯示未連線.
image

Debug from Eclipse

在專案名稱上按右鍵, 選擇 Debug As\Debug Configurations. 確定在左邊的 debug configuration 選項中, 剛剛建立的 configuration 被選擇. 然後按下 debug.
image
出現切換到 debug view 的提示. Eclipse 的 source code view 及 debug view 是在歸屬在不同的視覺系統中. 所以進到 debug 時, 會切換到 debug view. 這只是提示. 按下 “Yes” 進入 debug view.
進入 debug 後, 系統會先停下來. 看起來會像是這個樣子.
image
按下工具列的 resume 按紐
image
程式會停在 main() 的第一行 , GDB server 也會顯示已連線
image

2014年8月20日 星期三

[EZ-USB FX3] Memory map


FX3 的 memory, 基本上可以分成三類, D-TCM/I-TCM/System memory. TCM 是 Tightly-coupled memory 的縮寫, 它是 low-latency memory, 可以提供快速的記憶體存取.

D-TCM

D-TCM 是資料 (data) 用的 TCM. FX3 有 8 K 的 D-TCM. SDK 預設把這一塊記憶體, 分配給系統的堆疊.
modes address size  
SYS MODE STACK 0x10000000-0x10000800 2 K  
ABT MODE STACK 0x10000800-0x10000900 256 B  
UND MODE STACK 0x10000900-0x10000A00 256 B  
FIQ MODE STACK 0x10000A00-0x10000C00 512 B  
IRQ MODE STACK 0x10000A00-0x10001000 1 K  
SVC MODE STACK 0x10000A00-0x10002000 4 K  

I-TCM

I-TCM 是 instruction TCM. FX3 有 16 K 的 I-TCM. SDK 預設把這一塊記憶體, SDK 主要分配給 Interrupt Handler, 以及 Exception Vector.
usage address size  
Execption  Vector 0x00000000-0x00000100 256 B Fixed
Interrupt Handler 0x00000100-0x00004000 16 K – 256 B  

System memory

不同的 FX3 型號, system memory 的 size 可能有所不同, 有 256K/512K 的差別. 以下以 512 K 作說明.
usage address size  
DMA descriptor 0x40000000-0x40003000 12 K Fixed
Code Area 0x40003000-0x40030000 180 K  
Data Area 0x40030000-0x40037000
0x40030000-0x40038000
28 K
32 K
(with Compiler Heap)
(without Compiler Heap)
Compiler Heap 0x40030000-0x40037000 4 K (if used)
RTOS Heap 0x40038000-0x40040000 32 K  
DMA Buffer Area 0x40040000-0x40080000 256 K  

 

2014年8月19日 星期二

[EZ-USB FX3] firmware framework –1 Initialization


以下說明 FX3 firmware application 的啟動過程.

Hardware reset

在系統重置, 或是上電時, 所有的處理器都會進入一個硬體重置的階段, 雖然硬體重置的動作/順序/需要時間各自有差異, 不過它的目的都是準備處理器, 以進行之後的運算任務. 粗略的來說, 它會有一些任務要執行.
  • register reset : 在電源開始供電之前, 處理器內部的暫存器, 它的內容都應該視為未知. 因此, 它需要一些時間讓它回到預設值.
  • peripheral reset : 處理器需要周邊的元件來進行處理. 譬如, 需要 RAM 來儲存資料, IO 和外界溝通或交換資料. 這些元件也需要進入工作狀態.
  • 載入初始的指令 : 處理器要執行指令, 第一個要執行的指令, 要放在指令暫存器的預設的位址. 也就是說, reset 後,  指令暫存器的內容會還原成預設值. 而這預設值就是第一個要執行的指令的位址.

Device configuration

FX3 在 CPU rest 之後, 第一個執行的指令是在內部的 boot-ROM, 它的位址是 0xFFFF0000. 也可以稱為第一 Boot Loader. 根據文件, 它執行以下動作:
  • 根據 PMODE pin 的設定, 判斷 firmware 的來源. FX3 可以支援 USB Boot/I2C boot/SPI Boot/GPIF Boot.
  • 從 firmware 的來源, download firmware 的映像到系統的記憶體.
  • 從 firmware entry location ( 0x40000000) 指向的地方開始執行
firmware entry location 的位址 ( 0x40000000) , 存放的是 firmware reset address. 也就是 firmware 第一個指令的位置. 通常是在 0x40003000, 也就是 CyU3PFirmwareEntry() 這個程序.
CyU3PFirmwareEntry() 在清除 BSS 段的資料後, 會呼叫 main() 這個 function. 這也是 firmware application 第一個會執行到的指令.  

Clock Setup

通常, 在 main() 中, 首先要設定 clock. 這會呼叫到 CyU3PDeviceInit ()
/* Initialize the device */
CyU3PSysClockConfig_t clockConfig;
clockConfig.setSysClk400  = CyTrue;
clockConfig.cpuClkDiv     = 2;
clockConfig.dmaClkDiv     = 2;
clockConfig.mmioClkDiv    = 2;
clockConfig.useStandbyClk = CyFalse;
clockConfig.clkSrc         = CY_U3P_SYS_CLK;
status = CyU3PDeviceInit (&clockConfig);

MMU and cache management

FX3 不支援 virtual memory. 實體記憶體是和虛擬記憶體是1對1的對應. 這需要設定 MMU. 另外, MMU 也用來 enable 系統的 cache. /* Initialize the caches. Enable both Instruction and Data caches. */
status = CyU3PDeviceCacheControl (CyTrue, CyTrue, CyTrue);
if (status != CY_U3P_SUCCESS)
{
    goto handle_fatal_error;
}


RTOS Kernel

當完成這前述的步驟後, 程式的執行權會交給 RTOS. 也就是透過呼叫 CyU3PKernelEntry (). RTOS 在完成 RTOS 自己的啟始動作後, 會再呼叫 CyFxApplicationDefine 這個 FX3 已經定義的 callback function, application 在這個地方定義自己的 thread, 由 RTOS 分配時間來執行.



2014年8月18日 星期一

[EZ-USB FX3] include/library path


FX3 SDK 預設的 IDE 是 Eclipse. 雖然 Eclipse 很常見, 但是因為它可以客製化, 有些細節的地方還是要摸索一下. 例如說, include 和 library 的路徑設定.

include path

在專案瀏覽畫面, 在要設定的專案名稱上按右鍵, 會跳出專案選單, 選擇最下面的 Properties, 打開專案屬性視窗.image
在以下的專案屬性視窗中, 依序進入 include 設定:
  1. 在左邊的選項中, 選擇 “C/C++ Build”, 以及其下的 “Settings”.
  2. 在中間的 Settings 窗格, 選擇 “Tool Settings” 分頁.
  3. 在“Tool Settings” 分頁中, 選擇 “ARM Sourcery Windows GCC Compiler”, 以及其下的 “Directories”
  4. 按右上角的加號, 加入新的 include path
image

library path

  1. 在左邊的選項中, 選擇 “C/C++ Build”, 以及其下的 “Settings”.
  2. 在中間的 Settings 窗格, 選擇 “Tool Settings” 分頁.
  3. 在“Tool Settings” 分頁中, 選擇 “ARM Sourcery Windows GCC Linker”, 以及其下的 “Miscellaneos”
  4. 在右邊的窗格, 捲到最下面, 可以看到 “Other flags”, 在這邊可以輸入要用到的 library 的路徑及檔名.
image

Notice :

Library 的設定, 似乎要在 ${FX3_INSTALL_PATH} 才可以, 這部份沒有深入去探討, 有問題的時候, 可以試試看放在這個地方.

2014年7月5日 星期六

[DirectShow] Install VS2010 + DirectShow on Windows 7

 

最近遇到工作上需要用到 DirectShow 來做 moive 的顯示, 但是在 setup 環境的時候, 遇到一些問題, 參考一些資料, 再加上自己 try and error 之後, 終於搞定了. 在這邊把過程記錄下來, 供自己及有需要的人參考.

DirectShow 原本叫做ActiveMovie, 做為 MicroSoft 對抗 QuickTime 的技術. 後來又改名為 DirectShow, 作為 DirectX 的一部份. 在一段時間之後, DirectShow 被移出 DirectX SDK, 而整合到 Window SDK 之中.

Windows SDK 則有另一段故事. Windows SDK 原本是 MicroSoft 對不同版本的作業系統所發布的 SDK, 以提供開發人員利用新的作業系統所提供的 API, 開發新的應用. 在 Windows 98 之後, 這個 SDK 改名為 Platform SDK, 在 Windows Vista 時改名為 Windows SDK.

安裝準備

由於工作需求, 安裝的環境是 Windows 7, VS 2010 + VS2010 SP1 + Windows SDK 7.1

由於之前安裝的 VS2005, VS2008, VS2012, Windows SDK 6.0/Windows SDK 7.0, 安裝過程中一再遇到問題, 後來決定整個移除掉. 但是 MicroSoft 並沒有很簡便可以移除這一堆東西的方法, 只能從控制台/程式集/程式和功能/解除安裝程式中, 有 2005/2008/2012/SDK 這些字樣的部份一個一個移除.

可以的話, 建議儘量用沒有安裝過 Visual Studio 和 SDK 的系統, 可以省不少不必要的麻煩.

安裝 Visual 2010

安裝 VS2010 其實很簡單, 一直按就可以了. 這邊的貼圖只是用來強調 MicroSoft 在安裝 Visual Studio 的時候, 附帶安裝了多少想都想不到的元件. 譬如說, VC 9.0 runtime.

01-setup

選擇 Full 安裝

02-setup

Visual Studio 安裝元件列表一

03-setup

Visual Studio 安裝元件列表二

04-setup

Visual Studio 安裝元件列表三

05-setup

有消息指出, 如果 Microsoft Visual C++ 2010 runtime 的版本高於 10.0.3019 需要移除 (如果已經安裝 SP1 的話, 有可能出現). 運氣很好, 剛好是一樣的, 所以不需移除.

06-vc-runtime

安裝 Windows SDK 7.1

Windows SDK 7.1 有兩種安裝方式,

1. web install, 在以下 link , 下載 winsdk_web.exe, 下載完直接安裝

http://www.microsoft.com/en-us/download/details.aspx?id=8279

2. iso install, 在以下 link, 下載 iso 檔安裝.

http://www.microsoft.com/en-us/download/details.aspx?id=8442

需要注意的是, 這裡有 3 個檔案,

GRMSDK_EN_DVD.iso 這是 for x86 的環境 ( 作業系統 Windows 的版本)
GRMSDKX_EN_DVD.iso 這是 for x64 的環境 ( 作業系統 Windows 的版本)
GRMSDKIAI_EN_DVD.iso 這是 for Intel Itanium ( IA-64) 的環境

07-sdk

安裝過程就只是比較久而已

08-sdk-license

09-sdk-selection

010-sdk-install

安裝 VS2010 SP1

執行 SP1 中的 setup.exe

11-vc2010-sp1

 

12-vc2010-sp1-setup

安裝 KB2519277

Windows SDK 7.1 適用的 Microsoft Visual C++ 2010 Service Pack 1 編譯器更新

http://www.microsoft.com/zh-tw/download/details.aspx?id=4422

到這邊, 安裝的部份已經完成. 接下來要修改 DirectShow 的建置環境

Build strmbasd.lib for DirectShow

打開 D:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\multimedia\directshow\baseclasses 的這個 project, 在 Property\Configuration Properties\General\Target name 改成 strmbasd.

strmbasd.lib 會是 DirectShow 大部份的應用會用到的 library.

13-dshow

14-dshow

這樣就完成了建置的工作.

2014年6月11日 星期三

[Visual Studio 2012] Common controls 不見了

 

用 MFC 來寫一些對話盒, 執行一些簡單的動作, 是很方便的事. MFC 提供的一些 common control, 讓這些動作變得更簡單. 如果 common control 不能使用, 那根本是全殘了. 不知道為什麼發生這種事, 不過如果遇到, 可以參考以下的解決辦法.

image

解決的辦法是刪除 C:\Documents and Settings\[username]\Local Settings\Application Data\Microsoft\VisualStudio\11.0, 裡面的 .tbd 檔案.

不過, 這個說來簡單, 但是做起來會有一些小麻煩.

1. 找不到 Documents and Settings 這個目錄. 在 Windows 中, 這個目錄預設是隱藏的. 在控制台中, 選擇 外觀及個人化, 裡面的資料夾選項 : 取消隱藏保護的作業系統檔案, 並勾選顯示隱藏的檔案, 資料夾及磁碟機. 這樣就可以在 Windows 安裝的磁碟, 看到 Documents and Settings 的目錄了.

image

 

2. 打不開 Documents and Settings 這個目錄.

image

在 Documents and Settings 這個目錄上按右鍵, 以啟動資料夾選項, 切換到安全性的分頁

image

按進階, 以進入進階設定

image

按變更權限, 以變更存取權限

image

選擇 “Everyone” , 也就是被拒絕的那一個, 並按下編輯,把原本拒絕那一欄打勾的列出資料夾/讀取資料

image

然後按很多次套用和確定, 回到資料夾. 在到達目標資料夾前, 還會遇到幾次的拒絕存取, 用同樣的方法過關. 最後終於到達目的地.

 image

殺掉 2 個 .tbd 檔案, 以及 2 個 .dat 檔案. 重新開啟 Visual 2012, common control 回來了.

image