Exemple #1
0
void main(){
  int i;
  uint16 data0 = 0x0000;
  uint16 data1 = 0x1000;
  uint16 data2 = 0x2000;
  uint16 data3 = 0x3000;
  uint16 data4 = 0x1000;
  uint16 data5 = 0x5000;
  uint32 address = 0x000000;
  uint16 blockRead[32];
  uint16 blockWrite0[16];
  uint16 blockWrite1[16];
  uint16 blockWrite2[16];
  uint16 blockWrite3[16];
  uint16 blockWrite5[64];
  uint16 incomingData[4];

  for(i = 0 ; i < 16 ; i++){
      blockWrite0[i] = data0;
      data0++;
  }
  for(i = 0 ; i < 16 ; i++){
      blockWrite1[i] = data1;
      data1++;
  }

  for(i = 0 ; i < 16 ; i++){
      blockWrite2[i] = data2;
      data2++;
  }
  for(i = 0 ; i < 16 ; i++){
      blockWrite3[i] = data3;
      data3++;
  }
  for(i = 0 ; i < 64 ; i++){
      blockWrite5[i] = data5;
      data5++;
  }

  trisInit();
  enter_HVP();
  
  bulkErase();
  enableWrite();
 
  flashWriteBlock(blockWrite0, blockWrite1, 1);
  flashWriteBlock(blockWrite2, blockWrite3, 2);
  flashReadBlock(blockRead, 64, 1);
  flashReadBlock(blockRead, 64, 2);
  flashWriteData(blockWrite5, 64, 0);
  flashReadBlock(blockRead, 64, 1);
  flashReadBlock(blockRead, 64, 2);
  exit_HVP();

  while(1){}
}
int PrNetRomManager::writePartialPage(int page, struct data values) {
  data *p = (data*) ADDRESS_OF_PAGE(page);
  int rc = flashWriteBlock(p, &values, sizeof(values));
  if( rc == 0) {
    return 0;
  } else {
    return rc;
  }
}
Exemple #3
0
/**
 * Write a block of bytes from the currently active input to the flash.
 * The block will be written to offset 0 of this bank/chip.
 * The whole block must be located in one bank and in one flash chip.
 *
 * return 1 for success, 0 for failure
 */
uint8_t flashWriteBankFromFile(uint8_t nBank, uint8_t nChip,
                                uint16_t nSize)
{
    uint8_t  bReplaceEAPI;
    uint8_t  oldState;
    uint16_t nOffset;
    uint16_t nBytes;

    nOffset      = 0;
    bReplaceEAPI = 0;
    while (nSize)
    {
        nBytes = (nSize > FLASH_WRITE_SIZE) ? FLASH_WRITE_SIZE : nSize;

        oldState = progressGetStateAt(nBank, nChip);
        progressSetBankState(nBank, nChip, PROGRESS_READING);

        if (utilRead(buffer, nBytes) != nBytes)
        {
            screenPrintSimpleDialog(apStrFileTooShort);
            progressSetBankState(nBank, nChip, PROGRESS_UNTOUCHED);
            return 0;
        }

        progressSetBankState(nBank, nChip, oldState);

        // Check if EAPI has to be replaced
        if (nBank == 0 && nChip == 1 && nOffset == 0x1800 &&
                    memcmp(buffer, pStrEAPISignature, 4) == 0)
            bReplaceEAPI = 1;

        if (bReplaceEAPI)
        {
            if (nOffset == 0x1800)
                memcpy(buffer, EAPI_LOAD_TO, 0x100);
            else if (nOffset == 0x1900)
                memcpy(buffer, EAPI_LOAD_TO + 0x100, 0x100);
            else if (nOffset == 0x1a00)
                memcpy(buffer, EAPI_LOAD_TO + 0x200, 0x100);
        }

        if (!flashWriteBlock(nBank, nChip, nOffset, buffer))
            return 0;

        if (!flashVerifyBlock(nBank, nChip, nOffset, buffer))
            return 0;

        nSize -= nBytes;
        nOffset += nBytes;
        refreshElapsedTime();
    }

    return 1;
}
int PrNetRomManager::updateConfig(struct prnet_config c) {
  data *p = (data*) ADDRESS_OF_PAGE(SETTINGS_FLASH_PAGE);
  return flashWriteBlock(p, &c, sizeof(c));
}
Exemple #5
0
/**
Handle incomming frames from the serial port.
*/
void rxhandler(void) {
    switch (serRxBuf.header.type) {
        case ACK:
        case NACK:
            break;

        case T_CONNECT:                         //connect JTAG to the target
            InitTarget();
            if (GetDevice() == STATUS_OK) {
                txACK();
                //printf("Device type: %04x\n", DEVICE);
            } else{
                txNACKstr("no target");
            }
            break;
        case T_RELEASE:                         //release JTAG from target
            ClrTCLK();
            IR_Shift(IR_CNTRL_SIG_16BIT);
            DR_Shift16(0x3001);         //lch
            IR_Shift(IR_CNTRL_SIG_RELEASE);
            SetTCLK();
            ReleaseTarget();
            txACK();
            break;
        case T_RESET:                           //reset the target and release JTAG
            ReleaseDevice(V_RESET);
            ReleaseTarget();
            txACK();
            break;
        case T_PUC:                             //reset the target through JTAG, keep connection
            ExecutePUC();
            txACK();
            break;

        case T_MEMREAD:                         //ream memory from target
            {                                   //use a new block for local vars
                word size = serRxBuf.data.memread.size;
                word address = serRxBuf.data.memread.address;
                word offset;
    
                txACK();
                HaltCPU();
                if (size > sizeof(serTxBuf.data.memdata.data)) {
                   size = sizeof(serTxBuf.data.memdata.data);
                }
                if (address <= 0xff) {          //peripherals in bytemode
                    for (offset = 0; offset < size; offset++) {
                        serTxBuf.data.memdata.data[offset] = ReadMem(F_BYTE, address+offset);
                    }
                } else {                        //peripherals in wordmode as well as RAM and Flash
                    address = address & 0xfffe; //startaddress has to be even!
                    for (offset = 0; offset < size/2; offset++) {
                        ((word *)serTxBuf.data.memdata.data)[offset] = ReadMem(F_WORD, address+offset*2);
                    }
                    if (size & 1) {
                        //odd size, read last byte separate
                        //odd sizes on word-mode peripherals yield  wrong results
                        //in the last word!!
                        serTxBuf.data.memdata.data[size-1] = ReadMem(F_BYTE, address+size-1);
                    }
                }
                serTxBuf.data.memdata.address = address;
                serTxBuf.header.type = T_MEMDATA;
                serTxBuf.header.size = 2+size;
                sendMessage(&serTxBuf);
            }
            break;
        case T_MEMWRITE:                        //write target memory (Peripherals, RAM, Flash)
            {
                word offset;
                word size = serRxBuf.header.size - 2;
                HaltCPU();
                if ((serRxBuf.data.memwrite.address >= 0x100) &&
                    (serRxBuf.data.memwrite.address <= 0x1ff)) { //peripherals in wordmode
                    for (offset = 0; offset < size; offset+=2) {
                        WriteMem(F_WORD,
                                 serRxBuf.data.memwrite.address+offset,
                                 ((word*)serRxBuf.data.memwrite.data)[offset/2]
                        );
                    }
                } else if (serRxBuf.data.memwrite.address < 0x1000) {  //ram + peripherals, bytemode
                    for (offset = 0; offset < size; offset++) {
                        WriteMem(F_BYTE,
                                 serRxBuf.data.memwrite.address+offset,
                                 serRxBuf.data.memwrite.data[offset]
                        );
                    }
                } else {                        //flash memory, wordmode
                    WriteFLASH(serRxBuf.data.memwrite.address,
                               size/2,
                               (word *)serRxBuf.data.memwrite.data
                    );
                }
                txACK();
            }
            break;
        case T_EXEC:                            //execute target program located at given address
            ReleaseDevice(serRxBuf.data.exec.address);
            txACK();
            break;
        case T_MEMERASE:                        //erase target flash (Segment, Main or All)
            HaltCPU();
            EraseFLASH(
                serRxBuf.data.memerase.mode,
                serRxBuf.data.memerase.address
            );
            txACK();
            break;
        case T_MCLK:                            //provide MCLKs, allows sort of single stepping
            ClrTCLK();
            IR_Shift(IR_CNTRL_SIG_16BIT);
            DR_Shift16(0x3401);         //lch
            while (serRxBuf.data.step.numsteps--) {
                SetTCLK();
                ClrTCLK();
            }
            SetTCLK();
            txACK();
            break;

        case MEMREAD:                           //host memory read
            {
                word size = serRxBuf.data.memread.size;
                byte *address = (byte*)serRxBuf.data.memread.address;
                word offset;
                txACK();
                if (size > sizeof(serTxBuf.data.memdata.data)) {
                   size = sizeof(serTxBuf.data.memdata.data);
                }
                if (address <= (byte *)0xff) {      //bytemode
                    for (offset = 0; offset < size; offset++) {
                        serTxBuf.data.memdata.data[offset] = address[offset];
                    }
                } else {                            //wordmode
                    address = (byte *)((word)address & 0xfffe);    //startaddress has to be even!
                    size &= 0xfffe;                     //size has to be even
                    for (offset = 0; offset < size/2; offset++) {
                        ((word *)serTxBuf.data.memdata.data)[offset] = ((word *)address)[offset];
                    }
                }
                serTxBuf.data.memdata.address = (word)address;
                serTxBuf.header.type = MEMDATA;
                serTxBuf.header.size = 2+size;
                sendMessage(&serTxBuf);
            }
            break;
        case MEMWRITE:                          //host memory write, used to download user programs
            {
                void *adr = (byte *)serRxBuf.data.memwrite.address;
                word offset;
                word size = serRxBuf.header.size - 2;
                if ((adr >= (void *)0x100) && (adr <= (void *)0x1ff)) { //peripherals, wordmode
                    for (offset = 0; offset < size/2; offset++) {
                        ((word *)adr)[offset] = ((word *)serRxBuf.data.memwrite.data)[offset];
                    }
                    txACK();
                    return;
                }
                if (adr < (void *)0x1000) {     //ram + peripherals, bytemode
                    for (offset = 0; offset < size; offset++) {
                        ((byte *)adr)[offset] = serRxBuf.data.memwrite.data[offset];
                    }
                } else {                        //flash
                    flashWriteBlock(
                        serRxBuf.data.memwrite.data,
                        (void *)serRxBuf.data.memwrite.address,
                        size);
                }
                txACK();
            }
            break;
        case MEMERASE:                          //erase one segemnt on host
            flashErase((void *)serRxBuf.data.memerase.address);
            txACK();
            break;
        //~ case MEMEXEC:                       //exec code on host
                //~ serRxBuf.memexec.function(
                    //~ serRxBuf.memexec.arg1,
                    //~ serRxBuf.memexec.arg2
                //~ );
            //~ txACK();
            //~ break;
        case STARTBSL:                          //start BSL for firmware upgrade
            txACK();
            while((UTCTL0 & TXEPT) == 0) {}     //wait until last byte is sent
            FCTL3 = 0;                          //generate a flash key violation -> POR reset, see main()
            break;
        default:
            txNACKstr("unknown command");       //serialComm error: unknown command
    }
}