找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2920|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

NIOS II 軟核中EPCS配置芯片的存儲(chǔ)操作

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:114320 發(fā)表于 2016-5-10 03:31 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
NIOS II 軟核中EPCS配置芯片的存儲(chǔ)操作
最近用CYCLONE FPGA做的視頻圖像疊加板需要存儲(chǔ)一些用戶配置信息,而EPCS4配置芯片除了存儲(chǔ)FPGA配置信息和NIOS II程序外,還有很多存儲(chǔ)空間剩余未使用,剛好可以用來做用戶配置信息存儲(chǔ)。
折騰了挺長(zhǎng)時(shí)間,看了不少文檔,都只是提到可以用ALTERA提供的HAL函數(shù)來調(diào)用EPCS相關(guān)的函數(shù)。最后只能硬著頭皮看“altera_avalon_epcs_flash_controller.c”函數(shù)(路徑為:\\altera\72\ip\sopc_builder_ip\altera_avalon_epcs_flash_controller\HAL\src)?戳藘商爝是有些參數(shù)概念不是很明確。
還好搜到一個(gè)老外寫的關(guān)于NIOS IICPCS器件操作的帖子,他是花了一個(gè)多月才摸索到怎么操作,然后給出了一個(gè)簡(jiǎn)單的例子。正如他帖子里說的,我發(fā)現(xiàn)了他的帖子,“very lucky”。也許他用的NIOS IDE版本還比較早,有些函數(shù)他當(dāng)時(shí)還不能用, 需要對(duì)他和程序做一些修改和調(diào)整。他的帖子寫的很簡(jiǎn)單,但為我提供了重要信息,幫我省了很多時(shí)間。經(jīng)驗(yàn)就是這樣,花了很多時(shí)間收獲的東西,你收到自己的箱子里藏起來是自己的一小份財(cái)富,也許之后永遠(yuǎn)不會(huì)再發(fā)揮它的價(jià)值。但如果你愛它,就把它寫出來把它復(fù)制無(wú)數(shù)份,讓它盡可能的去發(fā)揮它的價(jià)值J
呵呵,不扯廢話了,說正題。
先看一下這個(gè)簡(jiǎn)單程序
#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, &regions, &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字節(jié)
        ret_code = alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字節(jié)
    }
    while(1)
    {
    }
}
上面的程序就是對(duì)EPCS配置芯片操作的流程和方式。首先打開器件獲取句柄my_epcs,然后的讀寫及擦除操作都是通過句柄my_epcs來操作的!/dev/epcs_controller”中的“epcs_controller”是用戶在配置NIOS核時(shí)自命名的,可以在system.h中查到,即“EPCS_CONTROLLER_NAME”。通過IDE調(diào)試的話可以查看my_epcs指向的FLASH相關(guān)參數(shù)。EPCS器件只有一個(gè)區(qū)(regions),EPCS4區(qū)內(nèi)有8個(gè)塊(block),每個(gè)塊是65536字節(jié)。(注:只有EPCS1每個(gè)塊32768字節(jié),其余配置芯片是每塊65536字節(jié)。)
alt_epcs_flash_erase_block(my_epcs, regions->offset+0x70000);//擦除第8
這個(gè)函數(shù)是擦除整塊的函數(shù),第一個(gè)參數(shù)是剛才獲得的句柄,用于指示是對(duì)剛剛打開的FLASH進(jìn)行擦除,第二個(gè)regions->offset的值其實(shí)是0,是由EPCS控制模塊自己管理的。FPGA配置文件和NIOS核中的程序是從前邊存儲(chǔ)的,即從regions->offset+0x00000開始的地址。我的用掉不到4個(gè)塊,還剩4個(gè)塊可以用于自定義的存儲(chǔ)。為便于將來進(jìn)行功能擴(kuò)展,盡量空余低塊以備將來使用,優(yōu)先使用高地址空間(第8塊,起始地址為regions->offset+0x70000)進(jìn)行用戶配置信息存儲(chǔ)。
alt_epcs_flash_write(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字節(jié)
epcsbuf數(shù)組中的連續(xù)32字節(jié)寫入regions->offset+0x70000開始的EPCS4芯片內(nèi)。如果是寫入第6塊的第0x100開始的地址,那么可用regions->offset+0x60100代替regions->offset+0x70000。
alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字節(jié)
EPCS4中的第8段起點(diǎn)regions->offset+0x70000讀取連續(xù)32字節(jié)存到epcsbuf數(shù)組內(nèi)。
調(diào)試過程中可以在執(zhí)行alt_epcs_flash_write前手動(dòng)修改epcsbuf數(shù)組內(nèi)的值,在執(zhí)行alt_epcs_flash_read前再更改epcsbuf數(shù)組內(nèi)的值為其他值,如果執(zhí)行alt_epcs_flash_readepcsbuf數(shù)組內(nèi)的值恢復(fù)到執(zhí)行alt_epcs_flash_write前的值,那么對(duì)EPCS芯片的讀寫操作已經(jīng)成功了J
[url=]
[/url]
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表