int bladerf_get_sampling(struct bladerf *dev, bladerf_sampling *sampling) { int status = 0, external = 0; uint8_t val = 0; status = bladerf_lms_read( dev, 0x09, &val ); if (status) { log_warning( "Could not read state of ADC pin connectivity\n" ); goto bladerf_get_sampling__done; } external = val&(1<<7) ? 1 : 0; status = bladerf_lms_read( dev, 0x64, &val ); if (status) { log_warning( "Could not read RXVGA2 state\n" ); goto bladerf_get_sampling__done; } external |= val&(1<<1) ? 0 : 2; switch(external) { case 0 : *sampling = BLADERF_SAMPLING_INTERNAL; break; case 3 : *sampling = BLADERF_SAMPLING_EXTERNAL; break; default : *sampling = BLADERF_SAMPLING_UNKNOWN; break; } bladerf_get_sampling__done: return status; }
int bladerf_set_sampling(struct bladerf *dev, bladerf_sampling sampling) { uint8_t val ; int status = 0 ; if (sampling == BLADERF_SAMPLING_INTERNAL) { /* Disconnect the ADC input from the outside world */ status = bladerf_lms_read( dev, 0x09, &val ); if (status) { log_warning( "Could not read LMS to connect ADC to external pins\n" ); goto bladerf_set_sampling__done ; } val &= ~(1<<7) ; status = bladerf_lms_write( dev, 0x09, val ); if (status) { log_warning( "Could not write LMS to connect ADC to external pins\n" ); goto bladerf_set_sampling__done; } /* Turn on RXVGA2 */ status = bladerf_lms_read( dev, 0x64, &val ); if (status) { log_warning( "Could not read LMS to enable RXVGA2\n" ); goto bladerf_set_sampling__done; } val |= (1<<1) ; status = bladerf_lms_write( dev, 0x64, val ); if (status) { log_warning( "Could not write LMS to enable RXVGA2\n" ); goto bladerf_set_sampling__done; } } else { /* Turn off RXVGA2 */ status = bladerf_lms_read( dev, 0x64, &val ); if (status) { log_warning( "Could not read the LMS to disable RXVGA2\n" ); goto bladerf_set_sampling__done; } val &= ~(1<<1) ; status = bladerf_lms_write( dev, 0x64, val ); if (status) { log_warning( "Could not write the LMS to disable RXVGA2\n" ); goto bladerf_set_sampling__done; } /* Connect the external ADC pins to the internal ADC input */ status = bladerf_lms_read( dev, 0x09, &val ); if (status) { log_warning( "Could not read the LMS to connect ADC to internal pins\n" ); goto bladerf_set_sampling__done; } val |= (1<<7) ; status = bladerf_lms_write( dev, 0x09, val ); if (status) { log_warning( "Could not write the LMS to connect ADC to internal pins\n" ); } } bladerf_set_sampling__done: return status; }
int cmd_poke(struct cli_state *state, int argc, char **argv) { /* Valid commands: poke dac <address> <value> poke lms <address> <value> poke si <address> <value> */ int rv = CLI_RET_OK; int status; bool ok; int (*f)(struct bladerf *, uint8_t, uint8_t); unsigned int address, value; if (!cli_device_is_opened(state)) { return CLI_RET_NODEV; } if( argc == 4 ) { /* Parse the value */ value = str2uint( argv[3], 0, MAX_VALUE, &ok ); if( !ok ) { cli_err(state, argv[0], "Invalid value provided (%s)", argv[3]); return CLI_RET_INVPARAM; } /* Are we reading from the DAC? */ if( strcasecmp( argv[1], "dac" ) == 0 ) { /* Parse address */ address = str2uint( argv[2], 0, DAC_MAX_ADDRESS, &ok ); if( !ok ) { invalid_address(state, argv[0], argv[2]); rv = CLI_RET_INVPARAM; } else { /* TODO: Point function pointer */ /* f = vctcxo_dac_write */ f = NULL; } } /* Are we reading from the LMS6002D */ else if( strcasecmp( argv[1], "lms" ) == 0 ) { /* Parse address */ address = str2uint( argv[2], 0, LMS_MAX_ADDRESS, &ok ); if( !ok ) { invalid_address(state, argv[0], argv[2]); rv = CLI_RET_INVPARAM; } else { f = bladerf_lms_write; } } /* Are we reading from the Si5338? */ else if( strcasecmp( argv[1], "si" ) == 0 ) { /* Parse address */ address = str2uint( argv[2], 0, SI_MAX_ADDRESS, &ok ); if( !ok ) { invalid_address(state, argv[0], argv[2]); rv = CLI_RET_INVPARAM; } else { f = bladerf_si5338_write; } } /* I guess we aren't reading from anything :( */ else { cli_err(state, argv[0], "%s is not a pokeable device\n", argv[1] ); rv = CLI_RET_INVPARAM; } /* Write the value to the address */ if( rv == CLI_RET_OK && f ) { status = f( state->dev, (uint8_t)address, (uint8_t)value ); if (status < 0) { state->last_lib_error = status; rv = CLI_RET_LIBBLADERF; } else { printf( " 0x%2.2x: 0x%2.2x\n", address, value ); if (f == bladerf_lms_write) { uint8_t readback; int status = bladerf_lms_read(state->dev, (uint8_t)address, &readback); if (status == 0) { lms_reg_info(address, readback); putchar('\n'); /* To be consistent with peek output */ } } } } } else { cli_err(state, argv[0], "Invalid number of arguments (%d)\n", argc); rv = CLI_RET_INVPARAM; } return rv; }