網頁

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} 才可以, 這部份沒有深入去探討, 有問題的時候, 可以試試看放在這個地方.