예제 #1
0
int nios_legacy_vctcxo_trim_dac_write(struct bladerf *dev, uint16_t value)
{
    int status;
    struct uart_cmd cmd;
    int base;

    /* FPGA v0.0.4 introduced a change to the location of the DAC registers */
    const bool legacy_location = !have_cap(dev, BLADERF_CAP_UPDATED_DAC_ADDR);

    base = legacy_location ? 0 : 34;

    cmd.addr = base;
    cmd.data = value & 0xff;
    status = nios_access(dev,
                         legacy_location ?
                            NIOS_PKT_LEGACY_DEV_VCTCXO :
                            NIOS_PKT_LEGACY_DEV_CONFIG,
                         USB_DIR_HOST_TO_DEVICE, &cmd, 1);

    if (status < 0) {
        return status;
    }

    cmd.addr = base + 1;
    cmd.data = (value >> 8) & 0xff;
    status = nios_access(dev,
                         legacy_location ?
                            NIOS_PKT_LEGACY_DEV_VCTCXO :
                            NIOS_PKT_LEGACY_DEV_CONFIG,
                         USB_DIR_HOST_TO_DEVICE, &cmd, 1);

    return status;
}
예제 #2
0
int nios_legacy_get_timestamp(struct bladerf *dev, bladerf_module mod,
                              uint64_t *value)
{
    int status = 0;
    struct uart_cmd cmds[4];
    uint8_t timestamp_bytes[8];
    size_t i;

    /* Offset 16 is the time tamer according to the Nios firmware */
    cmds[0].addr = (mod == BLADERF_MODULE_RX ? 16 : 24);
    cmds[1].addr = (mod == BLADERF_MODULE_RX ? 17 : 25);
    cmds[2].addr = (mod == BLADERF_MODULE_RX ? 18 : 26);
    cmds[3].addr = (mod == BLADERF_MODULE_RX ? 19 : 27);
    cmds[0].data = cmds[1].data = cmds[2].data = cmds[3].data = 0xff;

    status = nios_access(dev,
                         NIOS_PKT_LEGACY_DEV_CONFIG,
                         USB_DIR_DEVICE_TO_HOST,
                         cmds, ARRAY_SIZE(cmds));
    if (status != 0) {
        return status;
    } else {
        for (i = 0; i < 4; i++) {
            timestamp_bytes[i] = cmds[i].data;
        }
    }

    cmds[0].addr = (mod == BLADERF_MODULE_RX ? 20 : 28);
    cmds[1].addr = (mod == BLADERF_MODULE_RX ? 21 : 29);
    cmds[2].addr = (mod == BLADERF_MODULE_RX ? 22 : 30);
    cmds[3].addr = (mod == BLADERF_MODULE_RX ? 23 : 31);
    cmds[0].data = cmds[1].data = cmds[2].data = cmds[3].data = 0xff;

    status = nios_access(dev,
                         NIOS_PKT_LEGACY_DEV_CONFIG,
                         USB_DIR_DEVICE_TO_HOST,
                         cmds, ARRAY_SIZE(cmds));

    if (status) {
        return status;
    } else {
        for (i = 0; i < 4; i++) {
            timestamp_bytes[i + 4] = cmds[i].data;
        }
    }

    memcpy(value, timestamp_bytes, sizeof(*value));
    *value = LE64_TO_HOST(*value);

    return 0;
}
예제 #3
0
static int nios_32x32_masked_read(struct bladerf *dev, uint8_t id,
                                  uint32_t mask, uint32_t *val)
{
    int status;
    bool success;
    uint8_t buf[NIOS_PKT_LEN];

    /* The address is used as a mask of bits to read and return */
    nios_pkt_32x32_pack(buf, id, false, mask, 0);

    status = nios_access(dev, buf);
    if (status != 0) {
        return status;
    }

    nios_pkt_32x32_resp_unpack(buf, NULL, NULL, NULL, val, &success);

    if (success) {
        return 0;
    } else {
        *val = 0;
        log_debug("%s: response packet reported failure.\n", __FUNCTION__);
        return BLADERF_ERR_FPGA_OP;
    }
}
예제 #4
0
int nios_8x16_read(struct bladerf *dev, uint8_t id,
                   uint8_t addr, uint16_t *data)
{
    int status;
    uint8_t buf[NIOS_PKT_LEN];
    bool success;
    uint16_t tmp;

    nios_pkt_8x16_pack(buf, id, false, addr, 0);

    status = nios_access(dev, buf);
    if (status != 0) {
        return status;
    }

    nios_pkt_8x16_resp_unpack(buf, NULL, NULL, NULL, &tmp, &success);

    if (success) {
        *data = tmp;
        return 0;
    } else {
        *data = 0;
        log_debug("%s: response packet reported failure.\n", __FUNCTION__);
        return BLADERF_ERR_FPGA_OP;
    }
}
예제 #5
0
int nios_legacy_pio_read(struct bladerf *dev, uint8_t addr, uint32_t *data)
{
    int status;
    size_t i;
    struct uart_cmd cmd;

    *data = 0;

    for (i = 0; i < sizeof(*data); i++) {
        assert((addr + i) <= UINT8_MAX);
        cmd.addr = (uint8_t)(addr + i);
        cmd.data = 0xff;

        status = nios_access(dev, NIOS_PKT_LEGACY_DEV_CONFIG,
                             USB_DIR_DEVICE_TO_HOST, &cmd, 1);

        if (status < 0) {
            *data = 0;
            return status;
        }

        *data |= (cmd.data << (i * 8));
    }

    return 0;
}
예제 #6
0
int nios_legacy_si5338_write(struct bladerf *dev, uint8_t addr, uint8_t data)
{
    struct uart_cmd cmd;

    cmd.addr = addr;
    cmd.data = data;

    log_verbose( "%s: 0x%2.2x 0x%2.2x\n", __FUNCTION__, addr, data );

    return nios_access(dev, NIOS_PKT_LEGACY_DEV_SI5338,
                       USB_DIR_HOST_TO_DEVICE, &cmd, 1);
}
예제 #7
0
int nios_legacy_lms6_write(struct bladerf *dev, uint8_t addr, uint8_t data)
{
    int status;
    struct uart_cmd cmd;

    cmd.addr = addr;
    cmd.data = data;

    log_verbose( "%s: 0x%2.2x 0x%2.2x\n", __FUNCTION__, addr, data );

    status = nios_access(dev, NIOS_PKT_LEGACY_DEV_LMS,
                         USB_DIR_HOST_TO_DEVICE, &cmd, 1);

    return status;
}
예제 #8
0
static int set_iq_correction(struct bladerf *dev, uint8_t addr, int16_t value)
{
    int i;
    int status;
    struct uart_cmd cmd;

    for (i = status = 0; status == 0 && i < 2; i++) {
        cmd.addr = i + addr;

        cmd.data = (value >> (i * 8)) & 0xff;
        status = nios_access(dev, NIOS_PKT_LEGACY_DEV_CONFIG,
                             USB_DIR_HOST_TO_DEVICE, &cmd, 1);
    }

    return status;
}
예제 #9
0
int nios_legacy_lms6_read(struct bladerf *dev, uint8_t addr, uint8_t *data)
{
    int status;
    struct uart_cmd cmd;

    cmd.addr = addr;
    cmd.data = 0xff;

    status = nios_access(dev, NIOS_PKT_LEGACY_DEV_LMS,
                         USB_DIR_DEVICE_TO_HOST, &cmd, 1);

    if (status == 0) {
        *data = cmd.data;
        log_verbose( "%s: 0x%2.2x 0x%2.2x\n", __FUNCTION__, addr, *data );
    }

    return status;
}
예제 #10
0
int nios_legacy_get_fpga_version(struct bladerf *dev,
                                 struct bladerf_version *ver)
{
    int i, status;
    struct uart_cmd cmd;

    for (i = 0; i < 4; i++) {
        cmd.addr = NIOS_PKT_LEGACY_DEV_FPGA_VERSION_ID + i;
        cmd.data = 0xff;

        status = nios_access(dev, NIOS_PKT_LEGACY_DEV_CONFIG,
                             USB_DIR_DEVICE_TO_HOST, &cmd, 1);

        if (status != 0) {
            memset(&dev->fpga_version, 0, sizeof(dev->fpga_version));
            log_debug("Failed to read FPGA version[%d]: %s\n", i,
                      bladerf_strerror(status));

            return status;
        }

        switch (i) {
            case 0:
                ver->major = cmd.data;
                break;
            case 1:
                ver->minor = cmd.data;
                break;
            case 2:
                ver->patch = cmd.data;
                break;
            case 3:
                ver->patch |= (cmd.data << 8);
                break;
            default:
                assert(!"Bug");
        }
    }

    snprintf((char*)ver->describe, BLADERF_VERSION_STR_MAX,
             "%d.%d.%d", ver->major, ver->minor, ver->patch);

    return status;
}
예제 #11
0
int nios_legacy_pio_write(struct bladerf *dev, uint8_t addr, uint32_t data)
{
    int status;
    size_t i;
    struct uart_cmd cmd;

    for (i = 0; i < sizeof(data); i++) {
        assert((addr + i) <= UINT8_MAX);
        cmd.addr = (uint8_t)(addr + i);
        cmd.data = (data >> (i * 8)) & 0xff;

        status = nios_access(dev, NIOS_PKT_LEGACY_DEV_CONFIG,
                             USB_DIR_HOST_TO_DEVICE, &cmd, 1);

        if (status < 0) {
            return status;
        }
    }

    return 0;
}
예제 #12
0
int nios_8x8_write(struct bladerf *dev, uint8_t id, uint8_t addr, uint8_t data)
{
    int status;
    uint8_t buf[NIOS_PKT_LEN];
    bool success;

    nios_pkt_8x8_pack(buf, id, true, addr, data);

    status = nios_access(dev, buf);
    if (status != 0) {
        return status;
    }

    nios_pkt_8x8_resp_unpack(buf, NULL, NULL, NULL, NULL, &success);

    if (success) {
        return 0;
    } else {
        log_debug("%s: response packet reported failure.\n", __FUNCTION__);
        return BLADERF_ERR_FPGA_OP;
    }
}