mirror of
https://github.com/steve-m/hsdaoh.git
synced 2025-12-10 07:44:41 +01:00
lib: add support for dual 12 bit FPGA source
This commit is contained in:
parent
ff55b5acc6
commit
dccfb3a5f2
3 changed files with 47 additions and 8 deletions
|
|
@ -108,6 +108,27 @@ enum
|
|||
PIO_32BIT_IQ,
|
||||
PIO_PCM1802_AUDIO,
|
||||
// Placeholder for internal ADC data from pico
|
||||
FPGA_1BIT = 256,
|
||||
FPGA_2BIT,
|
||||
FPGA_3BIT,
|
||||
FPGA_4BIT,
|
||||
FPGA_5BIT,
|
||||
FPGA_6BIT,
|
||||
FPGA_7BIT,
|
||||
FPGA_8BIT,
|
||||
FPGA_8BIT_DUAL,
|
||||
FPGA_8BIT_DDR,
|
||||
FPGA_8BIT_IQ,
|
||||
FPGA_9BIT,
|
||||
FPGA_10BIT,
|
||||
FPGA_10BIT_DUAL,
|
||||
FPGA_10BIT_DDR,
|
||||
FPGA_10BIT_IQ,
|
||||
FPGA_11BIT,
|
||||
FPGA_12BIT,
|
||||
FPGA_12BIT_DUAL,
|
||||
FPGA_12BIT_DDR,
|
||||
FPGA_12BIT_IQ,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ void hsdaoh_unpack_fpga_12bit_dual(hsdaoh_dev_t *dev, hsdaoh_data_info_t *data_i
|
|||
{
|
||||
uint16_t *in = (uint16_t *)data_info->buf;
|
||||
size_t inlen = data_info->len / sizeof(uint16_t);
|
||||
unsigned int i, j = 0;
|
||||
unsigned int j = 0;
|
||||
uint16_t *out16_1 = malloc(sizeof(uint16_t) * inlen * 2);
|
||||
uint16_t *out16_2 = malloc(sizeof(uint16_t) * inlen * 2);
|
||||
|
||||
|
|
@ -236,7 +236,7 @@ void hsdaoh_unpack_fpga_12bit_dual(hsdaoh_dev_t *dev, hsdaoh_data_info_t *data_i
|
|||
return;
|
||||
|
||||
/* extract packed 2x12 bit samples */
|
||||
for (i = 0; i < inlen; i += 3) {
|
||||
for (unsigned int i = 0; i < inlen; i += 3) {
|
||||
uint16_t lsbs = in[i+2];
|
||||
out16_1[j] = ((in[i+0] & 0xff00) >> 4) | ((lsbs >> 0) & 0xf);
|
||||
out16_2[j++] = ((in[i+0] & 0x00ff) << 4) | ((lsbs >> 4) & 0xf);
|
||||
|
|
@ -245,10 +245,10 @@ void hsdaoh_unpack_fpga_12bit_dual(hsdaoh_dev_t *dev, hsdaoh_data_info_t *data_i
|
|||
}
|
||||
|
||||
if (dev->output_float) {
|
||||
hsdaoh_16bit_to_float(dev, data_info, out16_1, i, 2047.5, true);
|
||||
hsdaoh_16bit_to_float(dev, data_info, out16_1, j, 2047.5, true);
|
||||
} else {
|
||||
data_info->buf = (uint8_t *)out16_1;
|
||||
data_info->len = i * sizeof(uint16_t);
|
||||
data_info->len = j * sizeof(uint16_t);
|
||||
|
||||
dev->cb(data_info);
|
||||
}
|
||||
|
|
@ -256,10 +256,10 @@ void hsdaoh_unpack_fpga_12bit_dual(hsdaoh_dev_t *dev, hsdaoh_data_info_t *data_i
|
|||
data_info->stream_id += 1;
|
||||
|
||||
if (dev->output_float) {
|
||||
hsdaoh_16bit_to_float(dev, data_info, out16_2, i, 2047.5, true);
|
||||
hsdaoh_16bit_to_float(dev, data_info, out16_2, j, 2047.5, true);
|
||||
} else {
|
||||
data_info->buf = (uint8_t *)out16_2;
|
||||
data_info->len = i * sizeof(uint16_t);
|
||||
data_info->len = j * sizeof(uint16_t);
|
||||
|
||||
dev->cb(data_info);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -72,6 +72,16 @@ enum crc_config {
|
|||
CRC16_2_LINE /* Line contains CRC of the line before the last line */
|
||||
};
|
||||
|
||||
#define DEFAULT_MAX_STREAMS 8
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint64_t data_cnt;
|
||||
uint32_t srate;
|
||||
uint32_t reserved1;
|
||||
char reserved2[16];
|
||||
} __attribute__((packed, aligned(1))) stream_info_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32_t magic;
|
||||
|
|
@ -80,6 +90,10 @@ typedef struct
|
|||
uint8_t crc_config;
|
||||
uint16_t version;
|
||||
uint32_t flags;
|
||||
uint32_t reserved2[8];
|
||||
uint16_t stream0_format;
|
||||
uint16_t max_streamid;
|
||||
stream_info_t stream_info[DEFAULT_MAX_STREAMS];
|
||||
} __attribute__((packed, aligned(1))) metadata_t;
|
||||
|
||||
#define FLAG_STREAM_ID_PRESENT (1 << 0)
|
||||
|
|
@ -552,6 +566,9 @@ void hsdaoh_output(hsdaoh_dev_t *dev, uint16_t sid, int format, uint8_t *data, s
|
|||
case PIO_PCM1802_AUDIO:
|
||||
hsdaoh_unpack_pio_pcm1802_audio(dev, &data_info);
|
||||
break;
|
||||
case FPGA_12BIT_DUAL:
|
||||
hsdaoh_unpack_fpga_12bit_dual(dev, &data_info);
|
||||
break;
|
||||
default:
|
||||
dev->cb(&data_info);
|
||||
break;
|
||||
|
|
@ -587,7 +604,6 @@ static void *hsdaoh_output_worker(void *arg)
|
|||
pthread_mutex_unlock(&dev->ll_mutex);
|
||||
|
||||
while (curelem != NULL) {
|
||||
// printf("got a buffer for sid %d with len %d\n", curelem->sid, bytesleft);
|
||||
hsdaoh_output(dev, curelem->sid, curelem->format, curelem->data, curelem->len);
|
||||
|
||||
prev = curelem;
|
||||
|
|
@ -716,8 +732,10 @@ void hsdaoh_process_frame(hsdaoh_dev_t *dev, uint8_t *data, int size)
|
|||
|
||||
if (meta.flags & FLAG_STREAM_ID_PRESENT)
|
||||
stream_id &= 0x3f;
|
||||
else
|
||||
else {
|
||||
stream_id = 0;
|
||||
format = meta.stream0_format;
|
||||
}
|
||||
|
||||
/* we only use 12 bits, the upper 4 bits are reserved for the metadata */
|
||||
payload_len &= 0x0fff;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue