?? fine-gained flash access
字號:
/*
* 聲明:本范例源于書籍‘NiosII軟件架構(gòu)解析’
* 作者:蔡偉綱
* 博客地址: http://NiosII.cublog.cn
*
* 一、功能: Fine-gained Flash Access驅(qū)動演示代碼.
* 二、運(yùn)行前提: 本范例需要硬件開發(fā)板的支持,
* 要求硬件開發(fā)板具備名為”ext_flash”的CFI Flash或EPCS Flash模塊;
*/
#include <stdio.h>
#include <string.h>
#include "sys/alt_flash.h"
#define BUF_SIZE 1024//定義緩沖區(qū)的大小
//從指定的flash分區(qū)的第OFFSET_FROM_REGION字節(jié)單元開始寫操作;
#define OFFSET_FROM_REGION 100
int main()
{
printf("Fine-gained Flash Access Demo.\n");
alt_flash_fd* fd;
flash_region* regions;
int number_of_regions;
int ret_code;
//開辟源緩沖區(qū),本范例將把源緩沖區(qū)的數(shù)據(jù)寫入flash
//BUF_SIZE不可過大,否則可能導(dǎo)致堆棧溢出;
char source[BUF_SIZE];
//開辟目的緩沖區(qū),本范例將把flash的數(shù)據(jù)讀回目的緩沖區(qū),
//并通過與源緩沖區(qū)數(shù)據(jù)的對比來確定讀寫flash是否正確;
//BUF_SIZE不可過大,否則可能導(dǎo)致堆棧溢出;
char dest[BUF_SIZE];
//將源緩沖區(qū)的數(shù)據(jù)全部初始化為0x55;
memset(source, 0x55, BUF_SIZE);
//使用alt_flash_open_dev打開flash設(shè)備,并返回flash設(shè)備的文件描述器fd;
//注:flash設(shè)備在SOPC Builder中的命名應(yīng)為’ext_flash’,否則這里會出現(xiàn)編譯錯誤;
fd = alt_flash_open_dev("/dev/ext_flash");
if(fd!=NULL)
{
printf("Open Flash Device Successfully.\n");
//使用alt_get_flash_info得到flash設(shè)備的分區(qū)信息;
//關(guān)于flash分區(qū)的更詳細(xì)介紹請參考Flash設(shè)備數(shù)據(jù)結(jié)構(gòu);
ret_code = alt_get_flash_info(fd,
®ions,
&number_of_regions);
//檢查是否有可用分區(qū);
if(number_of_regions && (regions->offset == 0))
{
//擦除flash設(shè)備第一個分區(qū)的第一個數(shù)據(jù)塊;
ret_code = alt_erase_flash_block(fd,
regions->offset,
regions->block_size);
if(ret_code == 0)
{
printf("Erase Flash Device Successfully.\n");
//將源緩沖區(qū)的數(shù)據(jù)寫入flash第一個分區(qū)的第一個數(shù)據(jù)塊;
ret_code = alt_write_flash_block(fd,
regions->offset,
regions->offset+OFFSET_FROM_REGION,
source,
BUF_SIZE);
if(ret_code == 0)
{
printf("Write Flash Device Successfully.\n");
//使用alt_read_flash對flash設(shè)備進(jìn)行讀操作,
ret_code = alt_read_flash(fd,
regions->offset+OFFSET_FROM_REGION,
dest,
BUF_SIZE);
if(ret_code==0)
{
printf("Read Flash Device Successfully.\n");
int Loop, ErrorCount = 0;
for(Loop = 0; Loop < BUF_SIZE; Loop++)
{
//對比源緩沖區(qū)和目的緩沖區(qū)的數(shù)據(jù);
if(source[Loop] != dest[Loop])
{
printf("Verify failed at location: 0x%X\n",Loop);
ErrorCount++;
}
}
if(ErrorCount == 0)
{
printf("Verify Successfully!\n");
}
}
else
{
printf("Can’t read flash device\n");
}
}
else
{
printf("Can’t write flash device\n");
}
}
else
{
printf("Can't Erase Flash Device.\n");
}
}
else
{
printf("Can't Find Available Flash Region.\n");
}
alt_flash_close_dev(fd);
}
else
{
printf("Can’t open flash device\n");
}
while(1);
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -