aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Alirzaev <zl29ah@gmail.com>2020-05-16 03:28:28 +0300
committerSteve Markgraf <steve@steve-m.de>2020-05-19 22:24:26 +0200
commitb82303f44fc8388817306235a673e0bfa671dd3f (patch)
treefdedc1bb6353e533d7823b56928a2274c6ea1c13
parentf05c961455f2c9aabce71ec3d9592199b07c47da (diff)
downloadosmo-fl2k-b82303f44fc8388817306235a673e0bfa671dd3f.tar.gz
osmo-fl2k-b82303f44fc8388817306235a673e0bfa671dd3f.tar.bz2
osmo-fl2k-b82303f44fc8388817306235a673e0bfa671dd3f.zip
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)
-rw-r--r--include/osmo-fl2k.h9
-rw-r--r--src/libosmo-fl2k.c26
2 files changed, 28 insertions, 7 deletions
diff --git a/include/osmo-fl2k.h b/include/osmo-fl2k.h
index 02ad4ad..7aafc24 100644
--- a/include/osmo-fl2k.h
+++ b/include/osmo-fl2k.h
@@ -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;
@@ -90,6 +91,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.
*
* \param dev the device handle given by fl2k_open()
diff --git a/src/libosmo-fl2k.c b/src/libosmo-fl2k.c
index 9ebe130..2ac371e 100644
--- a/src/libosmo-fl2k.c
+++ b/src/libosmo-fl2k.c
@@ -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;