⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fine-gained flash access驱动范例.txt

📁 NiosII初学者范例,里面包含字符模式设备驱动DMA传输等范例
💻 TXT
字号:
/*
 * 声明:本范例源于书籍‘NiosII软件架构解析’
 * 作者:蔡伟纲
 * 博客地址: http://NiosII.cublog.cn 
 *
 * 一、功能: Fine-gained Flash Access驱动演示代码.
 * 二、运行前提: 本范例需要硬件开发板的支持,
 *     要求硬件开发板具备名为”ext_flash”的CFI Flash或EPCS Flash模块;
*/
#include <stdio.h>
#include <string.h>
#include "sys/alt_flash.h"

#define BUF_SIZE 1024//定义缓冲区的大小
//从指定的flash分区的第OFFSET_FROM_REGION字节单元开始写操作;
#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;
  
//开辟源缓冲区,本范例将把源缓冲区的数据写入flash 
//BUF_SIZE不可过大,否则可能导致堆栈溢出; 
  char source[BUF_SIZE];
//开辟目的缓冲区,本范例将把flash的数据读回目的缓冲区,
//并通过与源缓冲区数据的对比来确定读写flash是否正确;
//BUF_SIZE不可过大,否则可能导致堆栈溢出; 
  char dest[BUF_SIZE];
  
//将源缓冲区的数据全部初始化为0x55;
  memset(source, 0x55, BUF_SIZE);

//使用alt_flash_open_dev打开flash设备,并返回flash设备的文件描述器fd;
//注:flash设备在SOPC Builder中的命名应为’ext_flash’,否则这里会出现编译错误;
  fd = alt_flash_open_dev("/dev/ext_flash");
  if(fd!=NULL)
  {
    printf("Open Flash Device Successfully.\n");
    
  //使用alt_get_flash_info得到flash设备的分区信息;
  //关于flash分区的更详细介绍请参考Flash设备数据结构;
    ret_code = alt_get_flash_info(fd,
                                  &regions,
                                  &number_of_regions);
  //检查是否有可用分区;
    if(number_of_regions && (regions->offset == 0))
    {
      //擦除flash设备第一个分区的第一个数据块;
      ret_code = alt_erase_flash_block(fd,
                                       regions->offset,
                                       regions->block_size);
                                                                     
      if(ret_code == 0)
      {
        printf("Erase Flash Device Successfully.\n");
    	//将源缓冲区的数据写入flash第一个分区的第一个数据块;
        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设备进行读操作,
          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++)
            {
          	  //对比源缓冲区和目的缓冲区的数据;
              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);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -