#include #include #include #include #include #include #include static int ugen_ep1, ugen_ep3; #ifndef UGEN #define UGEN "ugen0" #endif int main(int argc, char *argv[]) { int chan, freq, i; uint8_t cmd[10], rpkt[188], wpkt[188]; if (argc != 2) return -1; chan = strtoul(argv[1], NULL, 10); if (chan < 13 || chan > 62) return -1; if ((ugen_ep1 = open("/dev/" UGEN ".01", O_RDWR, 0)) == -1) return -1; if ((ugen_ep3 = open("/dev/" UGEN ".03", O_RDONLY, 0)) == -1) return -1; memset(cmd, 0, sizeof(cmd)); cmd[0] = 0x21; write(ugen_ep1, cmd, sizeof(cmd)); cmd[0] = 0x9f; write(ugen_ep1, cmd, sizeof(cmd)); read(ugen_ep1, rpkt, 3); fprintf(stderr, "version: %d.%d.%d\n", rpkt[0], rpkt[1], rpkt[2]); cmd[0] = 0x43; write(ugen_ep1, cmd, sizeof(cmd)); read(ugen_ep1, rpkt, 4); fprintf(stderr, "serial: %02x%02x%02x%02x\n", rpkt[0], rpkt[1], rpkt[2], rpkt[3]); cmd[0] = 0x10; cmd[1] = 0x04; cmd[2] = 0x00; freq = 473143 + (chan - 13) * 6000; cmd[3] = (freq >> 16) & 0xff; cmd[4] = (freq >> 8) & 0xff; cmd[5] = freq & 0xff; write(ugen_ep1, cmd, sizeof(cmd)); memset(cmd, 0, sizeof(cmd)); cmd[0] = 0x11; do { write(ugen_ep1, cmd, sizeof(cmd)); read(ugen_ep1, rpkt, 1); fprintf(stderr, ".", rpkt[0]); } while (rpkt[0] != 1); fprintf(stderr, "o\n"); cmd[0] = 0x20; write(ugen_ep1, cmd, sizeof(cmd)); for (;;) { read(ugen_ep3, rpkt, sizeof(rpkt)); if (((rpkt[1] ^ 0xb5) & 0x80) == 0x80) { fprintf(stderr, "x"); continue; } wpkt[0] = 0x47; for (i = 1; i < 188; i++) wpkt[i] = rpkt[i] ^ 0xb5; write(1, wpkt, sizeof(wpkt)); if ((wpkt[1] & 0x1f) == 0 && wpkt[2] == 0x14) { i = 5; while (wpkt[i] != 0x73 && wpkt[i] != 0xff && i < 181) { i += ((wpkt[i + 1] & 0xf) << 8) | wpkt[i + 2]; } if (wpkt[i] == 0x73) { i += 3; fprintf(stderr, "%d %02x:%02x:%02x\n", wpkt[i] << 8 | wpkt[i + 1], wpkt[i + 2], wpkt[i + 3], wpkt[i + 4]); } } } cmd[0] = 0x21; write(ugen_ep1, cmd, sizeof(cmd)); close(ugen_ep3); close(ugen_ep1); return 0; }