MOS Source Code
Loading...
Searching...
No Matches
serial.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-3.0-or-later
2
4
5#include <mos/mos_global.h>
7
9{
14 SetParity();
15
18
19 // Try send a byte to the serial port.
20 // If it fails, then the serial port is not connected.
21 {
22 const char challenge = 'H';
24 write_byte(challenge);
25 const auto response = read_byte();
27 if (response != 'H')
28 return false;
29 }
30
33 return true;
34}
35
36int ISerialDevice::read_data(char *data, size_t length)
37{
38 for (size_t i = 0; i < length; i++)
39 {
41 data[i] = read_byte();
42 }
43
44 return length;
45}
46
47int ISerialDevice::write_data(const char *data, size_t length)
48{
49 for (size_t i = 0; i < length; i++)
50 {
52 write_byte(data[i]);
53 }
54
55 return length;
56}
57
59{
60 // Set the most significant bit of the Line Control Register. This is the DLAB bit, and allows access to the divisor registers.
62 reg |= 0x80; // set DLAB bit
63
65
66 // Send the least significant byte of the divisor value to [PORT + 0].
68
69 // Send the most significant byte of the divisor value to [PORT + 1].
71
72 // Clear the most significant bit of the Line Control Register.
73 reg &= ~0x80;
75}
94void ISerialDevice::SetInterrupts(int interrupts)
95{
97 control = interrupts;
99}
101{
102 byte_t byte = { .byte = read_register(OFFSET_MODEM_CONTROL) };
103 switch (control)
104 {
105 case MODEM_DTR: byte.bits.b0 = enable; break;
106 case MODEM_RTS: byte.bits.b1 = enable; break;
107 case MODEM_UNUSED_PIN1: byte.bits.b2 = enable; break;
108 case MODEM_IRQ: byte.bits.b3 = enable; break;
109 case MODEM_LOOP: byte.bits.b4 = enable; break;
110 }
112}
126{
127 while (!GetDataReady())
128 ;
129}
serial_baudrate_t baudrate_divisor
Definition serial.hpp:88
void SetModemOptions(serial_modem_control_t control, bool enable)
Definition serial.cpp:100
void SetDataBits()
Definition serial.cpp:76
serial_parity_t parity
Definition serial.hpp:91
int write_data(const char *data, size_t length)
Definition serial.cpp:47
void WaitReadyToWrite()
Definition serial.cpp:130
serial_charlength_t char_length
Definition serial.hpp:89
void SetStopBits()
Definition serial.cpp:82
bool GetDataReady()
Definition serial.cpp:121
virtual u8 read_register(serial_register_t offset)=0
virtual u8 read_byte()=0
@ LINE_TRANSMITR_BUF_EMPTY
Definition serial.hpp:122
void SetParity()
Definition serial.cpp:88
serial_stopbits_t stop_bits
Definition serial.hpp:90
__maybe_unused char GetModelStatus()
Definition serial.cpp:117
void SetBaudrateDivisor()
Definition serial.cpp:58
virtual void write_register(serial_register_t offset, u8 value)=0
char GetLineStatus()
Definition serial.cpp:113
int read_data(char *data, size_t length)
Definition serial.cpp:36
void WaitReadyToRead()
Definition serial.cpp:125
bool setup()
Definition serial.cpp:8
void SetInterrupts(int interrupts)
Definition serial.cpp:94
virtual int write_byte(u8 byte)=0
#define __maybe_unused
Definition mos_global.h:33
@ STOP_BITS_15_OR_2
Definition serial.hpp:32
@ OFFSET_LINE_STATUS
Definition serial.hpp:13
@ OFFSET_DLAB_DIVISOR_LSB
Definition serial.hpp:17
@ OFFSET_MODEM_CONTROL
Definition serial.hpp:12
@ OFFSET_INTERRUPT_ENABLE
Definition serial.hpp:9
@ OFFSET_DLAB_DIVISOR_MSB
Definition serial.hpp:18
@ OFFSET_MODEM_STATUS
Definition serial.hpp:14
@ OFFSET_LINE_CONTROL
Definition serial.hpp:11
@ INTERRUPT_DATA_AVAILABLE
Definition serial.hpp:46
@ INTERRUPT_NONE
Definition serial.hpp:50
unsigned char u8
Definition types.h:15
Definition types.h:53
bool b1
Definition types.h:57
struct byte_t::@051013004117302001241043060147231301071042217001 bits
u8 byte
Definition types.h:65