int gps_autonegotiate_baud(gps_t *g, int guessbaud) { int bauds[] = { 4800, 9600, 19200, 38400, 600, 1200, 2400, -1 }; int baudidx = -1; uint8_t rpy[GPS_MESSAGE_MAXLEN + 1]; rpy[GPS_MESSAGE_MAXLEN] = 0; while (1) { int baud; if (baudidx < 0) baud = guessbaud; else { if (bauds[baudidx] < 0) baudidx = 0; baud = bauds[baudidx]; } printf("Trying %6d baud...", baud); fflush(NULL); // enable all output sentences gps_write_command(g, "$PGRMO,,3*"); serial_setbaud(g->fd, baud); read_flush(g->fd); for (int i = 0; i < 4; i++) { int res = gps_readline(g, rpy, GPS_MESSAGE_MAXLEN); if (!res) { printf("GPS found!\n"); return 0; } printf("."); fflush(NULL); } printf("\n"); baudidx++; } // no luck return -1; }
/* initialize the serial ports */ int serial_init(struct Device_Conf *dev){ int i = dev->unit; USART_TypeDef *addr; int irq; int b; int altpins = dev->flags & CFFLAGS_ALTPINS; finit( & com[i].file ); com[i].file.fs = &serial_port_fs; com[i].file.codepage = CODEPAGE_UTF8; com[i].head = com[i].tail = com[i].len = 0; com[i].status = 0; com[i].portno = i; com[i].file.d = (void*)&com[i]; // enable gpio clock, usart clock, configure pins serial_pins_init( i, altpins ); switch(i){ case 0: addr = USART1; com[i].baudclock = apb2_clock_freq(); irq = (int) IRQ_USART1; break; case 1: addr = USART2; com[i].baudclock = apb1_clock_freq(); irq = (int) IRQ_USART2; break; case 2: addr = USART3; com[i].baudclock = apb1_clock_freq(); irq = (int) IRQ_USART3_4; break; default: PANIC("invalid serial"); break; } com[i].addr = addr; if( dev->baud ) serial_setbaud(i, b=dev->baud); else serial_setbaud(i, b=9600); addr->CR1 = 0x0C // enable rx/tx, no parity, 8 bit, ... | 0x20 // enable RX irq | 1; // enable // enable ints nvic_enable( irq, IPL_TTY ); if( !serial0_port ){ serial0_port = &com[i].file; } bootmsg("%s at io 0x%x irq %d %d baud\n", dev->name, addr, irq, b); return (int) &com[i].file; }