Пример #1
0
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);*/
}
Пример #2
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;
}
Пример #3
0
//-----------------------------------------------------------------------------
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);
}
Пример #4
0
bool isp_erase_chip(void)
{
	flash_unlock(IFLASH0_ADDR, IFLASH0_ADDR+IFLASH_SIZE, 0, 0);
	return flash_erase_all(IFLASH0_ADDR);
}