| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- #include "xspOptFlash.h"
- #include "../Hardware/boardinit.h"
- #include "xspDataOpt.h"
- FlahOpt g_flashopt;
- /*-------------------------------------------------------------------------------
- * 初始化
- * ------------------------------------------------------------------------------*/
- void init_flash(void)
- {
- g_flashopt.head = 0;
- g_flashopt.tail = 0;
- g_flashopt.flag = FALSE;
- g_flashopt.totalPage = 64; //一共64页
- g_flashopt.pageRecord = 32; // 一页32条记录
- }
- /*-------------------------------------------------------------------------------------------
- * 更新当前记录的上报标识 bsend ,将0xFF 更新为0x00, 说明已经上报
- * ------------------------------------------------------------------------------------------*/
- static void update_bsend_to_0x00(uint32_t baseAddr)
- {
- uint16_t data = 0x0000;
- Flash_BufferWrite_uint16(baseAddr+4,&data,2);//正常的flash 写入
- return;
- }
- /*-------------------------------------------------------------------------------
- * 读取flash中的记录
- * 返回值 1:成功 0:失败
- * --------------------------------------------------------------------------------*/
- uint8_t read_flash(uint8_t *outda,uint8_t bupdateSend)
- {
- uint32_t addr;
- uint8_t curPage,curRecord;
- if((g_flashopt.tail== g_flashopt.head) &&(g_flashopt.flag == FALSE)){ // 队列为空
- // printf("没有新记录\r\n");
- return 0;
- }
- curPage = g_flashopt.head/32;
- curRecord = g_flashopt.head%32;
- addr = START_FLASH_ADDR + curPage*PAGE_SIZE + curRecord*RECORD_SIZE;
- Flash_BufferRead(addr,outda,64);//数据存入到outda中
- if((1 == bupdateSend) &&(0xFFFFFFFF != *((uint32_t*)outda)) ) update_bsend_to_0x00(addr);
- g_flashopt.head = (g_flashopt.head+1)%RECORD_FIFO;
- if(g_flashopt.head == g_flashopt.tail) g_flashopt.flag = FALSE;
- return 1;
- }
- /*-----------------------------------------------------------------------------------
- * 写入
- * ----------------------------------------------------------------------------------*/
- void write_flash(uint8_t *data)
- {
- uint32_t addr;
- uint8_t curPage,curRecord,ret;
- if((g_flashopt.tail == g_flashopt.head) &&(g_flashopt.flag==TRUE)){ // fifo满了
- printf("队列已满 tail=%d, head=%d\r\n",g_flashopt.tail,g_flashopt.head);
- g_flashopt.head = (g_flashopt.head+1)%RECORD_FIFO;
- }
- curPage = g_flashopt.tail/32;
- curRecord = g_flashopt.tail%32;
- addr = START_FLASH_ADDR + curPage*PAGE_SIZE + curRecord*RECORD_SIZE;
- if(curRecord==0){ // 第0条记录时 要擦除本页
- Flash_RangeErase(addr,PAGE_SIZE);
- }
- ret = Flash_BufferWrite(addr,(uint32_t*)data,64);//正常的flash 写入
- if(ret == 0) printf("++++++++++++++写入flash出错误\r\n");
- g_flashopt.tail = (g_flashopt.tail+1)%RECORD_FIFO;
- if(g_flashopt.tail == g_flashopt.head) g_flashopt.flag = TRUE;
- printf("fifo head = %d, tail=%d\r\n",g_flashopt.head,g_flashopt.tail);
- }
- /*-------------------------------------------------------------------------------
- * 读取
- * readsize:读取的字节数据
- * --------------------------------------------------------------------------------*/
- void find_last_record(uint8_t pageIndex, uint8_t recordIndex, uint8_t readsize,uint8_t *outda)
- {
- uint32_t addr;
- addr = START_FLASH_ADDR + pageIndex*PAGE_SIZE + recordIndex*RECORD_SIZE;
- Flash_BufferRead(addr,outda,readsize);//数据存入到outda中
- return ;
- }
- #if( 1 )
- void find_fifo_head(void)
- {
- uint8_t i=0,j=0;//,pageIndex = 0, recordIndex = 0,
- uint8_t bfirst = 0;
- uint32_t min = 0xFFFFFFFF;
- tempRecord head;//,tail;
- g_flashopt.head = 0;
- for(i=0;i<g_flashopt.totalPage;i++){
- for(j=0;j<g_flashopt.pageRecord;j++){
- find_last_record(i,j,6,head.data); // 一页的第一条记录
- if(head.da.recordId != 0xFFFFFFFF){
- if(head.da.bSend == 0xFFFF) {
- if(min>=head.da.recordId) {
- g_flashopt.head = i*g_flashopt.pageRecord + j;
- min = head.da.recordId;
- }
- }
- }
- else if((head.da.recordId == 0xFFFFFFFF)&&(min == 0xFFFFFFFF)){
- if(head.da.bSend == 0xFFFF && bfirst == 0){
- g_flashopt.head = i*g_flashopt.pageRecord + j;
- bfirst = 1;
- }
- }
- }
- }
- }
- void find_fifo_head00(void)
- {
- uint8_t i=0,j=0,bfinish = 0;//,pageIndex = 0, recordIndex = 0;
- uint32_t min = 0xFFFFFFFF;
- tempRecord head,tail;
- g_flashopt.head = 0;
- for(i=0;i<g_flashopt.totalPage;i++){
- find_last_record(i,0,6,head.data); // 一页的第一条记录
- find_last_record(i,31,6,tail.data); // 一页的最后一条记录
- if(head.da.recordId != 0xFFFFFFFF) {
- for(j=0;j<g_flashopt.pageRecord;j++){
- find_last_record(i,j,6,head.data);
- if((head.da.recordId != 0xFFFFFFFF)){
- if(head.da.bSend == 0xFFFF){
- if(min>head.da.recordId){
- min = head.da.recordId;
- g_flashopt.head = i*g_flashopt.pageRecord + j;
- }
- }
- }
- }
- }
- else if((head.da.recordId == 0xFFFFFFFF) &&(tail.da.recordId==0xFFFFFFFF)){
- if(min != 0xFFFFFFFF) continue;
- if((i+1) == g_flashopt.totalPage) break;
- find_last_record(i+1,0,6,head.data);
- if(head.da.recordId == 0xFFFFFFFF){
- g_flashopt.head = i*g_flashopt.pageRecord;
- break;
- }
- else {
- if(head.da.bSend == 0xFFFF) {
- g_flashopt.head = i*g_flashopt.pageRecord;
- break;
- }
- else {
- for(j=1;j<g_flashopt.pageRecord;j++){
- find_last_record(i,j,6,head.data);
- if((head.da.recordId != 0xFFFFFFFF)){
- if(head.da.bSend == 0xFFFF){
- g_flashopt.head = i*g_flashopt.pageRecord + j;
- bfinish = 1;
- break;
- }
- }
- }
- }
- }
- }
- if(bfinish == 1) break;
- }
- // g_flashopt.head = pageIndex*g_flashopt.pageRecord + recordIndex;
- }
- #else
- void find_fifo_head(void)
- {
- uint8_t i=0,j=0,pageIndex = 0,recordIndex=0;
- int8_t bfirst = -1,bfind = 0;
- tempRecord head,tail;
- uint32_t min = 0xFFFFFFFF;
- for(i=0;i<g_flashopt.totalPage;i++){
- find_last_record(i,0,6,head.data);
- find_last_record(i,31,6,tail.data);
- if(head.da.recordId == 0xFFFFFFFF && tail.da.recordId==0xFFFFFFFF) {
- if((bfirst+1) == i){
- if(i==0) pageIndex = 0;
- else {
- find_last_record(i-1,31,6,tail.data); // 上一页的最后一条是否为FFFF
- if(tail.da.recordId==0xFFFFFFFF) pageIndex = bfirst-1;
- else pageIndex = bfirst;
- }
- recordIndex = 0;
- break;
- }
- bfirst = i;
- continue;
- }
- else if(head.da.recordId != 0xFFFFFFFF){
- if(tail.da.bSend == 0x0000){
- continue; // 如果最后一条为00,则表达这一页的数据都已经上发
- }
- if(head.da.bSend == 0xFFFF) {
- min = head.da.recordId;
- }
- for(j=1;j<g_flashopt.pageRecord;j++){
- find_last_record(i,j,6,head.data);
- if(head.da.recordId == 0xFFFFFFFF) {
- if(head.da.bSend == 0xFFFF && min == 0xFFFFFFFF) {
- pageIndex = i;
- recordIndex = j;
- bfind = 1;
- break;
- }
- }
- else {
- if(head.da.bSend == 0xFFFF){
- if(min>head.da.recordId){
- pageIndex = i;
- recordIndex = j;
- min = head.da.recordId;
- bfind = 1;
- break;
- }
- }
- }
- }
- if(bfind == 1) break;
- }
- }
- g_flashopt.head = pageIndex*g_flashopt.pageRecord + recordIndex;
- }
- #endif
- /*-----------------------------------------------------------------------------------------
- * powerup 上电后,读取flash中的数据 且根据记录ID找出最新的一条记录的位置
- * 以及找到最后一条没有上报的记录的位置
- * ----------------------------------------------------------------------------------------*/
- void powerup_read_record_from_flash(uint8_t *recordDA)
- {
- uint8_t i=0,j=0,bfind=0;//,curpage=0,currecord=0
- uint8_t data[4] = {0};
- uint32_t curread;//,maxread = 0;
- /*for(i=0;i<g_flashopt.totalPage;i++){ // 找页
- find_last_record(i,0,4,data);
- curread = *((uint32_t*)data);
- if(curread == 0xFFFFFFFF) {
- curpage = (i==0 ? 0:i-1);
- break;
- }
- else {
- find_last_record(i,31,4,data); // 判断本页的最后一条,最后一条为空,则最大的记录就在本页
- if(*((uint32_t*)data) == 0xFFFFFFFF){
- curpage = i;
- break;
- }
- else {
- if(maxread<curread){
- maxread = curread;
- }
- else {
- curpage = i;
- break;
- }
- }
- }
- }
- maxread = 0;
- for(i=0;i<g_flashopt.pageRecord;i++){ // 找页中的最大记录
- find_last_record(curpage,i,4,data);
- curread = *((uint32_t*)data);
- if(curread == 0xFFFFFFFF){
- currecord = (i==0?0:i-1);
- break;
- }
- else if(maxread<=curread){
- maxread = curread;
- }
- else {
- currecord = i;
- break;
- }
- if((i == (g_flashopt.pageRecord-1))&&(currecord==0)){ // 说明为最后一条
- currecord = 31;
- }
- }
- g_flashopt.tail = curpage*g_flashopt.pageRecord+currecord;
- g_flashopt.head = g_flashopt.tail;
- g_flashopt.tail = (g_flashopt.tail==0?0:g_flashopt.tail+1);*/
- for(i=0;i<g_flashopt.totalPage;i++){
- for(j=0;j<g_flashopt.pageRecord;j++){
- find_last_record(i,j,4,data);
- curread = *((uint32_t*)data);
- if(curread == 0xFFFFFFFF){
- g_flashopt.tail = i*g_flashopt.pageRecord+j;
- bfind = 1;
- break;
- }
- }
- if(bfind == 1) break;
- }
- g_flashopt.head = g_flashopt.tail-1; // 为了读取最后一条记录
- read_flash(recordDA,0); // 读取的最后一条记录
- // for(i=0;i<4;i++){
- // update_bsend_to_0x00();
- // }
- find_fifo_head();// 找到fifo的头
- printf("fifo_head = %d,fifo_tail = %d\r\n",g_flashopt.head, g_flashopt.tail);
- if(g_flashopt.head != g_flashopt.tail) g_flashopt.flag = TRUE;
- else {
- g_flashopt.flag = FALSE;
- }
- if(g_xspReDa.reDa.recordId==0xFFFFFFFF)
- memset(&g_xspReDa,0,64);
- g_xspoptDa.lastTamout = g_xspReDa.reDa.tamount;
- g_xspoptDa.lastToil = g_xspReDa.reDa.toil;
- printf("读取flash中最后记录 record=%d,amout=%d,oil=%d,tamout=%lld,toil=%lld\r\n",\
- g_xspReDa.reDa.recordId,g_xspReDa.reDa.amount,g_xspReDa.reDa.oil,
- g_xspReDa.reDa.tamount,g_xspReDa.reDa.toil);
- return;
- }
- /*-----------------------------------------------------------------------------
- * 根据记录ID查找交易记录
- * ----------------------------------------------------------------------------*/
- uint8_t xsp_check_point_record(uint32_t recordId,uint8_t *recordDa)
- {
- uint8_t i=0,ret = 0,j=0;
- uint8_t data[4] = {0};
- uint32_t curread;
- for(i=0;i<g_flashopt.totalPage;i++){ // 找页
- find_last_record(i,0,4,data); // 读取本页第一条
- curread = *((uint32_t*)data);
- if(curread == 0xFFFFFFFF) continue;
- else if(curread == recordId){ // 说明找到了
- find_last_record(i,0,64,recordDa);
- ret = 1;
- break;
- }
- else if(curread <recordId){
- find_last_record(i,63,4,data); // 读取本页是后一条
- curread = *((uint32_t*)data);
- if(curread < recordId) continue;
- else if(curread == recordId) { // 说明找到了
- find_last_record(i,63,64,recordDa);
- ret = 1;
- break;
- }
- else {
- for(j=1;j<g_flashopt.pageRecord;j++){
- find_last_record(i,j,4,data); // 读取本页是后一条
- curread = *((uint32_t*)data);
- if(curread == recordId){
- find_last_record(i,j,64,recordDa);
- ret = 1;
- break;
- }
- }
- if(ret == 1) break;
- }
- }
- }
- return ret;
- }
|