lib: implement enabling RGB332 mode

I've decided to provide a separate pointer for a raw buffer in case the
library user comes up with a non-RGB332 use case that avoids byte
rearrangement (and copying should be replaced with pulling from the
user's pointer in this case)
This commit is contained in:
Sergey Alirzaev 2020-05-16 03:28:28 +03:00 committed by Steve Markgraf
parent f05c961455
commit b82303f44f
2 changed files with 28 additions and 7 deletions

View File

@ -54,6 +54,7 @@ typedef struct fl2k_data_info {
char *r_buf; /* pointer to red buffer */
char *g_buf; /* pointer to green buffer */
char *b_buf; /* pointer to blue buffer */
char *raw_buf; /* pointer to pre-arranged buffer */
} fl2k_data_info_t;
typedef struct fl2k_dev fl2k_dev_t;
@ -89,6 +90,14 @@ FL2K_API int fl2k_close(fl2k_dev_t *dev);
*/
FL2K_API int fl2k_set_sample_rate(fl2k_dev_t *dev, uint32_t target_freq);
/*!
* Set RGB332 sample format
*
* \param dev the device handle given by fl2k_open()
* \return 0 on success
*/
FL2K_API int fl2k_set_rgb332(fl2k_dev_t *dev);
/*!
* Get actual sample rate the device is configured to.
*

View File

@ -204,6 +204,13 @@ int fl2k_deinit_device(fl2k_dev_t *dev)
return r;
}
int fl2k_set_rgb332(fl2k_dev_t *dev)
{
uint32_t reg;
fl2k_read_reg(dev, 0x8004, &reg);
return fl2k_write_reg(dev, 0x8004, reg | (1 << 25));
}
static double fl2k_reg_to_freq(uint32_t reg)
{
double sample_clock, offset, offs_div;
@ -910,15 +917,20 @@ static void *fl2k_sample_worker(void *arg)
xfer_info = (fl2k_xfer_info_t *)xfer->user_data;
out_buf = (char *)xfer->buffer;
/* Re-arrange and copy bytes in buffer for DACs */
fl2k_convert_r(out_buf, data_info.r_buf, dev->xfer_buf_len,
data_info.sampletype_signed ? 128 : 0);
if (data_info.raw_buf) {
/* Shove a pre-arranged buffer into the DACs */
memcpy(out_buf, data_info.raw_buf, dev->xfer_buf_len);
} else {
/* Re-arrange and copy bytes in buffer for DACs */
fl2k_convert_r(out_buf, data_info.r_buf, dev->xfer_buf_len,
data_info.sampletype_signed ? 128 : 0);
fl2k_convert_g(out_buf, data_info.g_buf, dev->xfer_buf_len,
data_info.sampletype_signed ? 128 : 0);
fl2k_convert_g(out_buf, data_info.g_buf, dev->xfer_buf_len,
data_info.sampletype_signed ? 128 : 0);
fl2k_convert_b(out_buf, data_info.b_buf, dev->xfer_buf_len,
data_info.sampletype_signed ? 128 : 0);
fl2k_convert_b(out_buf, data_info.b_buf, dev->xfer_buf_len,
data_info.sampletype_signed ? 128 : 0);
}
xfer_info->seq = buf_cnt++;
xfer_info->state = BUF_FILLED;