blob: 28c9dd5bad6889e75265c1de31267048ee9eba20 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
//! Serial Initialization
const common = @import("../../../common/common.zig");
const asm_io = @import("../../asm/io/io.zig");
const serial_constants = common.constants.serial;
const ports = serial_constants.ports;
const registers = serial_constants.registers;
pub fn initialize(port: u16) bool {
asm_io.write_byte(port + registers.interrupt_enable_register, 0x00);
asm_io.write_byte(port + registers.line_control_register, registers.line_control_dlab);
asm_io.write_byte(port + registers.divisor_latch_low, @truncate(ports.default_baud_divisor));
asm_io.write_byte(port + registers.divisor_latch_high, @truncate(ports.default_baud_divisor >> 8));
asm_io.write_byte(port + registers.line_control_register, registers.line_control_8_bits);
asm_io.write_byte(port + registers.fifo_control_register, registers.fifo_enable | registers.fifo_clear_receive | registers.fifo_clear_transmit | registers.fifo_trigger_14);
asm_io.write_byte(port + registers.modem_control_register, registers.modem_dtr | registers.modem_rts | registers.modem_out2);
asm_io.write_byte(port + registers.modem_control_register, registers.modem_dtr | registers.modem_rts | registers.modem_out1 | registers.modem_out2 | registers.modem_loopback);
asm_io.write_byte(port + registers.data_register, 0xAE);
if (asm_io.read_byte(port + registers.data_register) != 0xAE) {
return false;
}
asm_io.write_byte(port + registers.modem_control_register, registers.modem_dtr | registers.modem_rts | registers.modem_out1 | registers.modem_out2);
return true;
}
pub fn initialize_default() bool {
return initialize(ports.default_port);
}
|