21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/processor/Processor.h"
24static constexpr size_t SerialStatusPollLimit = 100000;
26X86Serial::X86Serial() : m_Port(
"COM"), m_Present(false) {}
28X86Serial::~X86Serial() {}
37 const uint8_t scratch = m_Port.
read8(serial::scratch);
38 m_Port.
write8(0x5a, serial::scratch);
39 const bool first = m_Port.
read8(serial::scratch) == 0x5a;
40 m_Port.
write8(0xa5, serial::scratch);
41 m_Present = first && m_Port.
read8(serial::scratch) == 0xa5;
42 m_Port.
write8(scratch, serial::scratch);
46 m_Port.
write8(0x00, serial::inten);
47 m_Port.
write8(0x80, serial::lctrl);
48 m_Port.
write8(0x01, serial::rxtx);
49 m_Port.
write8(0x00, serial::inten);
50 m_Port.
write8(0x03, serial::lctrl);
54 m_Port.
write8(0x03, serial::mctrl);
55 m_Port.
write8(0x00, serial::inten);
57 NOTICE(
"Modem status: " <<
Hex << m_Port.
read8(serial::mstat));
58 NOTICE(
"Line status: " <<
Hex << m_Port.
read8(serial::lstat));
61bool X86Serial::hasData() {
62 return isConnected() && (m_Port.
read8(serial::lstat) & 0x1);
65char X86Serial::read() {
68 if (!waitForStatus(0x1))
71 return m_Port.
read8(serial::rxtx);
74char X86Serial::readNonBlock() {
78 return m_Port.
read8(serial::rxtx);
83void X86Serial::write(
char c) {
86 if (!waitForStatus(0x20))
89 m_Port.
write8(
static_cast<unsigned char>(c), serial::rxtx);
92bool X86Serial::waitForStatus(uint8_t mask) {
93 for (
size_t poll = 0; poll < SerialStatusPollLimit; ++poll) {
94 if (m_Port.
read8(serial::lstat) & mask)
98 return (m_Port.
read8(serial::lstat) & mask) != 0;
101bool X86Serial::isConnected() {
bool allocate(io_port_t ioPort, size_t size)
virtual void write8(uint8_t value, size_t offset=0)
virtual uint8_t read8(size_t offset=0)
virtual void setBase(uintptr_t nBaseAddr)