Subversion Repositories HelenOS

Rev

Rev 4347 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4347 Rev 4348
Line 33... Line 33...
33
/** @file
33
/** @file
34
 * @brief   NS16550 port driver.
34
 * @brief   NS16550 port driver.
35
 */
35
 */
36
 
36
 
37
#include <ipc/ipc.h>
37
#include <ipc/ipc.h>
-
 
38
#include <ipc/bus.h>
38
#include <async.h>
39
#include <async.h>
39
#include <sysinfo.h>
40
#include <sysinfo.h>
40
#include <kbd.h>
41
#include <kbd.h>
41
#include <kbd_port.h>
42
#include <kbd_port.h>
-
 
43
#include <sun.h>
42
#include <ddi.h>
44
#include <ddi.h>
43
 
45
 
44
/* NS16550 registers */
46
/* NS16550 registers */
45
#define RBR_REG     0   /** Receiver Buffer Register. */
47
#define RBR_REG     0   /** Receiver Buffer Register. */
46
#define IER_REG     1   /** Interrupt Enable Register. */
48
#define IER_REG     1   /** Interrupt Enable Register. */
Line 87... Line 89...
87
static void ns16550_irq_handler(ipc_callid_t iid, ipc_call_t *call);
89
static void ns16550_irq_handler(ipc_callid_t iid, ipc_call_t *call);
88
 
90
 
89
static uintptr_t ns16550_physical;
91
static uintptr_t ns16550_physical;
90
static uintptr_t ns16550_kernel;
92
static uintptr_t ns16550_kernel;
91
 
93
 
92
int kbd_port_init(void)
94
int ns16550_port_init(void)
93
{
95
{
94
    void *vaddr;
96
    void *vaddr;
95
 
97
 
96
    async_set_interrupt_received(ns16550_irq_handler);
98
    async_set_interrupt_received(ns16550_irq_handler);
97
 
99
 
98
    ns16550_physical = sysinfo_value("kbd.address.physical");
100
    ns16550_physical = sysinfo_value("kbd.address.physical");
99
    ns16550_kernel = sysinfo_value("kbd.address.kernel");
101
    ns16550_kernel = sysinfo_value("kbd.address.kernel");
100
    ns16550_kbd.cmds[0].addr = (void *) (ns16550_kernel + LSR_REG);
102
    ns16550_kbd.cmds[0].addr = (void *) (ns16550_kernel + LSR_REG);
101
    ns16550_kbd.cmds[3].addr = (void *) (ns16550_kernel + RBR_REG);
103
    ns16550_kbd.cmds[3].addr = (void *) (ns16550_kernel + RBR_REG);
102
    ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(),
104
    ipc_register_irq(sysinfo_value("kbd.inr"), device_assign_devno(),
103
        0, &ns16550_kbd);
105
        sysinfo_value("kbd.inr"), &ns16550_kbd);
104
    return pio_enable((void *) ns16550_physical, 8, &vaddr);
106
    return pio_enable((void *) ns16550_physical, 8, &vaddr);
105
}
107
}
106
 
108
 
-
 
109
void ns16550_port_yield(void)
-
 
110
{
-
 
111
}
-
 
112
 
-
 
113
void ns16550_port_reclaim(void)
-
 
114
{
-
 
115
}
-
 
116
 
107
static void ns16550_irq_handler(ipc_callid_t iid, ipc_call_t *call)
117
static void ns16550_irq_handler(ipc_callid_t iid, ipc_call_t *call)
108
{
118
{
109
    int scan_code = IPC_GET_ARG2(*call);
119
    int scan_code = IPC_GET_ARG2(*call);
110
    kbd_push_scancode(scan_code);
120
    kbd_push_scancode(scan_code);
-
 
121
   
-
 
122
    if (cir_service)
-
 
123
        async_msg_1(cir_phone, BUS_CLEAR_INTERRUPT,
-
 
124
            IPC_GET_METHOD(*call));
111
}
125
}
112
 
126
 
113
/**
127
/**
114
 * @}
128
 * @}
115
 */
129
 */