diff --git a/player/README.md b/player/README.md index 39dd7fd..a0bbf54 100644 --- a/player/README.md +++ b/player/README.md @@ -1,72 +1,49 @@ -## Building +## How to build the player software on Linux -Modified to build on Linux. +### bladeRF -``` -$ make all -``` -Will build all players if dependencies are met. +#### Build and install libbladeRF -### Dependencies - bladeRF -#### libbladeRF -``` -$ git clone https://github.com/Nuand/bladeRF.git -$ cd bladeRF -$ dpkg-buildpackage -b -``` -Or Nuand has some build/install instructions including an Ubuntu PPA -at https://github.com/Nuand/bladeRF/wiki/Getting-Started:-Linux +https://github.com/Nuand/bladeRF/wiki/Getting-Started:-Linux -#### Build +#### Build bladeplayer ``` $ make bladeplayer ``` -### Dependecies - hackRF -#### libhackrf +### HackRF One + +#### Build and install libhackrf + +https://github.com/mossmann/hackrf/tree/master/host + +#### Build hackplayer ``` -> git clone https://github.com/mossmann/hackrf.git -> mkdir hackrf/host/build -> cd hackrf/host/build -> cmake .. -> make -> sudo make install -> sudo ldconfig -``` -Build instructions https://github.com/mossmann/hackrf/tree/master/host - -#### Build - -``` -> make hackplayer +$ make hackplayer ``` -### Dependecies - lime +### LimeSDR -LimeSuite https://github.com/myriadrf/LimeSuite +#### Build and install libLimeSuite -Build instructions http://wiki.myriadrf.org/Lime_Suite +http://wiki.myriadrf.org/Lime_Suite -:exclamation: Build not tested. +#### Build limeplayer -### Dependecies - ADALM-Pluto -#### libiio - -Use the latest version from Github. ``` -$ git clone https://github.com/analogdevicesinc/libiio.git -$ cd libiio -$ cmake ./ -$ make all -$ sudo make install +$ make limeplayer ``` -[How to build it in detail.](https://wiki.analog.com/resources/tools-software/linux-software/libiio) -#### libad9361 +### ADALM-Pluto + +#### Build and install libiio + +https://wiki.analog.com/resources/tools-software/linux-software/libiio + +#### Build and insatall libad9361 -Use of the latest Github version mandatory. ``` $ git clone https://github.com/analogdevicesinc/libad9361-iio.git $ cd libad9361-iio @@ -75,7 +52,7 @@ $ make all $ sudo make install ``` -#### Build +#### Build plutoplayer ``` $ make plutoplayer diff --git a/player/bladeplayer.c b/player/bladeplayer.c index afe57a7..e202428 100644 --- a/player/bladeplayer.c +++ b/player/bladeplayer.c @@ -4,8 +4,13 @@ #include #include #include +#ifdef _WIN32 #include "getopt.h" +#else +#include +#include #include +#endif #define TX_FREQUENCY 1575420000 #define TX_SAMPLERATE 2600000 @@ -20,27 +25,25 @@ #define AMPLITUDE (1000) // Default amplitude for 12-bit I/Q -void usage(void) { +void usage(void) +{ fprintf(stderr, "Usage: bladeplayer [options]\n" - " -f I/Q sampling data file (required)\n" - " -b I/Q data format [1/16] (default: 16)\n" - " -g TX VGA1 gain (default: %d)\n", - TX_VGA1); + " -f I/Q sampling data file (required)\n" + " -b I/Q data format [1/16] (default: 16)\n" + " -g TX VGA1 gain (default: %d)\n", + TX_VGA1); return; } - -int main(int argc, char *argv[]) { +int main(int argc, char *argv[]) +{ int status; char *devstr = NULL; struct bladerf *dev = NULL; FILE *fp; int16_t *tx_buffer; - - enum state { - INIT, READ_FILE, PAD_TRAILING, DONE - }; + enum state {INIT, READ_FILE, PAD_TRAILING, DONE}; enum state state = INIT; int compressed = 0; @@ -48,7 +51,7 @@ int main(int argc, char *argv[]) { size_t samples_read; int16_t lut[256][8]; int16_t amp = AMPLITUDE; - uint32_t i, k; + uint32_t i,k; int gain = TX_VGA1; int result; @@ -58,49 +61,55 @@ int main(int argc, char *argv[]) { // Empty TX file name txfile[0] = 0; - if (argc < 3) { + if (argc<3) { usage(); exit(1); } - while ((result = getopt(argc, argv, "g:b:f:")) != -1) { - switch (result) { - case 'g': - gain = atoi(optarg); - if (gain>-4 || gain<-35) { - printf("ERROR: Invalid TX VGA1 gain.\n"); - exit(1); - } - break; - case 'b': - data_format = atoi(optarg); - if (data_format != 1 && data_format != 16) { - printf("ERROR: Invalid I/Q data format.\n"); - exit(1); - } else if (data_format == 1) - compressed = 1; - break; - case 'f': - strcpy(txfile, optarg); - break; - case ':': - case '?': - usage(); + while ((result=getopt(argc,argv,"g:b:f:"))!=-1) + { + switch (result) + { + case 'g': + gain = atoi(optarg); + if (gain>-4 || gain<-35) + { + printf("ERROR: Invalid TX VGA1 gain.\n"); exit(1); - default: - break; + } + break; + case 'b': + data_format = atoi(optarg); + if (data_format!=1 && data_format!=16) + { + printf("ERROR: Invalid I/Q data format.\n"); + exit(1); + } + else if (data_format==1) + compressed = 1; + break; + case 'f': + strcpy(txfile, optarg); + break; + case ':': + case '?': + usage(); + exit(1); + default: + break; } } // Open TX file. - if (txfile[0] == 0) { + if (txfile[0]==0) + { printf("ERROR: I/Q sampling data file is not specified.\n"); exit(1); } fp = fopen(txfile, "rb"); - if (fp == NULL) { + if (fp==NULL) { fprintf(stderr, "ERROR: Failed to open TX file: %s\n", argv[1]); exit(1); } @@ -127,7 +136,8 @@ int main(int argc, char *argv[]) { if (status != 0) { fprintf(stderr, "Failed to set TX sample rate: %s\n", bladerf_strerror(status)); goto out; - } else { + } + else { printf("TX sample rate: %u sps\n", TX_SAMPLERATE); } @@ -135,7 +145,8 @@ int main(int argc, char *argv[]) { if (status != 0) { fprintf(stderr, "Failed to set TX bandwidth: %s\n", bladerf_strerror(status)); goto out; - } else { + } + else { printf("TX bandwidth: %u Hz\n", TX_BANDWIDTH); } @@ -143,7 +154,8 @@ int main(int argc, char *argv[]) { if (status != 0) { fprintf(stderr, "Failed to set TX VGA1 gain: %s\n", bladerf_strerror(status)); goto out; - } else { + } + else { printf("TX VGA1 gain: %d dB\n", gain); } @@ -151,7 +163,8 @@ int main(int argc, char *argv[]) { if (status != 0) { fprintf(stderr, "Failed to set TX VGA2 gain: %s\n", bladerf_strerror(status)); goto out; - } else { + } + else { printf("TX VGA2 gain: %d dB\n", TX_VGA2); } @@ -159,7 +172,7 @@ int main(int argc, char *argv[]) { printf("Running...\n"); // Allocate a buffer to hold each block of samples to transmit. - tx_buffer = (int16_t*) malloc(SAMPLES_PER_BUFFER * 2 * sizeof (int16_t)); + tx_buffer = (int16_t*)malloc(SAMPLES_PER_BUFFER * 2 * sizeof(int16_t)); if (tx_buffer == NULL) { fprintf(stderr, "Failed to allocate TX buffer.\n"); @@ -167,16 +180,17 @@ int main(int argc, char *argv[]) { } // if compressed - read_buffer = (uint8_t*) malloc(SAMPLES_PER_BUFFER / 4); + read_buffer = (uint8_t*)malloc(SAMPLES_PER_BUFFER / 4); if (read_buffer == NULL) { fprintf(stderr, "Failed to allocate read buffer.\n"); goto out; } - for (i = 0; i < 256; i++) { - for (k = 0; k < 8; k++) - lut[i][k] = ((i >> (7 - k))&0x1) ? amp : -amp; + for (i=0; i<256; i++) + { + for (k=0; k<8; k++) + lut[i][k] = ((i>>(7-k))&0x1)?amp:-amp; } // Configure the TX module for use with the synchronous interface. @@ -213,15 +227,16 @@ int main(int argc, char *argv[]) { while (buffer_samples_remaining > 0 && status == 0 && state != DONE) { size_t samples_populated = 0; - switch (state) { + switch(state) { case INIT: case READ_FILE: // Read from the input file - if (compressed) { + if (compressed) + { int16_t *write_buffer_current = tx_buffer; samples_read = fread(read_buffer, - sizeof (uint8_t), + sizeof(uint8_t), read_samples_remaining, fp); @@ -229,15 +244,18 @@ int main(int argc, char *argv[]) { buffer_samples_remaining = read_samples_remaining * 4; // Expand compressed data into TX buffer - for (i = 0; i < samples_read; i++) { + for (i=0; i #include +#ifdef _WIN32 +#include +#ifdef _WIN64 +typedef int64_t ssize_t; +#else +typedef int32_t ssize_t; +#endif +typedef int bool; +#define true 1 +#define false 0 +#include "getopt.h" +#else #include #include #include #include -#include +#endif +#include static hackrf_device* device = NULL; @@ -13,19 +28,34 @@ volatile uint32_t byte_count = 0; volatile bool do_exit = false; +//static transceiver_mode_t transceiver_mode = TRANSCEIVER_MODE_TX; + #define FD_BUFFER_SIZE (8*1024) #define FREQ_ONE_MHZ (1000000ull) +#ifdef _WIN32 +BOOL WINAPI sighandler(int signum) +{ + if(CTRL_C_EVENT == signum) { + fprintf(stdout, "Caught signal %d\n", signum); + do_exit = true; + return TRUE; + } + return FALSE; +} +#else static void sighandler(int signum) { fprintf(stdout, "Caught signal %d\n", signum); do_exit = true; } +#endif int tx_callback(hackrf_transfer* transfer) { size_t bytes_to_read; - if (fd != NULL) { - size_t bytes_read; + if( fd != NULL ) + { + ssize_t bytes_read; byte_count += transfer->valid_length; bytes_to_read = transfer->valid_length; @@ -43,7 +73,7 @@ int tx_callback(hackrf_transfer* transfer) { static void usage() { fprintf(stderr, "Usage: hackplayer [options]\n" - " -t Transmit data from file (required)\n"); + " -t Transmit data from file (required)\n"); return; } @@ -54,30 +84,32 @@ int main(int argc, char** argv) { const char* path = NULL; uint32_t sample_rate_hz = 2600000; uint32_t baseband_filter_bw_hz = 0; - unsigned int txvga_gain = 0; + unsigned int txvga_gain=0; uint64_t freq_hz = 1575420000; uint32_t amp_enable = 1; - while ((opt = getopt(argc, argv, "t:")) != EOF) { + while( (opt = getopt(argc, argv, "t:")) != EOF ) + { result = HACKRF_SUCCESS; - switch (opt) { - case 't': - path = optarg; - break; - default: - printf("unknown argument '-%c %s'\n", opt, optarg); - usage(); - return EXIT_FAILURE; + switch( opt ) + { + case 't': + path = optarg; + break; + default: + printf("unknown argument '-%c %s'\n", opt, optarg); + usage(); + return EXIT_FAILURE; } - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("argument error: '-%c %s' %s (%d)\n", opt, optarg, hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } } - if (path == NULL) { + if( path == NULL ) { printf("specify a path to a file to transmit\n"); usage(); return EXIT_FAILURE; @@ -87,47 +119,51 @@ int main(int argc, char** argv) { baseband_filter_bw_hz = hackrf_compute_baseband_filter_bw_round_down_lt(sample_rate_hz); result = hackrf_init(); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_init() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } result = hackrf_open_by_serial(NULL, &device); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_open() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } fd = fopen(path, "rb"); - if (fd == NULL) { + if( fd == NULL ) { printf("Failed to open file: %s\n", path); return EXIT_FAILURE; } // Change fd buffer to have bigger one to store or read data on/to HDD - result = setvbuf(fd, NULL, _IOFBF, FD_BUFFER_SIZE); - if (result != 0) { + result = setvbuf(fd , NULL , _IOFBF , FD_BUFFER_SIZE); + if( result != 0 ) { printf("setvbuf() failed: %d\n", result); usage(); return EXIT_FAILURE; } +#ifdef _WIN32 + SetConsoleCtrlHandler( (PHANDLER_ROUTINE) sighandler, TRUE ); +#else signal(SIGINT, sighandler); +#endif - printf("call hackrf_sample_rate_set(%.03f MHz)\n", ((float) sample_rate_hz / (float) FREQ_ONE_MHZ)); + printf("call hackrf_sample_rate_set(%.03f MHz)\n", ((float)sample_rate_hz/(float)FREQ_ONE_MHZ)); result = hackrf_set_sample_rate_manual(device, sample_rate_hz, 1); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_sample_rate_set() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } printf("call hackrf_baseband_filter_bandwidth_set(%.03f MHz)\n", - ((float) baseband_filter_bw_hz / (float) FREQ_ONE_MHZ)); + ((float)baseband_filter_bw_hz/(float)FREQ_ONE_MHZ)); result = hackrf_set_baseband_filter_bandwidth(device, baseband_filter_bw_hz); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_baseband_filter_bandwidth_set() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; @@ -136,30 +172,30 @@ int main(int argc, char** argv) { result = hackrf_set_txvga_gain(device, txvga_gain); result |= hackrf_start_tx(device, tx_callback, NULL); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_start_?x() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } - printf("call hackrf_set_freq(%.03f MHz)\n", ((double) freq_hz / (double) FREQ_ONE_MHZ)); + printf("call hackrf_set_freq(%.03f MHz)\n", ((double)freq_hz/(double)FREQ_ONE_MHZ)); result = hackrf_set_freq(device, freq_hz); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_set_freq() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } printf("call hackrf_set_amp_enable(%u)\n", amp_enable); - result = hackrf_set_amp_enable(device, (uint8_t) amp_enable); - if (result != HACKRF_SUCCESS) { + result = hackrf_set_amp_enable(device, (uint8_t)amp_enable); + if( result != HACKRF_SUCCESS ) { printf("hackrf_set_amp_enable() failed: %s (%d)\n", hackrf_error_name(result), result); usage(); return EXIT_FAILURE; } printf("Stop with Ctrl-C\n"); - while ((hackrf_is_streaming(device) == HACKRF_TRUE) && (do_exit == false)) { + while( (hackrf_is_streaming(device) == HACKRF_TRUE) && (do_exit == false) ) { // Show something? } @@ -170,16 +206,17 @@ int main(int argc, char** argv) { printf("\nExiting... hackrf_is_streaming() result: %s (%d)\n", hackrf_error_name(result), result); } - if (device != NULL) { + if(device != NULL) { result = hackrf_stop_tx(device); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) { printf("hackrf_stop_tx() failed: %s (%d)\n", hackrf_error_name(result), result); } else { printf("hackrf_stop_tx() done\n"); } result = hackrf_close(device); - if (result != HACKRF_SUCCESS) { + if( result != HACKRF_SUCCESS ) + { printf("hackrf_close() failed: %s (%d)\n", hackrf_error_name(result), result); } else { printf("hackrf_close() done\n"); @@ -189,7 +226,7 @@ int main(int argc, char** argv) { printf("hackrf_exit() done\n"); } - if (fd != NULL) { + if(fd != NULL) { fclose(fd); fd = NULL; printf("fclose(fd) done\n");