Пример #1
0
/* Serialize image contents and fill in checksum */
static size_t pack_image(struct bladerf_image *img, uint8_t *buf)
{
    size_t i = 0;
    uint16_t ver_field;
    uint32_t type, len, addr;
    uint64_t timestamp;
    char checksum[BLADERF_IMAGE_CHECKSUM_LEN];

    memcpy(&buf[i], img->magic, BLADERF_IMAGE_MAGIC_LEN);
    i += BLADERF_IMAGE_MAGIC_LEN;

    memset(&buf[i], 0, BLADERF_IMAGE_CHECKSUM_LEN);
    i += BLADERF_IMAGE_CHECKSUM_LEN;

    ver_field = HOST_TO_BE16(img->version.major);
    memcpy(&buf[i], &ver_field, sizeof(ver_field));
    i += sizeof(ver_field);

    ver_field = HOST_TO_BE16(img->version.minor);
    memcpy(&buf[i], &ver_field, sizeof(ver_field));
    i += sizeof(ver_field);

    ver_field = HOST_TO_BE16(img->version.patch);
    memcpy(&buf[i], &ver_field, sizeof(ver_field));
    i += sizeof(ver_field);

    timestamp = HOST_TO_BE64(img->timestamp);
    memcpy(&buf[i], &timestamp, sizeof(timestamp));
    i += sizeof(timestamp);

    memcpy(&buf[i], &img->serial, BLADERF_SERIAL_LENGTH);
    i += BLADERF_SERIAL_LENGTH;

    memset(&buf[i], 0, BLADERF_IMAGE_RESERVED_LEN);
    i += BLADERF_IMAGE_RESERVED_LEN;

    type = HOST_TO_BE32((uint32_t)img->type);
    memcpy(&buf[i], &type, sizeof(type));
    i += sizeof(type);

    addr = HOST_TO_BE32(img->address);
    memcpy(&buf[i], &addr, sizeof(addr));
    i += sizeof(addr);

    len = HOST_TO_BE32(img->length);
    memcpy(&buf[i], &len, sizeof(len));
    i += sizeof(len);

    memcpy(&buf[i], img->data, img->length);
    i += img->length;

    sha256_buffer((const char *)buf, i, checksum);
    memcpy(&buf[BLADERF_IMAGE_MAGIC_LEN], checksum, BLADERF_IMAGE_CHECKSUM_LEN);

    return i;
}
Пример #2
0
/*
 * n    - # samples
 * fmt  - binle or binbe
 * in   - Is this data being TX'd (RX'd assumed otherwise)
 */
static void c16_sample_fixup(int16_t *buff, size_t n,
                                enum rxtx_fmt fmt, bool tx)
{
    size_t i;

    /* For each sample, we need to:
     *  (1) Convert to appropriate endianness
     *  (2, RX only) Mask and sign-extend.
     *      FIXME  this will soon be done in libbladeRF
     *
     *  The 4 permutations are unrolled here intentionally, to keep
     *  the amount of massaging on these samples to a minimum...
     */

    if (tx) {
        if (fmt == RXTX_FMT_BINLE_C16) {
            for (i = 0; i < n; i++) {
                /* I - Correct sign extension is assumed */
                *buff = (HOST_TO_LE16(*buff) & 0x0fff);
                buff++;

                /* Q - Correct sign extention is assumed*/
                *buff = (HOST_TO_LE16(*buff) & 0x0fff);
                buff++;
            }
        } else {
            for (i = 0; i < n; i++) {
                /* I - Correct sign extension is assumed */
                *buff = (HOST_TO_BE16(*buff) & 0x0fff);
                buff++;

                /* Q - Correct sign extention is assumed*/
                *buff = (HOST_TO_BE16(*buff) & 0x0fff);
                buff++;
            }
        }
    } else {
        if (fmt == RXTX_FMT_CSV_C16) {
            fmt = RXTX_FMT_BINHOST_C16;
        }

        if (fmt == RXTX_FMT_BINLE_C16) {
            for (i = 0; i < n; i++) {
                /* I - Mask off the marker and sign extend */
                *buff = HOST_TO_LE16(*buff) & 0x0fff;
                if (*buff & 0x800) {
                    *buff |= 0xf000;
                }
                buff++;

                /* Q - Mask off the marker and sign extend */
                *buff = HOST_TO_LE16(*buff) & 0x0fff;
                if (*buff & 0x800) {
                    *buff |= 0xf000;
                }
                buff++;

            }
        } else {
            for (i = 0; i < n; i++) {
                /* I - Mask off the marker and sign extend */
                *buff = HOST_TO_BE16(*buff) & 0x0fff;
                if (*buff & 0x800) {
                    *buff |= 0xf000;
                }
                buff++;

                /* Q - Mask off the marker and sign extend */
                *buff = HOST_TO_BE16(*buff) & 0x0fff;
                if (*buff & 0x800) {
                    *buff |= 0xf000;
                }
                buff++;
            }
        }
    }
}