mirror of
https://github.com/greatscottgadgets/hackrf.git
synced 2026-03-12 02:11:05 +01:00
Support detection of HackRF One r10
This commit is contained in:
@@ -83,16 +83,14 @@ void adc_off(void)
|
||||
* the unconnected state by averaging several ADC readings.
|
||||
*/
|
||||
#define NUM_SAMPLES (10)
|
||||
#define LOW_THRESHOLD (2 * NUM_SAMPLES)
|
||||
#define HIGH_THRESHOLD (1022 * NUM_SAMPLES)
|
||||
#define LOW_THRESHOLD (2)
|
||||
#define HIGH_THRESHOLD (1022)
|
||||
|
||||
typedef enum {
|
||||
PIN_STRAP_HIGH,
|
||||
PIN_STRAP_LOW,
|
||||
PIN_STRAP_ABSENT,
|
||||
} pin_strap_t;
|
||||
#define HIGH(x) ((x) > HIGH_THRESHOLD)
|
||||
#define LOW(x) ((x) < LOW_THRESHOLD)
|
||||
#define ABSENT(x) (((x) >= LOW_THRESHOLD) && ((x) <= HIGH_THRESHOLD))
|
||||
|
||||
pin_strap_t check_pin_strap(uint8_t pin)
|
||||
uint32_t check_pin_strap(uint8_t pin)
|
||||
{
|
||||
int i;
|
||||
uint32_t sum = 0;
|
||||
@@ -101,15 +99,53 @@ pin_strap_t check_pin_strap(uint8_t pin)
|
||||
sum += adc_read(pin);
|
||||
}
|
||||
adc_off();
|
||||
if (sum > HIGH_THRESHOLD) {
|
||||
return PIN_STRAP_HIGH;
|
||||
} else if (sum < LOW_THRESHOLD) {
|
||||
return PIN_STRAP_LOW;
|
||||
} else {
|
||||
return PIN_STRAP_ABSENT;
|
||||
}
|
||||
return (sum / NUM_SAMPLES);
|
||||
}
|
||||
|
||||
/*
|
||||
* Starting with r10, HackRF One uses a voltage divider on ADC0_3 to set an
|
||||
* analog voltage that indicates the hardware revision. The high five bits of
|
||||
* the ADC result are mapped to 32 revisions. HackRF One r8 also fits into this
|
||||
* scheme with ADC0_3 tied to VCC.
|
||||
*/
|
||||
// clang-format off
|
||||
static const uint8_t revision_from_adc[32] = {
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_UNRECOGNIZED,
|
||||
BOARD_REV_HACKRF1_R10,
|
||||
BOARD_REV_HACKRF1_R8
|
||||
};
|
||||
|
||||
// clang-format on
|
||||
|
||||
void detect_hardware_platform(void)
|
||||
{
|
||||
uint8_t detected_resistors = 0;
|
||||
@@ -177,34 +213,31 @@ void detect_hardware_platform(void)
|
||||
halt_and_flash(1000000);
|
||||
}
|
||||
|
||||
pin_strap_t adc0_3 = check_pin_strap(3);
|
||||
pin_strap_t adc0_4 = check_pin_strap(4);
|
||||
pin_strap_t adc0_7 = check_pin_strap(7);
|
||||
uint32_t adc0_3 = check_pin_strap(3);
|
||||
uint32_t adc0_4 = check_pin_strap(4);
|
||||
uint32_t adc0_7 = check_pin_strap(7);
|
||||
|
||||
if ((adc0_3 == PIN_STRAP_ABSENT) && (adc0_4 == PIN_STRAP_ABSENT) &&
|
||||
(adc0_7 == PIN_STRAP_ABSENT) && (platform == BOARD_ID_HACKRF1_OG)) {
|
||||
revision = BOARD_REV_HACKRF1_OLD;
|
||||
} else if (
|
||||
(adc0_3 == PIN_STRAP_HIGH) && (adc0_4 == PIN_STRAP_HIGH) &&
|
||||
(platform == BOARD_ID_HACKRF1_OG)) {
|
||||
revision = BOARD_REV_HACKRF1_R6;
|
||||
} else if (
|
||||
(adc0_3 == PIN_STRAP_LOW) && (adc0_4 == PIN_STRAP_HIGH) &&
|
||||
(platform == BOARD_ID_HACKRF1_OG)) {
|
||||
revision = BOARD_REV_HACKRF1_R7;
|
||||
} else if (
|
||||
(adc0_3 == PIN_STRAP_HIGH) && (adc0_4 == PIN_STRAP_LOW) &&
|
||||
(platform == BOARD_ID_HACKRF1_OG)) {
|
||||
revision = BOARD_REV_HACKRF1_R8;
|
||||
} else if (
|
||||
(adc0_3 == PIN_STRAP_LOW) && (adc0_4 == PIN_STRAP_LOW) &&
|
||||
(platform == BOARD_ID_HACKRF1_R9)) {
|
||||
revision = BOARD_REV_HACKRF1_R9;
|
||||
} else {
|
||||
revision = BOARD_REV_UNRECOGNIZED;
|
||||
if (platform == BOARD_ID_HACKRF1_OG) {
|
||||
if (ABSENT(adc0_3) && ABSENT(adc0_4) && ABSENT(adc0_7)) {
|
||||
revision = BOARD_REV_HACKRF1_OLD;
|
||||
} else if (HIGH(adc0_3) && HIGH(adc0_4)) {
|
||||
revision = BOARD_REV_HACKRF1_R6;
|
||||
} else if (LOW(adc0_3) && HIGH(adc0_4)) {
|
||||
revision = BOARD_REV_HACKRF1_R7;
|
||||
} else if (LOW(adc0_4)) {
|
||||
revision = revision_from_adc[adc0_3 >> 5];
|
||||
} else {
|
||||
revision = BOARD_REV_UNRECOGNIZED;
|
||||
}
|
||||
} else if (platform == BOARD_ID_HACKRF1_R9) {
|
||||
if (LOW(adc0_3) && LOW(adc0_4)) {
|
||||
revision = BOARD_REV_HACKRF1_R9;
|
||||
} else {
|
||||
revision = BOARD_REV_UNRECOGNIZED;
|
||||
}
|
||||
}
|
||||
|
||||
if ((revision > BOARD_REV_HACKRF1_OLD) && (adc0_7 == PIN_STRAP_LOW)) {
|
||||
if ((revision > BOARD_REV_HACKRF1_OLD) && LOW(adc0_7)) {
|
||||
revision |= BOARD_REV_GSG;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,10 +47,12 @@ typedef enum {
|
||||
BOARD_REV_HACKRF1_R7 = 2,
|
||||
BOARD_REV_HACKRF1_R8 = 3,
|
||||
BOARD_REV_HACKRF1_R9 = 4,
|
||||
BOARD_REV_HACKRF1_R10 = 5,
|
||||
BOARD_REV_GSG_HACKRF1_R6 = 0x81,
|
||||
BOARD_REV_GSG_HACKRF1_R7 = 0x82,
|
||||
BOARD_REV_GSG_HACKRF1_R8 = 0x83,
|
||||
BOARD_REV_GSG_HACKRF1_R9 = 0x84,
|
||||
BOARD_REV_GSG_HACKRF1_R10 = 0x85,
|
||||
BOARD_REV_UNRECOGNIZED =
|
||||
0xFE, /* tried detection but did not recognize revision */
|
||||
BOARD_REV_UNDETECTED = 0xFF, /* detection not yet attempted */
|
||||
|
||||
@@ -2913,6 +2913,10 @@ extern ADDAPI const char* ADDCALL hackrf_board_rev_name(enum hackrf_board_rev bo
|
||||
case BOARD_REV_GSG_HACKRF1_R9:
|
||||
return "r9";
|
||||
|
||||
case BOARD_REV_HACKRF1_R10:
|
||||
case BOARD_REV_GSG_HACKRF1_R10:
|
||||
return "r10";
|
||||
|
||||
case BOARD_ID_UNRECOGNIZED:
|
||||
return "unrecognized";
|
||||
|
||||
|
||||
@@ -714,6 +714,10 @@ enum hackrf_board_rev {
|
||||
* board revision 9, generic
|
||||
*/
|
||||
BOARD_REV_HACKRF1_R9 = 4,
|
||||
/**
|
||||
* board revision 10, generic
|
||||
*/
|
||||
BOARD_REV_HACKRF1_R10 = 5,
|
||||
|
||||
/**
|
||||
* board revision 6, made by GSG
|
||||
@@ -731,6 +735,10 @@ enum hackrf_board_rev {
|
||||
* board revision 9, made by GSG
|
||||
*/
|
||||
BOARD_REV_GSG_HACKRF1_R9 = 0x84,
|
||||
/**
|
||||
* board revision 10, made by GSG
|
||||
*/
|
||||
BOARD_REV_GSG_HACKRF1_R10 = 0x85,
|
||||
|
||||
/**
|
||||
* unknown board revision (detection failed)
|
||||
|
||||
Reference in New Issue
Block a user