Changeset 152


Ignore:
Timestamp:
Jul 6, 2017, 3:47:20 PM (7 years ago)
Author:
max@…
Message:

add a basic RS232 COM1 implementation

Location:
trunk/hal/x86_64/core
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/hal/x86_64/core/hal_apic.c

    r145 r152  
    114114/* -------------------------------------------------------------------------- */
    115115
     116#define BAUDRATE        19200
     117#define BAUDRATE_DIV    (115200 / BAUDRATE)
     118
     119#define RS232_COM1_BASE 0x3F8
     120
     121#define RS232_DATA      0x00
     122#define RS232_IER       0x01
     123#       define IER_RD           0x01
     124#       define IER_TBE          0x02
     125#       define IER_ER_BRK       0x04
     126#       define IER_RS232IN      0x08
     127#define RS232_DIVLO     0x00    /* when DLAB = 1 */
     128#define RS232_DIVHI     0x01    /* when DLAB = 1 */
     129#define RS232_IIR       0x02
     130#define RS232_LCR       0x03
     131#       define LCR_DATA5        0x00
     132#       define LCR_DATA6        0x01
     133#       define LCR_DATA7        0x02
     134#       define LCR_DATA8        0x03
     135#       define LCR_TWOSTOP      0x04
     136#       define LCR_PARITY       0x08
     137#       define LCR_EVEN         0x10
     138#       define LCR_STICK        0x20
     139#       define LCR_DLAB         0x80
     140#define RS232_MCR       0x04
     141#       define MCR_DTR          0x01
     142#       define MCR_RTS          0x02
     143#       define MCR_ELL          0x04
     144#       define MCR_IR           0x40
     145#define RS232_LSR       0x05
     146#       define LSR_DR           0x01
     147#       define LSR_OVR          0x02
     148#       define LSR_PE           0x04
     149#       define LSR_FE           0x08
     150#       define LSR_BRK          0x10
     151#       define LSR_TBE          0x20
     152#       define LSR_TE           0x40
     153#define RS232_MSR       0x06
     154#       define MSR_DCTS         0x01
     155#       define MSR_DDSR         0x02
     156#       define MSR_DRI          0x04
     157#       define MSR_DDCD         0x08
     158#       define MSR_CTS          0x10
     159#       define MSR_DSR          0x20
     160#       define MSR_RI           0x40
     161#       define MSR_DCD          0x80
     162
     163#define RS232_SCRATCH   0x07
     164
     165static bool_t hal_com_received()
     166{
     167        return (in8(RS232_COM1_BASE + RS232_LSR) & LSR_DR) != 0;
     168}
     169
     170static bool_t hal_com_transmit_empty()
     171{
     172        return (in8(RS232_COM1_BASE + RS232_LSR) & LSR_TBE) != 0;
     173}
     174
     175char hal_com_read()
     176{
     177        while (!hal_com_received());
     178        return in8(RS232_COM1_BASE + RS232_DATA);
     179}
     180
     181void hal_com_send(char c)
     182{
     183        uint8_t mcr = in8(RS232_COM1_BASE + RS232_MCR);
     184        out8(RS232_COM1_BASE + RS232_MCR, mcr | MCR_RTS);
     185
     186        while (!hal_com_transmit_empty());
     187        out8(RS232_COM1_BASE + RS232_DATA, c);
     188
     189        out8(RS232_COM1_BASE + RS232_MCR, mcr);
     190}
     191
     192static void hal_com_init()
     193{
     194        /* Disable all interrupts */
     195        out8(RS232_COM1_BASE + RS232_IER, 0x00);
     196
     197        /* Set baudrate */
     198        out8(RS232_COM1_BASE + RS232_LCR, LCR_DLAB);
     199        out8(RS232_COM1_BASE + RS232_DIVLO, BAUDRATE_DIV);
     200        out8(RS232_COM1_BASE + RS232_DIVHI, 0);
     201
     202        /* 8bits, no parity, one stop bit */
     203        out8(RS232_COM1_BASE + RS232_LCR, LCR_DATA8);
     204
     205        /* Enable IRQs, DTR set, and also DSR */
     206        out8(RS232_COM1_BASE + RS232_IER, IER_RD|IER_RS232IN);
     207        out8(RS232_COM1_BASE + RS232_MCR, MCR_DTR|MCR_IR);
     208        out8(RS232_COM1_BASE + RS232_MSR, MSR_DSR);
     209}
     210
     211/* -------------------------------------------------------------------------- */
     212
    116213size_t ioapic_pins __in_kdata = 0;
    117214paddr_t ioapic_pa __in_kdata = 0;
     
    193290        x86_printf("IOAPICPINS: #%z\n", ioapic_pins);
    194291
    195         /* Now, enable the keyboard */
     292        /* Now, enable the com1 port and the keyboard */
     293        hal_ioapic_set_entry(IRQ_COM1, IOAPIC_COM1_VECTOR, 0);
    196294        hal_ioapic_set_entry(IRQ_KEYBOARD, IOAPIC_KEYBOARD_VECTOR, 0);
    197295}
     
    309407        /* Enable the IOAPIC */
    310408        hal_ioapic_init();
    311 }
    312 
     409
     410        /* Enable the Serial Port */
     411        hal_com_init();
     412
     413        hal_com_send('p');
     414        hal_com_send('d');
     415        hal_com_send('\n');
     416}
     417
  • trunk/hal/x86_64/core/hal_apic.h

    r146 r152  
    2121
    2222#ifndef x86_ASM
     23char hal_com_read();
     24void hal_com_send(char c);
     25
    2326void hal_ioapic_disable_entry(uint8_t index);
    2427void hal_ioapic_set_entry(uint8_t index, uint8_t vec, uint8_t dest);
  • trunk/hal/x86_64/core/hal_init.c

    r150 r152  
    296296        hal_enable_irq(&dummy);
    297297
     298        while (1);
     299
    298300        kernel_init(&btinfo);
    299301
  • trunk/hal/x86_64/core/hal_interrupt.c

    r142 r152  
    2727
    2828#include <hal_kentry.h>
     29#include <hal_apic.h>
    2930#include <hal_internal.h>
    3031
     
    3738{
    3839        x86_printf("-> got timer: rip=%Z\n", tf->tf_rip);
     40        hal_com_send('h');
     41        return;
     42}
     43
     44/* -------------------------------------------------------------------------- */
     45
     46/*
     47 * Serial Port (COM1) interrupt
     48 */
     49void hal_com1_intr(struct trapframe *tf)
     50{
     51        char c = hal_com_read();
     52
     53        x86_printf("-> got com '%c'\n", c);
    3954        return;
    4055}
  • trunk/hal/x86_64/core/hal_kentry.S

    r146 r152  
    3636        .globl  hal_exception_entry
    3737        .globl  hal_timer_intr
     38        .globl  hal_com1_intr
    3839        .globl  hal_keyboard_intr
    3940        .type   hal_exception_entry, @function
    4041        .type   hal_timer_intr, @function
     42        .type   hal_com1_intr, @function
    4143        .type   hal_keyboard_intr, @function
    4244
     
    133135        movq    %rsp,%rdi
    134136        call    hal_timer_intr
     137
     138        movq    lapic_va(%rip),%rax
     139        movl    $0,LAPIC_EOI(%rax)
     140
     141        INTR_RESTORE_REGS
     142        addq    $16,%rsp
     143        iretq
     144
     145ASM_ENTRY(x86_ioapic_com1)
     146        pushq   $0
     147        pushq   $T_ASTFLT
     148        INTR_SAVE_REGS
     149
     150        movq    %rsp,%rdi
     151        call    hal_com1_intr
    135152
    136153        movq    lapic_va(%rip),%rax
     
    247264
    248265        .quad   x86_lapic_timer
     266        .quad   x86_ioapic_com1
    249267        .quad   x86_ioapic_keyboard
    250268
  • trunk/hal/x86_64/core/hal_segmentation.h

    r143 r152  
    195195
    196196#define DYNVEC_MIN      CPUVEC_MAX
    197 #define DYNVEC_MAX      (DYNVEC_MIN + 6)
     197#define DYNVEC_MAX      (DYNVEC_MIN + 7)
    198198
    199199#define VECTOR_APIC_SPURIOU     (DYNVEC_MIN + 0)
     
    202202#define VECTOR_APIC_XCU_PTI     (DYNVEC_MIN + 3)
    203203
    204 /* debug only, will be removed soon */
     204/* debug only, will be moved soon */
    205205#define LAPIC_TIMER_VECTOR      (DYNVEC_MIN + 4)
    206 #define IOAPIC_KEYBOARD_VECTOR  (DYNVEC_MIN + 5)
     206#define IOAPIC_COM1_VECTOR      (DYNVEC_MIN + 5)
     207#define IOAPIC_KEYBOARD_VECTOR  (DYNVEC_MIN + 6)
    207208
    208209#define NIDT    256     /* total number of IDT entries */
    209210
     211
Note: See TracChangeset for help on using the changeset viewer.