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

📄 ynorsim.c

📁 yaffs2 lastest sourcecode~~
💻 C
字号:
#include "ynorsim.h"#include <stdio.h>#include <fcntl.h>#include <sys/stat.h>#include <unistd.h>#include <time.h>#define YNORSIM_FNAME "emfile-nor"/* Set YNORSIM_BIT_CHANGES to a a value from 1..30 to  *simulate bit flipping as the programming happens.  * A low value results in faster simulation with less chance of encountering a partially programmed * word.  */   //#define YNORSIM_BIT_CHANGES 15#define YNORSIM_BIT_CHANGES 2#if 0/* Simulate 32MB of flash in 256k byte blocks. * This stuff is x32. */#define YNORSIM_BLOCK_SIZE_U32  (256*1024/4)#define YNORSIM_DEV_SIZE_U32	(32*1024 * 1024/4)#else/* Simulate 8MB of flash in 256k byte blocks. * This stuff is x32. */#define YNORSIM_BLOCK_SIZE_U32  (256*1024/4)#define YNORSIM_DEV_SIZE_U32	(8*1024 * 1024/4)#endifstatic __u32 word[YNORSIM_DEV_SIZE_U32];extern int random_seed;extern int simulate_power_failure;static void NorError(void){  printf("Nor error\n");  while(1){}}static void ynorsim_SaveImage(void){  int h = open(YNORSIM_FNAME, O_RDWR | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);  write(h,word,sizeof(word));  close(h);}static void ynorsim_RestoreImage(void){  int h = open(YNORSIM_FNAME, O_RDONLY, S_IREAD | S_IWRITE);  memset(word,0xFF,sizeof(word));  read(h,word,sizeof(word));  close(h);}static void ynorsim_PowerFail(void){  ynorsim_SaveImage();  exit(1);}static int initialised = 0;static int remaining_ops;static int nops_so_far;int ops_multiplier = 500;static void ynorsim_MaybePowerFail(void){   nops_so_far++;         remaining_ops--;   if(simulate_power_failure &&      remaining_ops < 1){       printf("Simulated power failure after %d operations\n",nops_so_far);    	ynorsim_PowerFail();  }}static void ynorsim_Ready(void){  if(initialised)     return;  srand(random_seed);  remaining_ops = 1000000000;  remaining_ops = (rand() % 10000) * ops_multiplier * YNORSIM_BIT_CHANGES;  ynorsim_RestoreImage();}void ynorsim_Read32(__u32 *addr,__u32 *buf, int nwords){    while(nwords > 0){     *buf = *addr;     buf++;     addr++;     nwords--;   }}void ynorsim_WriteOneWord32(__u32 *addr,__u32 val){  __u32 tmp;  __u32 m;  int i;  tmp = *addr;  if(val & ~tmp){    // Fail due to trying to change a zero into a 1    printf("attempt to set a zero to one (%x)->(%x)\n",tmp,val);    NorError();  }    for(i = 0; i < YNORSIM_BIT_CHANGES; i++){    m = 1 << (rand() & 31);    if(!(m & val)){      tmp &= ~m;      *addr = tmp;      ynorsim_MaybePowerFail();    }         }    *addr = tmp & val;  ynorsim_MaybePowerFail();}void ynorsim_Write32(__u32 *addr, __u32 *buf, int nwords){  while(nwords >0){    ynorsim_WriteOneWord32(addr,*buf);    addr++;    buf++;    nwords--;  }}void ynorsim_EraseBlock(__u32 *addr){  /* Todo... bit flipping */  memset(addr,0xFF,YNORSIM_BLOCK_SIZE_U32 * 4);}void ynorsim_Initialise(void){  ynorsim_Ready();}void ynorsim_Shutdown(void){  ynorsim_SaveImage();  initialised=0;}__u32 *ynorsim_GetBase(void){  return word;}

⌨️ 快捷键说明

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