bool isp_erase_chip_split(void) { flash_unlock(IFLASH0_ADDR, IFLASH0_ADDR+IFLASH_SIZE, 0, 0); uint32_t rc = flash_erase_all(IFLASH0_ADDR); return rc == FLASH_RC_OK; /*static uint16_t isp_page_number=0; uint8_t isp_page_number_split; uint32_t pul_flash_descriptor; flash_get_descriptor(IFLASH0_ADDR, &pul_flash_descriptor, IFLASH_SIZE); if (isp_page_number==0) { isp_page_number = flash_get_page_count(&pul_flash_descriptor); flash_lock(IFLASH0_ADDR, IFLASH0_ADDR+IFLASH_SIZE, 0, 0); //flash_api_lock_all_regions(false); } isp_page_number_split = 128; while (isp_page_number && isp_page_number_split) { flash_erase_page(--isp_page_number, false); isp_page_number_split--; } return (isp_page_number==0);*/ }
/* ********************************************************************* * flashdrv_ioctl(ctx,buffer) * * Handle special IOCTL functions for the flash. Flash devices * support NVRAM information, sector and chip erase, and a * special IOCTL for updating the running copy of CFE. * * Input parameters: * ctx - device context * buffer - descriptor for IOCTL parameters * * Return value: * 0 if ok else error ********************************************************************* */ static int flashdrv_ioctl(cfe_devctx_t *ctx,iocb_buffer_t *buffer) { flashpart_t *part = ctx->dev_softc; flashdev_t *softc = part->fp_dev; nvram_info_t *nvinfo; flash_info_t *info; flash_range_t range; int offset; switch ((int)buffer->buf_ioctlcmd) { case IOCTL_NVRAM_GETINFO: /* * We only support NVRAM on flashes that have been partitioned * into at least two partitions. Every partition supports * being an NVRAM in that case, but we'll only attach one * of them to the environment subsystem. */ if (softc->fd_probe.flash_nparts <= 1) { return CFE_ERR_UNSUPPORTED; } nvinfo = (nvram_info_t *) buffer->buf_ptr; if (buffer->buf_length != sizeof(nvram_info_t)) return CFE_ERR_INV_PARAM; nvinfo->nvram_offset = 0; nvinfo->nvram_size = part->fp_size; nvinfo->nvram_eraseflg = 1; buffer->buf_retlen = sizeof(nvram_info_t); return 0; break; case IOCTL_FLASH_ERASE_SECTOR: offset = (int) buffer->buf_offset; offset += part->fp_offset; if (offset >= softc->fd_probe.flash_size) return -1; flash_op_begin(softc); flash_op_add(softc, softc->fd_probe.flash_phys, softc->fd_erasefunc, offset, 0,0); flash_op_execute(softc); return 0; case IOCTL_FLASH_ERASE_ALL: offset = (int) buffer->buf_offset; if (offset != 0) return -1; flash_erase_all(softc); return 0; case IOCTL_FLASH_WRITE_ALL: /* Write file and reboot */ flashdrv_write2(ctx,buffer,1); return -1; /* should not return */ case IOCTL_FLASH_GETINFO: info = (flash_info_t *) buffer->buf_ptr; info->flash_base = part->fp_offset; info->flash_size = part->fp_size; info->flash_type = softc->fd_probe.flash_type; info->flash_flags = FLASH_FLAG_NOERASE; if (flashop_engine_ram != (void *) flashop_engine_ptr) info->flash_flags |= FLASH_FLAG_INUSE; return 0; case IOCTL_FLASH_GETSECTORS: return flash_sector_query(softc,(flash_sector_t *) buffer->buf_ptr); case IOCTL_FLASH_ERASE_RANGE: memcpy(&range,buffer->buf_ptr,sizeof(flash_range_t)); range.range_base += part->fp_offset; if (range.range_length > part->fp_size) { range.range_length = part->fp_size; } return flash_erase_range(softc,&range); default: /* Call hook if present. */ if (softc->fd_probe.flash_ioctl_hook) { return (*(softc->fd_probe.flash_ioctl_hook))(ctx,buffer); } return -1; } return -1; }
//----------------------------------------------------------------------------- int do_lpc_stuff ( int erase_all ) { unsigned int ra,rb,rc; unsigned int ramadd; unsigned int romadd; unsigned int romsec; if(lpc_isp_synchronize()) return(1); //ra=0; //sdata[ra++]='J'; //sdata[ra++]=0x0D; //ser_senddata(sdata,ra); //watch_for(); //ra=0; //sdata[ra++]='K'; //sdata[ra++]=0x0D; //ser_senddata(sdata,ra); //watch_for(); //Turn off echo ra=0; sdata[ra++]='A'; sdata[ra++]=' '; sdata[ra++]='0'; sdata[ra++]=0x0D; sdata[ra++]=0x0A; ser_senddata(sdata,ra); if(sync_wait_for(sdata,ra-1)) return(1); //---- //the ra-1 is so that everything from the chip is 0x0A...stuff...0x0D //---- if(get_return_code()) return(1); //Unlock ra=0; sdata[ra++]='U'; sdata[ra++]=' '; sdata[ra++]='2'; sdata[ra++]='3'; sdata[ra++]='1'; sdata[ra++]='3'; sdata[ra++]='0'; sdata[ra++]=0x0D; ser_senddata(sdata,ra); if(get_return_code()) return(1); ////write program to ram and run from ram //rb=0x40000200; //for(ra=0;ra<bin_length;ra++) //{ //if(write_data_word(rb,bin_data[ra])) return(1); //rb+=4; //} //sprintf((char *)sdata,"G %u A\r",0x40000200); //ra=strlen((char *)sdata); //ser_senddata(sdata,ra); ////if(get_return_code()) return(1); if(erase_all) { printf("Erase All\n"); if(flash_erase_all()) { printf("flash_erase_all() failed\n"); return(1); } } //write program to flash printf("Programming 0x%04X bytes to flash\n",fdatalen<<2); //patch vector table, first 0x20 bytes worth of words need to add to zero fdata[0x14>>2]=0x0; rc=0; for(ra=0;ra<0x20;ra+=4) rc+=fdata[ra>>2]; rc=-rc; fdata[0x14>>2]=rc; printf("0x%08X\n",fdata[0]); romadd=0x00000000; //ramadd=0x40000200; for(ra=0;ra<fdatalen;ra+=64) { romsec=romadd>>12; //armmite uses 4KB sectors if((romadd&0xFFF)==0) //armmite uses 4KB sectors { printf("\nErasing 0x%04X\n",romadd); sprintf((char *)sdata,"P %u %u\r",romsec,romsec); ser_senddata(sdata,strlen((char *)sdata)); if(get_return_code()) return(1); sprintf((char *)sdata,"E %u %u\r",romsec,romsec); ser_senddata(sdata,strlen((char *)sdata)); if(get_return_code()) return(1); ramadd=0x40000200; } printf("\nProgramming 0x%04X\n",romadd); rc=ramadd; for(rb=0;rb<64;rb++) //256 bytes per copy { if(write_data_word(rc,fdata[ra+rb])) return(1); rc+=4; } sprintf((char *)sdata,"P %u %u\r",romsec,romsec); ser_senddata(sdata,strlen((char *)sdata)); if(get_return_code()) return(1); sprintf((char *)sdata,"C %u %u 256\r",romadd,ramadd); ser_senddata(sdata,strlen((char *)sdata)); if(get_return_code()) return(1); romadd+=256; ramadd+=256; } printf("\n====\n"); while(1) { rb=ser_copystring(rdata); for(ra=0;ra<rb;ra++) { printf("0x%02X ",rdata[ra]); if((rdata[ra]>=0x20)&&(rdata[ra]<127)) printf("[%c]",rdata[ra]); printf("\n"); } ser_dump(rb); } return(0); }
bool isp_erase_chip(void) { flash_unlock(IFLASH0_ADDR, IFLASH0_ADDR+IFLASH_SIZE, 0, 0); return flash_erase_all(IFLASH0_ADDR); }