NIOS II EPCQ FLASH啓動過程要點 NIOS II BOOT LOADER/COPIER

從EPCQ FLASH啓動nios,並自動運行應用程序(以hello_world爲例),按照bootloader(altera稱之爲boot copier)是否爲自定義的,分爲兩種方法:

一,bootloader不是自定義的,是通過nios SBT軟件自動生成的,該方法即 intel altera Embedded Design Handbook中5.2.3.4所述方法。 

二,由於需要在多個應用程序之間跳轉,或者在多個應用程序之間選擇某一個鏡像啓動,因此修改bootloader的.c文件,自定義boot loader,並指定多個應用程序鏡像地址。該方法可在Embedded Design Handbook 5.3章節基礎上修改而來。

NIOS II啓動流程

上電後,硬件sof首先完成配置,將NIOS軟核CPU及其外設,還有邏輯設計IP等硬件電路在FPGA內配置完畢。隨後,跳轉到QSYS搭建過程中爲CPU指定的reset地址,執行該地址內的代碼。該地址通常存放着bootloader文件,格式爲hex。方法一中,該地址在QSYS中設置爲epcq controller (此處存疑,bootloader是存放在epcq flash中,還是存放在epcq controller ip 核的片上ROM中,看文檔似乎是在flash中,那片上ROM的作用是什麼?)。方法二中,該地址被設置爲onchip ram1(QSYS系統中添加了2個on chip ram組件)。執行bootloader時,根據bootloader的設計,bootloader程序到指定的flash地址去拷貝應用程序的鏡像,到onchip ram2,然後跳轉到onchipram2執行應用程序代碼。至於拷貝多少?拷貝到何處?應用程序的頭若干字節存放了這兩個信息。

方法一介紹(該方法尚未實驗)

1.QSYS搭建系統時,cpu reset地址指向epcq controller。上電完成sof硬件配置後,系統跳轉至epcq flash的0X1E00000地址,執行bootloader,該bootloader到緊隨其後的某flash地址,複製應用程序鏡像,到onchipram的系統地址。是否要複製到onchipram,onchipram的地址在何處,都在hello_world軟件工程的bsp editor 中 的linker script中設置。

2.最終燒錄進epcq的是jic文件,jic = rtl.sof+hex. hex = bootloader+hello_world。hex文件可在hello world工程中,選中hello world文件夾,右鍵make target->build->mem->ini_generate生成。燒錄時,sof文件地址爲0,hex文件地址爲0x1e00000e.

方法二介紹

1.qsys中添加兩個onchip ram.ram1存放運行bootloader,ram2存放運行hello world.

2.新建bootloader軟件工程,修改Embedded Design Handbook 5.3例程的源代碼advanced_boot_copoier.c,替換讀epcq函數,並將boot_image直接指定爲1,不讓程序檢驗應用程序鏡像頭。bsp linker script 中,heap text stack等均設置爲onchipram1.

3.編譯bootlaoder工程,並make target,得到幾個hex,將onchipram1.hex及相關的memini,qip,.spd,添加進quartus工程中,全編譯,生成的sof文件,包含了bootloader,會在配置硬件sof時,將boot loader初始化進onchipram1中。

4.qsys中,cpu從onchipram1 reset. 

5.新建hello world工程,bsp editor linker script中,可設置的均設置爲onchip ram2。

6. nios command shell 中,將hello world.elf轉換爲hex

7.最終燒錄jic,jic = sof(with bootloader) + hex。hex僅含hello world.添加hex時,選擇relative adress(4000000),big endian.絕對地址應爲4300000.advanced_boot_copoier.c中hello world鏡像地址也應爲0x4300000。

8燒錄jic,斷電重啓,看led燈,得知進入bootlaoder,打開nios command shell,執行nios2-terminal,串口打印bootloader的複製鏡像,跳轉等信息,並打印hello world,led燈也相應地亮滅。說明跳轉進了應用程序。(爲何不打開串口,就不自動跳轉?因爲我的bootloader中使用了printf函數庫,導致jtag uart沒有打印信息時,bootloader會停止,可以不用printf函數,改用my_jtag_write()函數,原始版本的bootloader是沒用printf函數的,或者在bootloader內取消JTAG_UART)。

9.調試方法:sof不含bootloader時,flash中可燒錄sof(without bootloader)+hello_world.hex。然後在eclipse bootloader界面,以debug方式,運行bootlaoder,使其實行拷貝,跳轉等動作,啓動helloworld應用。同樣,flash中僅正確位置(0x4300000)有hello world.hex,也可通過jtag燒錄sof(with bootloader),然後就會自動運行應用程序(或者打開串口後會執行)。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章