static void m68328_set_baud(void) { unsigned short ustcnt; int i; ustcnt = USTCNT; USTCNT = ustcnt & ~USTCNT_TXEN; again: for (i = 0; i < ARRAY_SIZE(baud_table); i++) if (baud_table[i] == m68328_console_baud) break; if (i >= ARRAY_SIZE(baud_table)) { m68328_console_baud = 9600; goto again; } UBAUD = PUT_FIELD(UBAUD_DIVIDE, hw_baud_table[i].divisor) | PUT_FIELD(UBAUD_PRESCALER, hw_baud_table[i].prescale); ustcnt &= ~(USTCNT_PARITYEN | USTCNT_ODD_EVEN | USTCNT_STOP | USTCNT_8_7); ustcnt |= USTCNT_8_7; ustcnt |= USTCNT_TXEN; USTCNT = ustcnt; m68328_console_initted = 1; return; }
/* * This routine is called to set the UART divisor registers to match * the specified baud rate for a serial port. */ static void change_speed(struct m68k_serial *info) { m68328_uart *uart = &uart_addr[info->line]; unsigned short port; unsigned short ustcnt; unsigned cflag; int i; if (!info->tty || !info->tty->termios) return; cflag = info->tty->termios->c_cflag; if (!(port = info->port)) return; ustcnt = uart->ustcnt; uart->ustcnt = ustcnt & ~USTCNT_TXEN; i = cflag & CBAUD; if (i & CBAUDEX) { i = (i & ~CBAUDEX) + B38400; } info->baud = baud_table[i]; uart->ubaud = PUT_FIELD(UBAUD_DIVIDE, hw_baud_table[i].divisor) | PUT_FIELD(UBAUD_PRESCALER, hw_baud_table[i].prescale); ustcnt &= ~(USTCNT_PARITYEN | USTCNT_ODD_EVEN | USTCNT_STOP | USTCNT_8_7); if ((cflag & CSIZE) == CS8) ustcnt |= USTCNT_8_7; if (cflag & CSTOPB) ustcnt |= USTCNT_STOP; if (cflag & PARENB) ustcnt |= USTCNT_PARITYEN; if (cflag & PARODD) ustcnt |= USTCNT_ODD_EVEN; #ifdef CONFIG_SERIAL_68328_RTS_CTS if (cflag & CRTSCTS) { uart->utx.w &= ~ UTX_NOCTS; } else { uart->utx.w |= UTX_NOCTS; } #endif ustcnt |= USTCNT_TXEN; uart->ustcnt = ustcnt; return; }
SERIALIZER() { PUT_FIELD(SizeT(sz)); if (sz != 0) PUT_BYTES(data.get(), sz); }
void cl_set_field(_VALUE val, int32_t f, _VALUE v) { PUSH = val; PUSH = v; PUT_FIELD(f); }