NIOS II 軟核中EPCS配置芯片的存儲操作 最近用CYCLONE FPGA做的視頻圖像疊加板需要存儲一些用戶配置信息,而EPCS4配置芯片除了存儲FPGA配置信息和NIOS II程序外,還有很多存儲空間剩余未使用,剛好可以用來做用戶配置信息存儲。 折騰了挺長時間,看了不少文檔,都只是提到可以用ALTERA提供的HAL函數來調用EPCS相關的函數。最后只能硬著頭皮看“altera_avalon_epcs_flash_controller.c”函數(路徑為:\\altera\72\ip\sopc_builder_ip\altera_avalon_epcs_flash_controller\HAL\src)?戳藘商爝是有些參數概念不是很明確。 還好搜到一個老外寫的關于NIOS II下CPCS器件操作的帖子,他是花了一個多月才摸索到怎么操作,然后給出了一個簡單的例子。正如他帖子里說的,我發現了他的帖子,“very lucky”。也許他用的NIOS IDE版本還比較早,有些函數他當時還不能用, 需要對他和程序做一些修改和調整。他的帖子寫的很簡單,但為我提供了重要信息,幫我省了很多時間。經驗就是這樣,花了很多時間收獲的東西,你收到自己的箱子里藏起來是自己的一小份財富,也許之后永遠不會再發揮它的價值。但如果你愛它,就把它寫出來把它復制無數份,讓它盡可能的去發揮它的價值J 呵呵,不扯廢話了,說正題。 先看一下這個簡單程序 #include <stdio.h> #include <unistd.h> #include "system.h" #include "alt_types.h" #include "sys/alt_flash.h" #include "sys/alt_flash_dev.h" alt_u8 epcsbuf[32]; int ret_code; alt_flash_fd* my_epcs;//定義句柄 main() { my_epcs = alt_flash_open_dev("/dev/epcs_controller");//打開FLASH器件,獲取句柄 ret_code = alt_epcs_flash_get_info (my_epcs, ®ions, &number_of_regions);//獲取配置芯片信息 if(my_epcs) //信息獲取成功 { //example application, read general data from epcs address 0x70000 ret_code = alt_epcs_flash_erase_block(my_epcs, regions->offset+0x70000);//擦除第8塊 ret_code = alt_epcs_flash_write(my_epcs, regions->offset+0x70000, epcsbuf, 32); //寫32字節 ret_code = alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //讀32字節 } while(1) { } } 上面的程序就是對EPCS配置芯片操作的流程和方式。首先打開器件獲取句柄my_epcs,然后的讀寫及擦除操作都是通過句柄my_epcs來操作的!/dev/epcs_controller”中的“epcs_controller”是用戶在配置NIOS核時自命名的,可以在system.h中查到,即“EPCS_CONTROLLER_NAME”。通過IDE調試的話可以查看my_epcs指向的FLASH相關參數。EPCS器件只有一個區(regions),EPCS4區內有8個塊(block),每個塊是65536字節。(注:只有EPCS1每個塊32768字節,其余配置芯片是每塊65536字節。) alt_epcs_flash_erase_block(my_epcs, regions->offset+0x70000);//擦除第8塊 這個函數是擦除整塊的函數,第一個參數是剛才獲得的句柄,用于指示是對剛剛打開的FLASH進行擦除,第二個regions->offset的值其實是0,是由EPCS控制模塊自己管理的。FPGA配置文件和NIOS核中的程序是從前邊存儲的,即從regions->offset+0x00000開始的地址。我的用掉不到4個塊,還剩4個塊可以用于自定義的存儲。為便于將來進行功能擴展,盡量空余低塊以備將來使用,優先使用高地址空間(第8塊,起始地址為regions->offset+0x70000)進行用戶配置信息存儲。 alt_epcs_flash_write(my_epcs, regions->offset+0x70000, epcsbuf, 32); //寫32字節 將epcsbuf數組中的連續32字節寫入regions->offset+0x70000開始的EPCS4芯片內。如果是寫入第6塊的第0x100開始的地址,那么可用regions->offset+0x60100代替regions->offset+0x70000。 alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //讀32字節 從EPCS4中的第8段起點regions->offset+0x70000讀取連續32字節存到epcsbuf數組內。 調試過程中可以在執行alt_epcs_flash_write前手動修改epcsbuf數組內的值,在執行alt_epcs_flash_read前再更改epcsbuf數組內的值為其他值,如果執行alt_epcs_flash_read后epcsbuf數組內的值恢復到執行alt_epcs_flash_write前的值,那么對EPCS芯片的讀寫操作已經成功了J [url=]
[/url]
|