Beispiel #1
0
static int
cmd_salias_run (urj_chain_t *chain, char *params[])
{
    urj_part_t *part;
    urj_part_signal_t *s;
    urj_part_salias_t *sa;

    if (urj_cmd_params (params) != 3)
    {
        urj_error_set (URJ_ERROR_SYNTAX,
                       "%s: #parameters should be %d, not %d",
                       params[0], 3, urj_cmd_params (params));
        return URJ_STATUS_FAIL;
    }

    if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
        return URJ_STATUS_FAIL;

    part = urj_tap_chain_active_part (chain);
    if (part == NULL)
        return URJ_STATUS_FAIL;

    if (urj_part_find_signal (part, params[1]) != NULL)
    {
        return URJ_STATUS_FAIL;
    }

    s = urj_part_find_signal (part, params[2]);
    if (s == NULL)
    {
        urj_error_set (URJ_ERROR_NOTFOUND, _("Signal '%s' not found"),
                       params[2]);
        return URJ_STATUS_FAIL;
    }

    sa = urj_part_salias_alloc (params[1], s);
    if (!sa)
        return URJ_STATUS_FAIL;

    sa->next = part->saliases;
    part->saliases = sa;

    return URJ_STATUS_OK;
}
Beispiel #2
0
static int
cmd_get_run (urj_chain_t *chain, char *params[])
{
    int data;
    urj_part_signal_t *s;
    urj_part_t *part;

    if (urj_cmd_params (params) != 3)
    {
        urj_error_set (URJ_ERROR_SYNTAX,
                       "%s: #parameters should be %d, not %d",
                       params[0], 3, urj_cmd_params (params));
        return URJ_STATUS_FAIL;
    }

    if (strcasecmp (params[1], "signal") != 0)
    {
        urj_error_set (URJ_ERROR_SYNTAX,
                       "params[1] must be 'signal', not '%s'", params[1]);
        return URJ_STATUS_FAIL;
    }

    if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
        return URJ_STATUS_FAIL;

    part = urj_tap_chain_active_part (chain);
    if (part == NULL)
        return URJ_STATUS_FAIL;

    s = urj_part_find_signal (part, params[2]);
    if (!s)
    {
        urj_error_set (URJ_ERROR_NOTFOUND, _("signal '%s' not found"),
                       params[2]);
        return URJ_STATUS_FAIL;
    }
    data = urj_part_get_signal (part, s);
    if (data == -1)
        return URJ_STATUS_FAIL;

    urj_log (URJ_LOG_LEVEL_NORMAL, _("%s = %d\n"), params[2], data);

    return URJ_STATUS_OK;
}
Beispiel #3
0
urj_part_signal_t *
urj_part_signal_define_pin (urj_chain_t *chain, const char *signal_name,
                            const char *pin_name)
{
    urj_part_t *part;
    urj_part_signal_t *s;

    part = urj_tap_chain_active_part (chain);

    if (urj_part_find_signal (part, signal_name) != NULL)
    {
        urj_error_set (URJ_ERROR_ALREADY,
                       _("Signal '%s' already defined"), signal_name);
        return NULL;
    }

    s = urj_part_signal_alloc (signal_name);
    if (!s)
        return NULL;

    if (pin_name != NULL)
    {                           /* Add pin number */
        /* Allocate the space for the pin number & copy it */
        s->pin = strdup (pin_name);
        if (s->pin == NULL)
        {
            urj_part_signal_free (s);
            urj_error_set (URJ_ERROR_OUT_OF_MEMORY, "strdup(%s) fails",
                           pin_name);
            return NULL;
        }
    }

    s->next = part->signals;
    part->signals = s;

    return s;
}
Beispiel #4
0
/**
 * bus->driver->(*new_bus)
 *
 */
static urj_bus_t *
prototype_bus_new (urj_chain_t *chain, const urj_bus_driver_t *driver,
                   const urj_param_t *cmd_params[])
{
    urj_bus_t *bus;
    urj_part_signal_t *sig;
    char buff[16], fmt[16], afmt[16], dfmt[16];
    int i, j, inst, max, min;
    int failed = 0;
    int ashift = -1;
    const char *value;

    bus = urj_bus_generic_new (chain, driver, sizeof (bus_params_t));
    if (bus == NULL)
        return NULL;

    CS = OE = WE = NULL;
    ALSBI = AMSBI = DLSBI = DMSBI = -1;
    for (i = 0; cmd_params[i] != NULL; i++)
    {
        if (cmd_params[i]->key == URJ_BUS_PARAM_KEY_AMODE ||
            cmd_params[i]->key == URJ_BUS_PARAM_KEY_WIDTH)
        {
            switch (cmd_params[i]->value.lu)
            {
            case 8:
                ashift = 0;
                break;
            case 16:
                ashift = 1;
                break;
            case 32:
                ashift = 2;
                break;
            case 0:     // "auto"
                break;

            default:
                urj_error_set (URJ_ERROR_INVALID,
                               _("value %lu not defined for parameter %s"),
                               cmd_params[i]->value.lu,
                               urj_param_string(&urj_bus_param_list,
                                                cmd_params[i]));
                failed = 1;     // @@@@ RFHH
                break;
            }

        }
        else
        {
            if (cmd_params[i]->type != URJ_PARAM_TYPE_STRING)
            {
                urj_error_set (URJ_ERROR_SYNTAX,
                               "parameter must be of type string");
                failed = 1;
                continue;
            }

            value = cmd_params[i]->value.string;

            inst = 32;
            prototype_bus_signal_parse (value, fmt, &inst);
            // @@@@ RFHH Flag error?
            // @@@@ RFHH If it is mandatory for a signal to have an int inst
            // number, why does prototype_bus_signal_parse() accept values
            // without an int?
            if (inst > 31 || inst < 0)
                continue;

            sig = urj_part_find_signal (bus->part, value);
            if (!sig)
            {
                urj_error_set (URJ_ERROR_NOTFOUND, _("signal '%s' not found"),
                               value);
                failed = 1;
                continue;
            }

            switch (cmd_params[i]->key)
            {
            case URJ_BUS_PARAM_KEY_ALSB:
                ALSBI = inst;
                A[inst] = sig;
                strcpy (afmt, fmt);
                break;
            case URJ_BUS_PARAM_KEY_AMSB:
                AMSBI = inst;
                A[inst] = sig;
                strcpy (afmt, fmt);
                break;
            case URJ_BUS_PARAM_KEY_DLSB:
                DLSBI = inst;
                D[inst] = sig;
                strcpy (dfmt, fmt);
                break;
            case URJ_BUS_PARAM_KEY_DMSB:
                DMSBI = inst;
                D[inst] = sig;
                strcpy (dfmt, fmt);
                break;
            case URJ_BUS_PARAM_KEY_CS:
            case URJ_BUS_PARAM_KEY_NCS:
                CS = sig;
                CSA = (cmd_params[i]->key == URJ_BUS_PARAM_KEY_CS);
                break;
            case URJ_BUS_PARAM_KEY_OE:
            case URJ_BUS_PARAM_KEY_NOE:
                OE = sig;
                OEA = (cmd_params[i]->key == URJ_BUS_PARAM_KEY_OE);
                break;
            case URJ_BUS_PARAM_KEY_WE:
            case URJ_BUS_PARAM_KEY_NWE:
                WE = sig;
                WEA = (cmd_params[i]->key == URJ_BUS_PARAM_KEY_WE);
                break;
            default:
                urj_error_set (URJ_ERROR_INVALID, _("parameter %s is unknown"),
                               urj_param_string(&urj_bus_param_list,
                                                cmd_params[i]));
                failed = 1;
                break;
            }
        }
    }

    if (ALSBI >= 0 || AMSBI >= 0)
    {
        if (ALSBI == -1 || AMSBI == -1)
        {
            for (min = 0; min <= 31; min++)
            {
                sprintf (buff, afmt, min);
                A[min] = urj_part_find_signal (bus->part, buff);
                if (A[min])
                    break;
            }
            for (max = 31; max >= 0; max--)
            {
                sprintf (buff, afmt, max);
                A[max] = urj_part_find_signal (bus->part, buff);
                if (A[max])
                    break;
            }
            if (ALSBI == -1)
                ALSBI = (max - AMSBI < AMSBI - min) ? min : max;
            else
                AMSBI = (max - ALSBI < ALSBI - min) ? min : max;
        }
        AI = (AMSBI > ALSBI ? 1 : -1);
        AW = (AMSBI > ALSBI ? AMSBI - ALSBI : ALSBI - AMSBI) + 1;
        for (i = 0, j = ALSBI; i < AW; i++, j += AI)
        {
            sprintf (buff, afmt, j);
            // @@@@ RFHH check result
            A[j] = urj_part_find_signal (bus->part, buff);
        }
    }
    else
    {
        urj_error_set (URJ_ERROR_INVALID,
            _("parameters alsb=<signal> and/or amsb=<signal> are not defined"));
        failed = 1;
    }

    if (DLSBI >= 0 || DMSBI >= 0)
    {
        if (DLSBI == -1 || DMSBI == -1)
        {
            for (min = 0; min <= 31; min++)
            {
                sprintf (buff, dfmt, min);
                D[min] = urj_part_find_signal (bus->part, buff);
                if (D[min])
                    break;
            }
            for (max = 31; max >= 0; max--)
            {
                sprintf (buff, dfmt, max);
                D[max] = urj_part_find_signal (bus->part, buff);
                if (D[max])
                    break;
            }
            if (DLSBI == -1)
                DLSBI = (max - DMSBI < DMSBI - min) ? min : max;
            else
                DMSBI = (max - DLSBI < DLSBI - min) ? min : max;
        }
        DI = (DMSBI > DLSBI ? 1 : -1);
        DW = (DMSBI > DLSBI ? DMSBI - DLSBI : DLSBI - DMSBI) + 1;
        for (i = 0, j = DLSBI; i < DW; i++, j += DI)
        {
            sprintf (buff, dfmt, j);
            D[j] = urj_part_find_signal (bus->part, buff);
        }

        /* bus drivers are called with a byte address
           this address needs to be adjusted by setup_address() to the memory data width */
        if (ashift < 0)
        {
            int nbytes;

            /* parameter 'amode' wasn't specified, derive the address shift from the
               data bus width */
            nbytes = DW / 8;
            if (DW % 8 > 0)
                nbytes++;

            ashift = 0;
            while (nbytes != 1)
            {
                nbytes >>= 1;
                ashift++;
            }
        }
        ASHIFT = ashift;

    }
Beispiel #5
0
int
urj_part_bsbit_alloc_control (urj_part_t *part, int bit, const char *name,
                              int type, int safe,
                              int ctrl_num, int ctrl_val, int ctrl_state)
{
    urj_bsbit_t *b;
    urj_data_register_t *bsr;
    urj_part_signal_t *signal;

    bsr = urj_part_find_data_register (part, "BSR");
    if (bsr == NULL)
    {
        urj_error_set(URJ_ERROR_NOTFOUND,
                      _("missing Boundary Scan Register (BSR)"));
        return URJ_STATUS_FAIL;
    }

    if (bit >= bsr->in->len)
    {
        urj_error_set(URJ_ERROR_INVALID, _("invalid boundary bit number"));
        return URJ_STATUS_FAIL;
    }
    if (part->bsbits[bit] != NULL)
    {
        urj_error_set(URJ_ERROR_ALREADY, _("duplicate bit declaration"));
        return URJ_STATUS_FAIL;
    }
    if (ctrl_num != -1 && ctrl_num >= bsr->in->len)
    {
        urj_error_set(URJ_ERROR_INVALID, _("invalid control bit number"));
        return URJ_STATUS_FAIL;
    }

    signal = urj_part_find_signal (part, name);

    bsr->in->data[bit] = safe;

    b = malloc (sizeof *b);
    if (!b)
    {
        urj_error_set (URJ_ERROR_OUT_OF_MEMORY, "malloc(%zd) fails", sizeof *b);
        return URJ_STATUS_FAIL;
    }

    b->name = strdup (name);
    if (!b->name)
    {
        free (b);
        urj_error_set (URJ_ERROR_OUT_OF_MEMORY, "strdup(%s) fails", name);
        return URJ_STATUS_FAIL;
    }

    b->bit = bit;
    b->type = type;
    b->signal = signal;
    b->safe = (safe == 1);
    b->control = -1;

    part->bsbits[bit] = b;

    if (signal != NULL)
    {
        switch (type)
        {
        case URJ_BSBIT_INPUT:
            signal->input = b;
            break;
        case URJ_BSBIT_OUTPUT:
            signal->output = b;
            break;
        case URJ_BSBIT_BIDIR:
            signal->input = b;
            signal->output = b;
            break;
        }
    }

    if (ctrl_num != -1)
    {
        b->control = ctrl_num;
        b->control_value = ctrl_val;
        b->control_state = ctrl_state;
    }

    return URJ_STATUS_OK;
}
Beispiel #6
0
static int
cmd_set_run (urj_chain_t *chain, char *params[])
{
    int dir;
    long unsigned data = 0;
    urj_part_signal_t *s;
    urj_part_t *part;

    if (urj_cmd_params (params) < 4 || urj_cmd_params (params) > 5)
    {
        urj_error_set (URJ_ERROR_SYNTAX,
                       "%s: #parameters should be 4 or 5, not %d",
                       params[0], urj_cmd_params (params));
        return URJ_STATUS_FAIL;
    }

    if (strcasecmp (params[1], "signal") != 0)
    {
        urj_error_set (URJ_ERROR_SYNTAX,
                       "%s: second parameter must be '%s'",
                       params[0], params[1]);
        return URJ_STATUS_FAIL;
    }

    if (urj_cmd_test_cable (chain) != URJ_STATUS_OK)
        return URJ_STATUS_FAIL;

    part = urj_tap_chain_active_part (chain);
    if (part == NULL)
        return URJ_STATUS_FAIL;

    /* direction */
    if (strcasecmp (params[3], "in") != 0
        && strcasecmp (params[3], "out") != 0)
    {
        urj_error_set (URJ_ERROR_SYNTAX,
                       "%s: DIR parameter must be 'in' or 'out', not '%s'",
                       params[0], params[3]);
        return URJ_STATUS_FAIL;
    }

    dir = (strcasecmp (params[3], "in") == 0) ? 0 : 1;

    if (dir)
    {
        if (urj_cmd_get_number (params[4], &data) != URJ_STATUS_OK)
            return URJ_STATUS_FAIL;
        if (data > 1)
        {
            urj_error_set (URJ_ERROR_SYNTAX,
                           "%s: DATA parameter must be '0' or '1', not '%s'",
                           params[0], params[4]);
            return URJ_STATUS_FAIL;
        }
    }

    s = urj_part_find_signal (part, params[2]);
    if (!s)
    {
        urj_error_set (URJ_ERROR_NOTFOUND, _("signal '%s' not found"),
                       params[2]);
        return URJ_STATUS_FAIL;
    }

    return urj_part_set_signal (part, s, dir, data);
}