From 19eea5d42d8d143c509b82e40ea75e2778efbc94 Mon Sep 17 00:00:00 2001 From: rjkm Date: Mon, 9 Aug 2021 09:03:02 +0200 Subject: [PATCH] add getiq to get IQ values from MCI cards --- apps/Makefile | 2 +- apps/getiq.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 apps/getiq.c diff --git a/apps/Makefile b/apps/Makefile index 16860c0..7962616 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,4 +1,4 @@ -all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo +all: cit citin flashprog modt ddtest setmod ddflash setmod2 pls setmod3 modconfig ddinfo getiq cit: cit.c $(CC) -o cit cit.c -lpthread diff --git a/apps/getiq.c b/apps/getiq.c new file mode 100644 index 0000000..59c8734 --- /dev/null +++ b/apps/getiq.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef int16_t s16; +typedef uint32_t u32; +typedef uint64_t u64; + +#include "../ddbridge/ddbridge-mci.h" +#include "../ddbridge/ddbridge-ioctl.h" + +void print_iq(struct mci_result *res, int fd) +{ + dprintf(fd, "%d,%d\n", res->iq_symbol.i, res->iq_symbol.q); +} + +int get_iq(int dev, uint32_t link, uint8_t demod, int fd) +{ + struct ddb_mci_msg msg = { + .link = link, + .cmd.command = MCI_CMD_GET_IQSYMBOL, + .cmd.demod = demod, + .cmd.get_iq_symbol.tap = 0, + .cmd.get_iq_symbol.point = 0, + }; + int ret; + int i; + + ret = ioctl(dev, IOCTL_DDB_MCI_CMD, &msg); + if (ret < 0) { + printf("Error: %d %d\n", ret, errno); + return ret; + } + if (msg.res.status & 0x80) { + printf("MCI errror %02x\n", msg.res.status); + return ret; + } + + print_iq(&msg.res, fd); + return ret; +} + + +#define SIZE_OF_ARRAY(a) (sizeof(a)/sizeof(a[0])) + +int main(int argc, char*argv[]) +{ + char ddbname[80]; + int fd = -1, all = 1, i, ret = 0, ddb; + char fn[128]; + int32_t device = -1, demod = -1; + + while (1) { + int cur_optind = optind ? optind : 1; + int option_index = 0; + int c; + static struct option long_options[] = { + {"device", required_argument, 0, 'd'}, + {"demod", required_argument, 0, 'n'}, + {0, 0, 0, 0} + }; + c = getopt_long(argc, argv, "ad:n:", + long_options, &option_index); + if (c == -1) + break; + switch (c) { + case 'd': + device = strtoul(optarg, NULL, 0); + break; + case 'n': + demod = strtoul(optarg, NULL, 0); + break; + case 'a': + all = 1; + break; + default: + break; + } + } + if (optind < argc) { + printf("too many arguments\n"); + exit(1); + } + sprintf(ddbname, "/dev/ddbridge/card%d", device); + ddb = open(ddbname, O_RDWR); + if (ddb < 0) + return -3; + for (i = 0; i < 20000; i++) + get_iq(ddb, 0, demod, 1); +}