读写SPI FLASH--应用程序部分

该程序读取新的BIOS文件和SPI FLASH中的现有内容,对比两者差异,只有存在差异时才擦除相关扇区并写入新内容,以减少意外断电的影响。程序主要包含读写操作和擦除策略。
摘要由CSDN通过智能技术生成

  驱动部分见前一篇文章:http://blog.csdn.net/bripengandre/archive/2009/03/20/4009615.aspx

  应用程序部分很简单:读取新的BIOS文件 ,以及flash中的当前内容,如果两者有差异,则将相关扇区先擦掉,然后再将新的BIOS内容写进去.即程序的擦写策略为:只有有差异时,才擦写,这能减小程序在擦写时,突然断电带来的坏作用.

  不说什么了,直接看源码.

 

/****************************RefreshBIOS.h*****************************************/

#ifndef _REFRESH_BIOS_H_
#define _REFRESH_BIOS_H_

#define SPI_IOCTL_BASE 0xDE
#define IOCTL_ERASE_CHIP _IOWR(SPI_IOCTL_BASE, 0, ioctl_arg_t)  
#define IOCTL_ERASE_BLOCK _IOWR(SPI_IOCTL_BASE, 1, ioctl_arg_t)

#define  SPI_NAME "/dev/spi_name"
#define MAJOR_ID 252
#define MINOR_ID 0
#define CMD_SIZE 250
#define BUF_SIZE 500
#define SPI_FLASH_SIZE (2048*1024)
#define SPI_SECTOR_SIZE 0x1000


typedef struct _erase_block
{
    int start;
    int end;
}erase_block_t;

typedef struct _ioctl_arg
{
    unsigned int  type;
    union
    {
        struct
        {
            unsigned int start;
            unsigned int end;
        }erase_range;
    }data;  
}ioctl_arg_t;

#endif /* _REFRESH_BIOS_H_ */

 

 

/**************************RefreshBIOS.c*****************************************/

#include "RefreshBIOS.h"
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ioctl.h>

static int write_range(int start, int end);
static int check_block(erase_block_t *block_old, erase_block_t *block_new);
static ssize_t readn(int fd, void *

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值