/* 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], ×tamp, 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; }
/* * 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++; } } } }