diff --git a/components/flow3r_bsp/flow3r_bsp.h b/components/flow3r_bsp/flow3r_bsp.h
index 2b807720c3decc30f8540038fdd4243e95531f9e..9492c4706aeb231e11a209a38135f10769fe0f88 100644
--- a/components/flow3r_bsp/flow3r_bsp.h
+++ b/components/flow3r_bsp/flow3r_bsp.h
@@ -193,4 +193,16 @@ void flow3r_bsp_spio_badgelink_left_enable(bool tip_on, bool ring_on);
 //
 // flow3r_bsp_spio_update must be called for this setting to actually propagate
 // to hardware.
-void flow3r_bsp_spio_badgelink_right_enable(bool tip_on, bool ring_on);
\ No newline at end of file
+void flow3r_bsp_spio_badgelink_right_enable(bool tip_on, bool ring_on);
+
+// Pin mapping information of programmable badge I/O. These are GPIO numbers
+// that can be used with the ESP-IDF API.
+typedef struct {
+	// Left jack, headphone/line out.
+	uint8_t badgelink_left_tip;
+	uint8_t badgelink_left_ring;
+	// Right jack, line in.
+	uint8_t badgelink_right_tip;
+	uint8_t badgelink_right_ring;
+} flow3r_bsp_spio_programmable_pins_t;
+extern const flow3r_bsp_spio_programmable_pins_t flow3r_bsp_spio_programmable_pins;
\ No newline at end of file
diff --git a/components/flow3r_bsp/flow3r_bsp_spio.c b/components/flow3r_bsp/flow3r_bsp_spio.c
index d3f7faad50dc16e777f6b09f85e4bc023a079bea..53858565a38cd8002d6f1c4d9a9ebee0d75486da 100644
--- a/components/flow3r_bsp/flow3r_bsp_spio.c
+++ b/components/flow3r_bsp/flow3r_bsp_spio.c
@@ -35,7 +35,9 @@ typedef struct {
 
 typedef struct {
 	flow3r_bsp_iopin_t tip_badgelink_enable;
+	flow3r_bsp_iopin_t tip_badgelink_data;
 	flow3r_bsp_iopin_t ring_badgelink_enable;
+	flow3r_bsp_iopin_t ring_badgelink_data;
 } flow3r_bsp_iodef_trrs_t;
 
 typedef struct {
@@ -71,6 +73,12 @@ static const flow3r_bsp_iodef_t iodef = {
 	.charger_state = IODUMMY,
 	.jacksense_right = IODUMMY,
 };
+const flow3r_bsp_spio_programmable_pins_t flow3r_bsp_spio_programmable_pins = {
+	.badgelink_left_tip = 6,
+	.badgelink_left_ring = 7,
+	.badgelink_right_tip = 4,
+	.badgelink_right_ring = 5,
+};
 #define PORTEXP_NONE
 #elif defined(CONFIG_FLOW3R_HW_GEN_P4) || defined(CONFIG_FLOW3R_HW_GEN_P3)
 static const flow3r_bsp_iodef_t iodef = {
@@ -85,16 +93,22 @@ static const flow3r_bsp_iodef_t iodef = {
 		.right = IPEX(7, 1, .invert = true),
 	},
 	.trrs_left = {
-		.tip_badgelink_enable = OPEX(6, 0),
-		.ring_badgelink_enable = OPEX(7, 0),
+		.tip_badgelink_enable = OPEX(6, 0, .invert = true),
+		.ring_badgelink_enable = OPEX(7, 0, .invert = true),
 	},
 	.trrs_right = {
-		.tip_badgelink_enable = OPEX(5, 0),
-		.ring_badgelink_enable = OPEX(4, 0),
+		.tip_badgelink_enable = OPEX(5, 0, .invert = true),
+		.ring_badgelink_enable = OPEX(4, 0, .invert = true),
 	},
 	.charger_state = IODUMMY,
 	.jacksense_right = IODUMMY,
 };
+const flow3r_bsp_spio_programmable_pins_t flow3r_bsp_spio_programmable_pins = {
+	.badgelink_left_tip = 6,
+	.badgelink_left_ring = 7,
+	.badgelink_right_tip = 4,
+	.badgelink_right_ring = 5,
+};
 #define PORTEXP_MAX7321S
 #elif defined(CONFIG_FLOW3R_HW_GEN_P6)
 static const flow3r_bsp_iodef_t iodef = {
@@ -119,6 +133,12 @@ static const flow3r_bsp_iodef_t iodef = {
 	.charger_state = IPEX(2, 1),
 	.jacksense_right = IPEX(6, 1),
 };
+const flow3r_bsp_spio_programmable_pins_t flow3r_bsp_spio_programmable_pins = {
+	.badgelink_left_tip = 7,
+	.badgelink_left_ring = 6,
+	.badgelink_right_tip = 4,
+	.badgelink_right_ring = 5,
+};
 #define PORTEXP_MAX7321S
 #else
 #error "spio unimplemented for this badge generation"
@@ -271,7 +291,7 @@ esp_err_t flow3r_bsp_spio_init(void) {
 	INITIO(trrs_left.ring_badgelink_enable);
 	INITIO(trrs_right.tip_badgelink_enable);
 	INITIO(trrs_right.ring_badgelink_enable);
-	
+
 	return _portexp_update();
 }