Exemplo n.º 1
0
Arquivo: Irp.cpp Projeto: daynix/UsbDk
CIrp::~CIrp()
{
    if (m_Irp != nullptr)
    {
        DestroyIrp();
        ReleaseTarget();
    }
}
Exemplo n.º 2
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
    }
}
Exemplo n.º 3
0
Arquivo: Irp.cpp Projeto: daynix/UsbDk
void CIrp::Destroy()
{
    DestroyIrp();
    ReleaseTarget();
}