示例#1
0
int CSetProgsAdvDlg::SaveData()
{
	if (m_ToolsValid)
	{
		// Remove all registry values which are no longer in the list
		CStringList values;
		if (m_regToolKey.getValues(values))
		{
			for (POSITION pos = values.GetHeadPosition(); pos != NULL; )
			{
				CString ext = values.GetNext(pos);
				if (m_Tools.find(ext) == m_Tools.end())
				{
					CRegString to_remove(m_regToolKey.m_path + _T("\\") + ext);
					to_remove.removeValue();
				}
			}
		}

		// Add or update new or changed values
		for (auto it = m_Tools.cbegin(); it != m_Tools.cend() ; ++it)
		{
			CString ext = it->first;
			CString new_value = it->second;
			CRegString reg_value(m_regToolKey.m_path + _T("\\") + ext);
			if (reg_value != new_value)
				reg_value = new_value;
		}
	}
	return 0;
}
示例#2
0
文件: ejtag.c 项目: cktben/urjtag
static uint32_t
ejtag_run_pracc (urj_bus_t *bus, const uint32_t *code, unsigned int len)
{
    urj_data_register_t *ejaddr, *ejdata, *ejctrl;
    int i, pass;
    uint32_t addr, data, retval;

    ejaddr = urj_part_find_data_register (bus->part, "EJADDRESS");
    ejdata = urj_part_find_data_register (bus->part, "EJDATA");
    ejctrl = urj_part_find_data_register (bus->part, "EJCONTROL");
    if (!(ejaddr && ejdata && ejctrl))
    {
        urj_error_set (URJ_ERROR_NOTFOUND,
                       _("EJADDRESS, EJDATA or EJCONTROL register not found"));
        return 0;
    }

    urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
    urj_tap_chain_shift_instructions (bus->chain);

    pass = 0;
    retval = 0;

    for (;;)
    {
        ejctrl->in->data[PrAcc] = 1;
        urj_tap_chain_shift_data_registers (bus->chain, 0);
        urj_tap_chain_shift_data_registers (bus->chain, 1);

        urj_log (URJ_LOG_LEVEL_ALL,  "ctrl=%s\n",
                 urj_tap_register_get_string (ejctrl->out));

        if (ejctrl->out->data[Rocc])
        {
            urj_error_set (URJ_ERROR_BUS, _("Reset occurred, ctrl=%s"),
                           urj_tap_register_get_string (ejctrl->out));
            bus->initialized = 0;
            break;
        }
        if (!ejctrl->out->data[PrAcc])
        {
            urj_error_set (URJ_ERROR_BUS, _("No processor access, ctrl=%s"),
                           urj_tap_register_get_string (ejctrl->out));
            bus->initialized = 0;
            break;
        }

        urj_part_set_instruction (bus->part, "EJTAG_ADDRESS");
        urj_tap_chain_shift_instructions (bus->chain);

        urj_tap_chain_shift_data_registers (bus->chain, 1);
        addr = reg_value (ejaddr->out);
        if (addr & 3)
        {
            urj_error_set (URJ_ERROR_BUS,
                           _("PrAcc bad alignment: addr=0x%08lx"),
                           (long unsigned) addr);
            addr &= ~3;
        }

        urj_part_set_instruction (bus->part, "EJTAG_DATA");
        urj_tap_chain_shift_instructions (bus->chain);

        urj_tap_register_fill (ejdata->in, 0);

        if (ejctrl->out->data[PRnW])
        {
            urj_tap_chain_shift_data_registers (bus->chain, 1);
            data = reg_value (ejdata->out);
            urj_log (URJ_LOG_LEVEL_ALL,
                     _("%s(%d) PrAcc write: addr=0x%08lx data=0x%08lx\n"),
                     __FILE__, __LINE__,
                     (long unsigned) addr, (long unsigned) data);
            if (addr == UINT32_C (0xff200000))
            {
                /* Return value from the target CPU.  */
                retval = data;
            }
            else
            {
                urj_error_set (URJ_ERROR_BUS,
                               _("Unknown write addr=0x%08lx data=0x%08lx"),
                               (long unsigned) addr, (long unsigned) data);
            }
        }
        else
        {
            if (addr == UINT32_C (0xff200200) && pass++)
                break;

            data = 0;
            if (addr >= 0xff200200 && addr < 0xff200200 + (len << 2))
            {
                data = code[(addr - 0xff200200) >> 2];

                for (i = 0; i < 32; i++)
                    ejdata->in->data[i] = (data >> i) & 1;
            }
            urj_log (URJ_LOG_LEVEL_ALL,
                     "%s(%d) PrAcc read: addr=0x%08lx data=0x%08lx\n",
                     __FILE__, __LINE__,
                     (long unsigned) addr, (long unsigned) data);
            urj_tap_chain_shift_data_registers (bus->chain, 0);
        }

        urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
        urj_tap_chain_shift_instructions (bus->chain);

        ejctrl->in->data[PrAcc] = 0;
        urj_tap_chain_shift_data_registers (bus->chain, 0);
    }
示例#3
0
文件: ejtag_dma.c 项目: bgelb/urjtag
/**
 * low level dma read operation
 *
 */
static unsigned int
ejtag_dma_read (urj_bus_t *bus, unsigned int addr, int sz)
{
    static urj_data_register_t *ejctrl = NULL;
    static urj_data_register_t *ejaddr = NULL;
    static urj_data_register_t *ejdata = NULL;
    int i = 0;
    int timeout = 5;
    unsigned int ret;

    if (ejctrl == NULL)
        ejctrl = urj_part_find_data_register (bus->part, "EJCONTROL");
    if (ejaddr == NULL)
        ejaddr = urj_part_find_data_register (bus->part, "EJADDRESS");
    if (ejdata == NULL)
        ejdata = urj_part_find_data_register (bus->part, "EJDATA");

    urj_part_set_instruction (bus->part, "EJTAG_ADDRESS");
    urj_tap_chain_shift_instructions (bus->chain);
    for (i = 0; i < 32; i++)
        ejaddr->in->data[i] = (addr >> i) & 1;
    urj_tap_chain_shift_data_registers (bus->chain, 0); /* Push the address to read */
    urj_log (URJ_LOG_LEVEL_COMM, "Wrote to ejaddr->in      =%s %08lX\n",
             urj_tap_register_get_string (ejaddr->in),
             (long unsigned) reg_value (ejaddr->in));
    urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
    urj_tap_chain_shift_instructions (bus->chain);
    urj_tap_register_fill (ejctrl->in, 0);
    ejctrl->in->data[PrAcc] = 1;        // Processor access
    ejctrl->in->data[ProbEn] = 1;
    ejctrl->in->data[DmaAcc] = 1;       // DMA operation request */
    ejctrl->in->data[DstRt] = 1;
    if (sz)
        ejctrl->in->data[sz] = 1;       // Size : can be WORD/HALFWORD or nothing for byte
    ejctrl->in->data[DmaRwn] = 1;       // This is a read
    urj_tap_chain_shift_data_registers (bus->chain, 0); /* Do the operation */
    urj_log (URJ_LOG_LEVEL_ALL, "Wrote to ejctrl->in      =%s %08lX\n",
             urj_tap_register_get_string (ejctrl->in),
             (long unsigned) reg_value (ejctrl->in));

    do
    {
        urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
        urj_tap_chain_shift_instructions (bus->chain);
        urj_tap_register_fill (ejctrl->in, 0);
        ejctrl->in->data[PrAcc] = 1;
        ejctrl->in->data[ProbEn] = 1;
        ejctrl->in->data[DmaAcc] = 1;
        urj_tap_chain_shift_data_registers (bus->chain, 1);

        urj_log (URJ_LOG_LEVEL_ALL, "Wrote to ejctrl->in   =%s %08lX\n",
                 urj_tap_register_get_string (ejctrl->in),
                 (long unsigned) reg_value (ejctrl->in));
        urj_log (URJ_LOG_LEVEL_ALL, "Read from ejctrl->out =%s %08lX\n",
                 urj_tap_register_get_string (ejctrl->out),
                 (long unsigned) reg_value (ejctrl->out));
        timeout--;
        if (!timeout)
            break;
    }
    while (ejctrl->out->data[DstRt] == 1);      // This flag tell us the processor has completed the op

    urj_part_set_instruction (bus->part, "EJTAG_DATA");
    urj_tap_chain_shift_instructions (bus->chain);
    urj_tap_register_fill (ejdata->in, 0);
    urj_tap_chain_shift_data_registers (bus->chain, 1);
    ret = reg_value (ejdata->out);
    urj_log (URJ_LOG_LEVEL_COMM, "Read from ejdata->out(%c) =%s %08lX\n",
             siz_ (sz), urj_tap_register_get_string (ejdata->out),
             (long unsigned) reg_value (ejdata->out));
    urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
    urj_tap_chain_shift_instructions (bus->chain);
    urj_tap_register_fill (ejctrl->in, 0);
    ejctrl->in->data[PrAcc] = 1;
    ejctrl->in->data[ProbEn] = 1;
    urj_tap_chain_shift_data_registers (bus->chain, 1); // Disable DMA, reset state to previous one.

    urj_log (URJ_LOG_LEVEL_ALL, "Wrote to ejctrl->in   =%s %08lX\n",
             urj_tap_register_get_string (ejctrl->in),
             (long unsigned) reg_value (ejctrl->in));
    urj_log (URJ_LOG_LEVEL_ALL, "Read from ejctrl->out =%s %08lX\n",
             urj_tap_register_get_string (ejctrl->out),
             (long unsigned) reg_value(ejctrl->out));

    if (ejctrl->out->data[Derr] == 1)
    {                           // Check for DMA error, i.e. incorrect address
        urj_error_set (URJ_ERROR_BUS_DMA,
                       _("dma read (dma transaction failed)"));
    }

    switch (sz)
    {
    case DMA_HALFWORD:
        if (addr & 2)
            ret = (ret >> 16) & 0xffff;
        else
            ret = ret & 0xffff;
        break;
    case DMA_BYTE:
        if ((addr & 3) == 3)
            ret = (ret >> 24) & 0xff;
        else if ((addr & 3) == 2)
void convert_Object(void){
	
	char *temp;
	int n, i, x, b, p, e;
	int disp = 0;
	int j;
	char str[3];
	
	get_OPformat();
		
	/* if is format 1 */
	if(OPCODE_format == 1){
		OBJECT_CODE = instPtr->Opcode; 	
		OBJECT_ox = 1;          // need to generate OBJECT CODE
		convert_ObToString();   // convert int object code to string.
	}
	/* else if is format 2 */
	else if(OPCODE_format == 2){
		OBJECT_CODE = (instPtr->Opcode) << 8;  // shit left 1 Byte
		
		if(OPERAND_ox == 2){
			OBJECT_CODE += ((reg_value(OPERAND1) << 4) | reg_value(OPERAND2));    // 2 registers
		}
		else{
			OBJECT_CODE += (reg_value(OPERAND1) << 4);                            // 1 register
		}
		
		OBJECT_ox = 1;          // need to generate OBJECT CODE
		convert_ObToString();   // convert int object code to string.
	}	
	/* else (format 3) */
	else if(OPCODE_format == 3){
		
		/* if is Immediate addressing */
		if(OPERAND1[0] == '#'){
			n = 0;
			i = 1;
		} 
		/* else if is Indirect addressing */
		else if(OPERAND1[0] == '@'){
			n = 1;
			i = 0;
		}
		/* else (simple) */
		else{
			i = 1;
			n = 1;
		}
		
		/* Calculate displacement, 
		if OPERAND1 is immediate address constant */
		if((OPERAND1[0] == '#') && (OPERAND1[1] >= '0') && (OPERAND1[1] <= '9')){
			disp = atoi(&OPERAND1[1]);  // we don't need #
			b = 0;
			p = 0;
		}
		/* else if PC relative */
		else if(relative_mode(&disp)){
			b = 0;
			p = 1;
		} 
		/* else (BASE relative) */
		else{
			b = 1;
			p = 0;
		}
		
		/* if is index address */
		if((OPERAND_ox == 2) && (OPERAND2[0] == 'X')){
			x = 1;
		}
		/* else (not index address) */
		else{
			x = 0;
		}
		
		e = 0;    // format 3
		
		/* exception RSUB <-- L */
		if(!strcmp(OPCODE, "RSUB")){
			n = 1;
			i = 1;
			x = 0;
			b = 0;
			p = 0;
			e = 0;
			disp = reg_L;
		}
		
		/* generate object code */
		OBJECT_CODE = (instPtr->Opcode) << 16;  // shift left 16 bits
		OBJECT_CODE += ((n << 17) + (i << 16) + (x << 15) + (b << 14) + (p << 13) + (e << 12));
		OBJECT_CODE |= (disp & 0x00000FFF) ;
		OBJECT_ox = 1;          // need to generate OBJECT CODE
		convert_ObToString();   // convert int object code to string.
	}
	/* else if is format 4 */
	else if(OPCODE_format == 4){
		
		/* if is Immediate addressing */
		if(OPERAND1[0] == '#'){
			n = 0;
			i = 1;
		} 
		/* else if is Indirect addressing */
		else if(OPERAND1[0] == '@'){
			n = 1;
			i = 0;
		}
		/* else (simple) */
		else{
			i = 1;
			n = 1;
		}	
		
		/* Calculate address, 
		if OPERAND1 is immediate address constant */
		if((OPERAND1[0] == '#') && (OPERAND1[1] >= '0') && (OPERAND1[1] <= '9')){
			disp = atoi(&OPERAND1[1]);        // we don't need #
			b = 0;
			p = 0;
		}
		/* else (direct addressing) */
		else{
			/* Clean '@' or '#' */
			if((OPERAND1[0] == '@') || (OPERAND1[0] == '#')){
				temp = &OPERAND1[1];
				strcpy(OPERAND1, temp);
			}
			/* search SYMTAB */
			if(search_SYMTAB(OPERAND1) == 0){
				printf("ERROR! %s is not found. It's an invalid SYMBOL\n", OPERAND1);
				exit(0);
			}
			b = 0;
			p = 0;
			disp = SYMBOL_ADDR;
			
			/* Relocation */
			relocate(0);        // store address
		}
			
		/* if is index address */
		if((OPERAND_ox == 2) && (OPERAND2[0] == 'X')){
			x = 1;
		}
		/* else (not index address) */
		else{
			x = 0;
		}
		
		e = 1;    // format 4
		
		/* generate object code */
		OBJECT_CODE = (instPtr->Opcode) << 24;  // shift left 16 bits
		OBJECT_CODE += ((n << 25) + (i << 24) + (x << 23) + (b << 22) + (p << 21) + (e << 20));
		OBJECT_CODE += disp;
		OBJECT_ox = 1;          // need to generate OBJECT CODE
		convert_ObToString();   // convert int object code to string.
		
	}
	/* else if OPCODE = 'BYTE', then */
	else if(!strcmp(OPCODE, "BYTE")){
		/* if string */
		if(OPERAND1[0] == 'C'){
			OBJECT_CODE = (int)OPERAND1[2];
			for(j = 3, S_L = 1; OPERAND1[j] != '\''; j++, S_L++){
				OBJECT_CODE = (int)OPERAND1[j] + (OBJECT_CODE << 8);
			}
		}
		/* else (char) */
		else{
			str[0] = OPERAND1[2];
			str[1] = OPERAND1[3];
			str[2] = '\0';
			OBJECT_CODE = (int)strtol(str, NULL, 16);
			S_L = 1;
		}
		OBJECT_ox = 1;
		convert_ObToString();
	}
	/* else if OPCODE = 'WORD', then */
	else if(!strcmp(OPCODE, "BYTE")){
		OBJECT_CODE = atoi(OPERAND1);
		OBJECT_ox = 1;
		S_L = 1;
		convert_ObToString();
	}	
	/* else if OPCODE = 'BASE', then */
	else if(OPCODE_format == 7){
		/* search SYMTAB */
		if(search_SYMTAB(OPERAND1) == 0){
			printf("ERROR! %s is not found. It's an invalid SYMBOL\n", OPERAND1);
			exit(0);
		}
		
		BASE = SYMBOL_ADDR;
		OBJECT_ox = 0;
	}
	else if(OPCODE_format == 0){
		OBJECT_ox = 0;
	}		
	else{
		/* Set ERROR Flag */
		printf("ERROR.\n");
		exit(0);
	}
				
	// printf("x = %d, b = %d, p = %d, e = %d, disp = %X\n", x, b, p, e, disp);  // for testing
	return ;
}
示例#5
0
文件: ejtag_dma.c 项目: bgelb/urjtag
/**
 * low-level dma write
 *
 */
static void
ejtag_dma_write (urj_bus_t *bus, unsigned int addr, unsigned int data, int sz)
{
    static urj_data_register_t *ejctrl = NULL;
    static urj_data_register_t *ejaddr = NULL;
    static urj_data_register_t *ejdata = NULL;
    int i = 0;
    int timeout = 5;

    if (ejctrl == NULL)
        ejctrl = urj_part_find_data_register (bus->part, "EJCONTROL");
    if (ejaddr == NULL)
        ejaddr = urj_part_find_data_register (bus->part, "EJADDRESS");
    if (ejdata == NULL)
        ejdata = urj_part_find_data_register (bus->part, "EJDATA");

    switch (sz)
    {                           /* Fill the other bytes with copy of the current */
    case DMA_BYTE:
        data &= 0xff;
        data |= (data << 8) | (data << 16) | (data << 24);
        break;
    case DMA_HALFWORD:
        data &= 0xffff;
        data |= (data << 16);
        break;
    default:
        break;
    }

    urj_part_set_instruction (bus->part, "EJTAG_ADDRESS");
    urj_tap_chain_shift_instructions (bus->chain);
    for (i = 0; i < 32; i++)
        ejaddr->in->data[i] = (addr >> i) & 1;
    urj_tap_chain_shift_data_registers (bus->chain, 0); /* Push the address to write */
    urj_log (URJ_LOG_LEVEL_COMM, "Wrote to ejaddr->in      =%s %08lX\n",
             urj_tap_register_get_string (ejaddr->in),
             (long unsigned) reg_value (ejaddr->in));
    urj_part_set_instruction (bus->part, "EJTAG_DATA");
    urj_tap_chain_shift_instructions (bus->chain);
    for (i = 0; i < 32; i++)
        ejdata->in->data[i] = (data >> i) & 1;
    urj_tap_chain_shift_data_registers (bus->chain, 0); /* Push the data to write */
    urj_log (URJ_LOG_LEVEL_COMM, "Wrote to edata->in(%c)    =%s %08lX\n",
             siz_ (sz), urj_tap_register_get_string (ejdata->in),
             (long unsigned) reg_value (ejdata->in));
    urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
    urj_tap_chain_shift_instructions (bus->chain);
    urj_tap_register_fill (ejctrl->in, 0);
    ejctrl->in->data[PrAcc] = 1;        // Processor access
    ejctrl->in->data[ProbEn] = 1;
    ejctrl->in->data[DmaAcc] = 1;       // DMA operation request */
    ejctrl->in->data[DstRt] = 1;
    if (sz)
        ejctrl->in->data[sz] = 1;       // Size : can be WORD/HALFWORD or nothing for byte
    urj_tap_chain_shift_data_registers (bus->chain, 0); /* Do the operation */
    urj_log (URJ_LOG_LEVEL_ALL, "Wrote to ejctrl->in      =%s %08lX\n",
             urj_tap_register_get_string (ejctrl->in),
             (long unsigned) reg_value (ejctrl->in));

    do
    {
        urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
        urj_tap_chain_shift_instructions (bus->chain);
        urj_tap_register_fill (ejctrl->in, 0);
        ejctrl->in->data[PrAcc] = 1;
        ejctrl->in->data[ProbEn] = 1;
        ejctrl->in->data[DmaAcc] = 1;
        urj_tap_chain_shift_data_registers (bus->chain, 1);
        timeout--;
        if (!timeout)
            break;
    }
    while (ejctrl->out->data[DstRt] == 1);      // This flag tell us the processor has completed the op

    urj_part_set_instruction (bus->part, "EJTAG_CONTROL");
    urj_tap_chain_shift_instructions (bus->chain);
    urj_tap_register_fill (ejctrl->in, 0);
    ejctrl->in->data[PrAcc] = 1;
    ejctrl->in->data[ProbEn] = 1;
    urj_tap_chain_shift_data_registers (bus->chain, 1); // Disable DMA, reset state to previous one.
    if (ejctrl->out->data[Derr] == 1)
    {                           // Check for DMA error, i.e. incorrect address
        urj_error_set (URJ_ERROR_BUS_DMA,
                       _("dma write (dma transaction failed)"));
    }
    return;
}