📄 ynorsim.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 + -