int serialGetAttributes (SerialDevice *serial, SerialAttributes *attributes) { int interruptsWereEnabled = disable(); unsigned char lcr = serialReadPort(serial, UART_PORT_LCR); int divisor; serialWritePort(serial, UART_PORT_LCR, lcr | UART_FLAG_LCR_DLAB); divisor = (serialReadPort(serial, UART_PORT_DLH) << 8) | serialReadPort(serial, UART_PORT_DLL); serialWritePort(serial, UART_PORT_LCR, lcr); if (interruptsWereEnabled) enable(); attributes->bios.byte = lcr; { const SerialBaudEntry *baud = serialGetBaudEntry(SERIAL_DIVISOR_BASE/divisor); if (baud) { attributes->speed = baud->speed; } else { memset(&attributes->speed, 0, sizeof(attributes->speed)); } } attributes->bios.fields.bps = attributes->speed.biosBPS; return 1; }
int serialGetAttributes (SerialDevice *serial, SerialAttributes *attributes) { unsigned char lcr; int divisor; { int wasEnabled = disable(); lcr = serialReadPort(serial, UART_PORT_LCR); serialWritePort(serial, UART_PORT_LCR, (lcr | UART_FLAG_LCR_DLAB)); divisor = (serialReadPort(serial, UART_PORT_DLH) << 8) | serialReadPort(serial, UART_PORT_DLL); serialWritePort(serial, UART_PORT_LCR, lcr); if (wasEnabled) enable(); } attributes->bios.byte = lcr; { const SerialBaudEntry *baud = serialGetBaudEntry(SERIAL_DIVISOR_BASE/divisor); if (baud) { attributes->speed = baud->speed; } else { logMessage(LOG_WARNING, "unsupported serial divisor: %d", divisor); memset(&attributes->speed, 0, sizeof(attributes->speed)); } } attributes->bios.fields.bps = attributes->speed.bps; return 1; }
void serialPutInitialAttributes (SerialAttributes *attributes) { attributes->speed = serialGetBaudEntry(9600)->speed; attributes->bios.fields.bps = attributes->speed.bps; attributes->bios.fields.dataBits = SERIAL_BIOS_DATA_8; attributes->bios.fields.stopBits = SERIAL_BIOS_STOP_1; attributes->bios.fields.parity = SERIAL_BIOS_PARITY_NONE; }
int serialSetBaud (SerialDevice *serial, unsigned int baud) { const SerialBaudEntry *entry = serialGetBaudEntry(baud); if (entry) { logMessage(LOG_CATEGORY(SERIAL_IO), "set baud: %u", baud); if (serialPutSpeed(&serial->pendingAttributes, entry->speed)) { return 1; } else { logMessage(LOG_WARNING, "unsupported serial baud: %d", baud); } } else { logMessage(LOG_WARNING, "undefined serial baud: %d", baud); } return 0; }
static void serialInitializeAttributes (SerialAttributes *attributes) { memset(attributes, 0, sizeof(*attributes)); serialPutInitialAttributes(attributes); { const SerialBaudEntry *entry = serialGetBaudEntry(SERIAL_DEFAULT_BAUD); if (!entry) { logMessage(LOG_WARNING, "default serial baud not defined: %u", SERIAL_DEFAULT_BAUD); } else if (!serialPutSpeed(attributes, entry->speed)) { logMessage(LOG_WARNING, "default serial baud not supported: %u", SERIAL_DEFAULT_BAUD); } } if (!serialPutDataBits(attributes, SERIAL_DEFAULT_DATA_BITS)) { logMessage(LOG_WARNING, "default serial data bits not supported: %u", SERIAL_DEFAULT_DATA_BITS); } if (!serialPutStopBits(attributes, SERIAL_DEFAULT_STOP_BITS)) { logMessage(LOG_WARNING, "default serial stop bits not supported: %u", SERIAL_DEFAULT_STOP_BITS); } if (!serialPutParity(attributes, SERIAL_DEFAULT_PARITY)) { logMessage(LOG_WARNING, "default serial parity not supported: %u", SERIAL_DEFAULT_PARITY); } if (serialPutFlowControl(attributes, SERIAL_DEFAULT_FLOW_CONTROL)) { logMessage(LOG_WARNING, "default serial flow control not supported: 0X%04X", SERIAL_DEFAULT_FLOW_CONTROL); } { int state = 0; if (!serialPutModemState(attributes, state)) { logMessage(LOG_WARNING, "default serial modem state not supported: %d", state); } } }
int serialValidateBaud (unsigned int *baud, const char *description, const char *word, const unsigned int *choices) { if (!*word || isUnsignedInteger(baud, word)) { const SerialBaudEntry *entry = serialGetBaudEntry(*baud); if (entry) { if (!choices) return 1; while (*choices) { if (*baud == *choices) return 1; choices += 1; } logMessage(LOG_ERR, "unsupported %s: %u", description, *baud); } else { logMessage(LOG_ERR, "undefined %s: %u", description, *baud); } } else { logMessage(LOG_ERR, "invalid %s: %u", description, *baud); } return 0; }