aboutsummaryrefslogtreecommitdiff
path: root/driver_fw/src
diff options
context:
space:
mode:
Diffstat (limited to 'driver_fw/src')
-rw-r--r--driver_fw/src/main.c49
1 files changed, 34 insertions, 15 deletions
diff --git a/driver_fw/src/main.c b/driver_fw/src/main.c
index 4502784..7227a4a 100644
--- a/driver_fw/src/main.c
+++ b/driver_fw/src/main.c
@@ -43,11 +43,11 @@ int hex_to_int(char *hex, size_t len) {
rv = rv<<4;
char c = hex[len];
if ('0' <= c && c <= '9')
- c -= '0';
+ c = c - '0';
else if ('a' <= c && c <= 'f')
- c -= 'a' + 0xa;
+ c = c - 'a' + 0xa;
else if ('A' <= c && c <= 'F')
- c -= 'A' + 0xa;
+ c = c - 'A' + 0xa;
else
c = 0;
rv |= c;
@@ -161,7 +161,9 @@ int main(void) {
GPIOB->OSPEEDR = (3<<0) | (3<<1) | (3<<3);
/* GPIOC:
- * C0-C3: (testpoint)
+ * C0, C3: (testpoint)
+ * C1: Fan 2 PWM
+ * C2: Fan 1 PWM
* C4: RJ45 LED 4
* C5: RJ45 LED 3
* C6: Fuse monitor 7
@@ -172,12 +174,14 @@ int main(void) {
* C11-C15: (testpoint)
*/
GPIOC->MODER =
- IN(0) | IN(1) | IN(2) | IN(3) | IN(9) | IN(11) | IN(12) | IN(13) | IN(14) | IN(15) |
+ IN(0) | OUT(1) | OUT(2) | IN(3) | IN(9) | IN(11) | IN(12) | IN(13) | IN(14) | IN(15) |
OUT(4) | OUT(5) |
IN(6) | IN(7) | IN(8) |
AF(10);
+ GPIOC->OTYPER = (1<<1) | (1<<2);
GPIOC->AFR[1] = AFRH(10, 2);
GPIOC->OSPEEDR = (3<<10);
+ GPIOC->BRR = (1<<1) | (1<<2); /* Disable fans */
/* GPIOD:
* D0-D6: (testpoint)
@@ -187,11 +191,20 @@ int main(void) {
GPIOD->MODER = IN(0) | IN(1) | IN(2) | IN(3) | IN(4) | IN(5) | IN(6) |
IN(8) | IN(9);
- for (int i=0; i<20; i++) {
+ for (int i=0; i<10; i++) {
set_status_leds(LED_ON);
- delay_us(500*1000);
+ delay_us(250*1000);
set_status_leds(0);
- delay_us(500*1000);
+ delay_us(250*1000);
+ }
+
+ GPIOC->BSRR = (1<<1) | (1<<2); /* Enable fans */
+
+ for (int i=0; i<10; i++) {
+ set_status_leds(LED_ON);
+ delay_us(250*1000);
+ set_status_leds(0);
+ delay_us(250*1000);
}
TIM1->CCMR1 = (6<<TIM_CCMR1_OC2M_Pos) | TIM_CCMR1_OC2PE;
@@ -249,12 +262,18 @@ int main(void) {
}
set_status_leds(leds);
- if (USART1->ISR & USART_ISR_RXNE_RXFNE) {
- rj45_rx_ctr = 100000;
- if (USART1->RDR == '\n') {
- if (rxp != 4*16*3) {
+ int isr = USART1->ISR;
+ if ((isr & USART_ISR_ORE) || (isr & USART_ISR_FE)) {
+ USART1->ICR = USART_ICR_ORECF | USART_ICR_FECF;
+ }
+
+ if (isr & USART_ISR_RXNE_RXFNE) {
+ rj45_rx_ctr = 20000;
+ char c = USART1->RDR;
+ if (c == '\n') {
+ if (rxp > 2 && rxp != 4*16*3) {
+ control_err_ctr = 1000000;
rxp = 0;
- control_err_ctr = 10000000;
continue;
}
@@ -271,12 +290,12 @@ int main(void) {
}
}
rxp = 0;
- ping_ctr = 1000000;
+ ping_ctr = 500000;
update_tx_buf();
} else {
if (rxp <= sizeof(rxbuf)) {
- rxbuf[rxp] = USART1->RDR;
+ rxbuf[rxp] = c;
rxp ++;
}
}