Esempio n. 1
0
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;
}
Esempio n. 2
0
/* 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;
}