/* * Copyright 2012 Jared Boone * * This file is part of HackRF. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ #include #include #include #include static void usage() { printf("\nUsage:\n"); printf("\t-n, --register : set register number for subsequent read/write operations\n"); printf("\t-r, --read: read register specified by last -n argument, or all registers\n"); printf("\t-w, --write : write register specified by last -n argument with value \n"); printf("\nExamples:\n"); printf("\t -n 12 -r # reads from register 12\n"); printf("\t -r # reads all registers\n"); printf("\t -n 10 -w 22 # writes register 10 with 22 decimal\n"); } static struct option long_options[] = { { "register", required_argument, 0, 'n' }, { "write", required_argument, 0, 'w' }, { "read", no_argument, 0, 'r' }, { 0, 0, 0, 0 }, }; int parse_int(char* const s, uint16_t* const value) { char* s_end = s; const long long_value = strtol(s, &s_end, 10); if( (s != s_end) && (*s_end == 0) ) { *value = long_value; return HACKRF_SUCCESS; } else { return HACKRF_ERROR_INVALID_PARAM; } } int dump_register(hackrf_device* device, const uint16_t register_number) { uint16_t register_value; int result = hackrf_si5351c_read(device, register_number, ®ister_value); if( result == HACKRF_SUCCESS ) { printf("[%3d] -> 0x%02x\n", register_number, register_value); } else { printf("hackrf_max2837_read() failed: %s (%d)\n", hackrf_error_name(result), result); } return result; } int dump_registers(hackrf_device* device) { int result = HACKRF_SUCCESS; for(uint16_t register_number=0; register_number<256; register_number++) { result = dump_register(device, register_number); if( result != HACKRF_SUCCESS ) { break; } } return result; } int write_register( hackrf_device* device, const uint16_t register_number, const uint16_t register_value ) { int result = HACKRF_SUCCESS; result = hackrf_si5351c_write(device, register_number, register_value); if( result == HACKRF_SUCCESS ) { printf("0x%2x -> [%3d]\n", register_value, register_number); } else { printf("hackrf_max2837_write() failed: %s (%d)\n", hackrf_error_name(result), result); } return result; } #define REGISTER_INVALID 32767 int main(int argc, char** argv) { int opt; uint16_t register_number = REGISTER_INVALID; uint16_t register_value; int result = hackrf_init(); if( result ) { printf("hackrf_init() failed: %s (%d)\n", hackrf_error_name(result), result); return -1; } hackrf_device* device = NULL; result = hackrf_open(&device); if( result ) { printf("hackrf_open() failed: %s (%d)\n", hackrf_error_name(result), result); return -1; } int option_index = 0; while( (opt = getopt_long(argc, argv, "n:rw:", long_options, &option_index)) != EOF ) { switch( opt ) { case 'n': result = parse_int(optarg, ®ister_number); break; case 'w': result = parse_int(optarg, ®ister_value); if( result == HACKRF_SUCCESS ) { result = write_register(device, register_number, register_value); } break; case 'r': if( register_number == REGISTER_INVALID ) { result = dump_registers(device); } else { result = dump_register(device, register_number); } break; default: usage(); } if( result != HACKRF_SUCCESS ) { printf("argument error: %s (%d)\n", hackrf_error_name(result), result); break; } } result = hackrf_close(device); if( result ) { printf("hackrf_close() failed: %s (%d)\n", hackrf_error_name(result), result); return -1; } hackrf_exit(); return 0; }