網頁

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 分配時間來執行.



沒有留言:

張貼留言

請提供您寶貴的意見