summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/keyborg/hardware.c12
-rw-r--r--board/keyborg/master_slave.c25
2 files changed, 29 insertions, 8 deletions
diff --git a/board/keyborg/hardware.c b/board/keyborg/hardware.c
index 6651cf5b46..c8c106f92b 100644
--- a/board/keyborg/hardware.c
+++ b/board/keyborg/hardware.c
@@ -66,21 +66,23 @@ static void pins_init(void)
STM32_GPIO_AFIO_MAPR = (STM32_GPIO_AFIO_MAPR & ~(0x7 << 24))
| (2 << 24);
- /* Pin usage:
+ /*
+ * Initial pin usage:
* PA0: SPI_NSS - INPUT/INT_FALLING
- * PA1: N_CHG - OUTPUT/LOW
+ * PA1: N_CHG - INPUT
* PA3: SPI_CLK - INPUT
* PA4: SPI_MISO - INPUT
* PA6: CS1 - OUTPUT/HIGH
* PA7: SPI_MOSI - INPUT
+ * PA9: USB_PU - OUTPUT/LOW
* PA15: UART TX - OUTPUT/HIGH
* PI1: SYNC1 - OUTPUT/LOW
* PI2: SYNC2 - OUTPUT/LOW
*/
- STM32_GPIO_CRL(GPIO_A) = FLOAT(0) | OUT(1) | FLOAT(3) | FLOAT(4) |
+ STM32_GPIO_CRL(GPIO_A) = FLOAT(0) | FLOAT(1) | FLOAT(3) | FLOAT(4) |
OUT(6) | FLOAT(7);
- STM32_GPIO_CRH(GPIO_A) = OUT(15);
- STM32_GPIO_BSRR(GPIO_A) = LOW(1) | HIGH(6) | HIGH(15);
+ STM32_GPIO_CRH(GPIO_A) = OUT(9) | OUT(15);
+ STM32_GPIO_BSRR(GPIO_A) = LOW(1) | HIGH(6) | LOW(9) | HIGH(15);
STM32_EXTI_FTSR |= INT(0);
STM32_GPIO_CRL(GPIO_I) = OUT(1) | OUT(2);
diff --git a/board/keyborg/master_slave.c b/board/keyborg/master_slave.c
index 39f41ddddb..eab62b1b73 100644
--- a/board/keyborg/master_slave.c
+++ b/board/keyborg/master_slave.c
@@ -54,7 +54,7 @@ static int master_handshake(void)
uint32_t val;
int err;
- /* SYNC2 -> GPIO_INPUT */
+ /* SYNC2 is the sync signal from the slave. Set it to input. */
val = STM32_GPIO_CRL(GPIO_I);
val &= ~0x00000f00;
val |= 0x00000400;
@@ -72,7 +72,17 @@ static int slave_handshake(void)
uint32_t val;
int err;
- /* SYNC1 -> GPIO_INPUT */
+ /*
+ * N_CHG is used to drive SPI_NSS on the master. Set it to
+ * output low.
+ */
+ val = STM32_GPIO_CRL(GPIO_A);
+ val &= ~0x000000f0;
+ val |= 0x00000010;
+ STM32_GPIO_CRL(GPIO_A) = val;
+ STM32_GPIO_BSRR(GPIO_A) = 1 << (1 + 16);
+
+ /* SYNC1 is the sync signal from the master. Set it to input. */
val = STM32_GPIO_CRL(GPIO_I);
val &= ~0x000000f0;
val |= 0x00000040;
@@ -87,7 +97,16 @@ static int slave_handshake(void)
static void master_slave_check(void)
{
- if (STM32_GPIO_IDR(GPIO_A) & (1 << 0) /* NSS */) {
+ /*
+ * Master slave identity check:
+ * - Master has USB_PU connected to N_CHG through 1.5K
+ * resistor. USB_PU is initially low, so N_CHG is low.
+ * - Slave has N_CHG connected to master NSS with a 20K
+ * pull-up. Master NSS is initially Hi-Z, so N_CHG is
+ * high.
+ */
+
+ if (STM32_GPIO_IDR(GPIO_A) & (1 << 1) /* N_CHG */) {
debug_printf("I'm slave\n");
is_master = 0;
} else {