コード例 #1
0
ファイル: chain.c プロジェクト: tbnobody/usbprog
void
chain_shift_data_registers( chain_t *chain, int capture_output )
{
    int i;
    parts_t *ps;

    if (!chain || !chain->parts)
        return;

    ps = chain->parts;

    for (i = 0; i < ps->len; i++) {
        if (ps->parts[i]->active_instruction == NULL) {
            printf( _("%s(%d) Part %d without active instruction\n"), __FILE__, __LINE__, i );
            return;
        }
        if (ps->parts[i]->active_instruction->data_register == NULL) {
            printf( _("%s(%d) Part %d without data register\n"), __FILE__, __LINE__, i );
            return;
        }
    }

    tap_capture_dr( chain );
    for (i = 0; i < ps->len; i++)
        tap_shift_register( chain, ps->parts[i]->active_instruction->data_register->in,
                            capture_output ? ps->parts[i]->active_instruction->data_register->out : NULL,
                            (i + 1) == ps->len );
}
コード例 #2
0
ファイル: discovery.c プロジェクト: dihmuzikien/ECE473
void
discovery( chain_t *chain )
{
    int irlen;
    tap_register *ir;
    tap_register *irz;

    /* detecting IR size */
    jtag_reset( chain );

    printf( _("Detecting IR length ... ") );
    fflush( stdout );

    tap_capture_ir( chain );
    irlen = detect_register_size( chain );

    printf( _("%d\n"), irlen );

    if (irlen < 1) {
        printf( _("Error: Invalid IR length!\n") );
        return;
    }

    /* all 1 is BYPASS in all parts, so DR length gives number of parts */
    ir = register_fill( register_alloc( irlen ), 1 );
    irz = register_duplicate( ir );

    if (!ir || !irz) {
        register_free( ir );
        register_free( irz );
        printf( _("Error: Out of memory!\n") );
        return;
    }

    for (;;) {
        int rs;

        jtag_reset( chain );

        tap_capture_ir( chain );
        tap_shift_register( chain, ir, NULL, 1 );

        printf( _("Detecting DR length for IR %s ... "), register_get_string( ir ) );
        fflush( stdout );

        tap_capture_dr( chain );
        rs = detect_register_size( chain );

        printf( _("%d\n"), rs );

        register_inc( ir );
        if (register_compare( ir, irz ) == 0)
            break;
    }
    register_free( ir );
    register_free( irz );
}
コード例 #3
0
ファイル: chain.c プロジェクト: tbnobody/usbprog
void
chain_shift_instructions( chain_t *chain )
{
    int i;
    parts_t *ps;

    if (!chain || !chain->parts)
        return;

    ps = chain->parts;

    for (i = 0; i < ps->len; i++) {
        if (ps->parts[i]->active_instruction == NULL) {
            printf( _("%s(%d) Part %d without active instruction\n"), __FILE__, __LINE__, i );
            return;
        }
    }

    tap_capture_ir( chain );
    for (i = 0; i < ps->len; i++)
        tap_shift_register( chain, ps->parts[i]->active_instruction->value, NULL, (i + 1) == ps->len );
}
コード例 #4
0
ファイル: discovery.c プロジェクト: dihmuzikien/ECE473
int
detect_register_size( chain_t *chain )
{
    int len;
    tap_register *rz;
    tap_register *rout;
    tap_register *rpat;

    /* This seems to be a good place to check if TDO changes at all */
    int tdo, tdo_stuck = -2;

    for (len = 1; len <= MAX_REGISTER_LENGTH; len++) {
        int p;
        int ok = 0;

        rz = register_fill( register_alloc( len ), 0 );
        rout = register_alloc( DETECT_PATTERN_SIZE + len );
        rpat = register_inc( register_fill( register_alloc( DETECT_PATTERN_SIZE + len ), 0 ) );

        for (p = 1; p < (1 << DETECT_PATTERN_SIZE); p++) {
            int i;
            const char *s;
            ok = 0;

            s = register_get_string( rpat );
            while (*s)
                s++;

            for (i = 0; i < TEST_COUNT; i++) {
                tap_shift_register( chain, rz, NULL, 0 );
                tap_shift_register( chain, rpat, rout, 0 );

#ifdef VERY_LOW_LEVEL_DEBUG
                printf(">>> %s\n", register_get_string(rz));
                printf("  + %s\n", register_get_string(rpat));
#endif
                tdo = register_all_bits_same_value(rout);
                if(tdo_stuck == -2) tdo_stuck = tdo;
                if(tdo_stuck != tdo) tdo_stuck = -1;

                register_shift_right( rout, len );
                if (register_compare( rpat, rout ) == 0)
                    ok++;
#ifdef VERY_LOW_LEVEL_DEBUG
                printf("  = %s => %d\n", register_get_string(rout), ok);
#endif
            }
            if (100 * ok / TEST_COUNT < TEST_THRESHOLD) {
                ok = 0;
                break;
            }

            register_inc( rpat );
        }

        register_free( rz );
        register_free( rout );
        register_free( rpat );

        if (ok)
            return len;
    }

    if(tdo_stuck >= 0)
    {
        printf(_("Warning: TDO seems to be stuck at %d\n"), tdo_stuck);
    }

    return -1;
}