/trunk/kernel/genarch/src/kbd/key.c |
---|
67,11 → 67,11 |
{ |
spinlock_lock(&keylock); |
switch (sc) { |
case SC_LSHIFT: |
case SC_RSHIFT: |
case SC_LSHIFT: |
case SC_RSHIFT: |
keyflags &= ~PRESSED_SHIFT; |
break; |
case SC_CAPSLOCK: |
case SC_CAPSLOCK: |
keyflags &= ~PRESSED_CAPSLOCK; |
if (lockflags & LOCKED_CAPSLOCK) |
lockflags &= ~LOCKED_CAPSLOCK; |
78,7 → 78,7 |
else |
lockflags |= LOCKED_CAPSLOCK; |
break; |
default: |
default: |
break; |
} |
spinlock_unlock(&keylock); |
/trunk/kernel/genarch/src/kbd/z8530.c |
---|
41,6 → 41,7 |
#include <arch/drivers/fhc.h> |
#include <arch/drivers/z8530.h> |
#include <arch/interrupt.h> |
#include <arch/drivers/kbd.h> |
#include <cpu.h> |
#include <arch/asm.h> |
#include <arch.h> |
48,6 → 49,8 |
#include <console/chardev.h> |
#include <console/console.h> |
#include <interrupt.h> |
#include <sysinfo/sysinfo.h> |
#include <print.h> |
/* |
* These codes read from z8530 data register are silently ignored. |
54,6 → 57,8 |
*/ |
#define IGNORE_CODE 0x7f /* all keys up */ |
bool z8530_belongs_to_kernel = true; |
static void z8530_suspend(chardev_t *); |
static void z8530_resume(chardev_t *); |
69,11 → 74,13 |
/** Initialize keyboard and service interrupts using kernel routine */ |
void z8530_grab(void) |
{ |
z8530_belongs_to_kernel = true; |
} |
/** Resume the former interrupt vector */ |
void z8530_release(void) |
{ |
z8530_belongs_to_kernel = false; |
} |
/** Initialize z8530. */ |
82,14 → 89,24 |
chardev_initialize("z8530_kbd", &kbrd, &ops); |
stdin = &kbrd; |
sysinfo_set_item_val("kbd", NULL, true); |
sysinfo_set_item_val("kbd.irq", NULL, 0); |
sysinfo_set_item_val("kbd.address.virtual", NULL, (uintptr_t) kbd_virt_address); |
(void) z8530_read_a(RR8); |
z8530_write_a(WR1, WR1_IARCSC); /* interrupt on all characters */ |
/* |
* Clear any pending TX interrupts or we never manage |
* to set FHC UART interrupt state to idle. |
*/ |
z8530_write_a(WR0, WR0_TX_IP_RST); |
z8530_write_a(WR1, WR1_IARCSC); /* interrupt on all characters */ |
/* 8 bits per character and enable receiver */ |
z8530_write_a(WR3, WR3_RX8BITSCH | WR3_RX_ENABLE); |
z8530_write_a(WR9, WR9_MIE); /* Master Interrupt Enable. */ |
z8530_write_a(WR9, WR9_MIE); /* Master Interrupt Enable. */ |
/* |
* We need to initialize the FireHose Controller, |
/trunk/kernel/genarch/src/fb/fb.c |
---|
60,12 → 60,16 |
static unsigned int scanline = 0; |
static unsigned int bitspp = 0; |
static unsigned int pixelbytes = 0; |
#ifdef FB_INVERT_COLORS |
static bool invert_colors = true; |
#else |
static bool invert_colors = false; |
#endif |
static unsigned int position = 0; |
static unsigned int columns = 0; |
static unsigned int rows = 0; |
#define COL_WIDTH 8 |
#define ROW_BYTES (scanline * FONT_SCANLINES) |
85,6 → 89,11 |
static void (*rgb2scr)(void *, int); |
static int (*scr2rgb)(void *); |
static inline int COLOR(int color) |
{ |
return invert_colors ? ~color : color; |
} |
/* Conversion routines between different color representations */ |
static void rgb_4byte(void *dst, int rgb) |
{ |
159,11 → 168,11 |
static void putpixel(unsigned int x, unsigned int y, int color) |
{ |
(*rgb2scr)(&fbaddress[POINTPOS(x,y)],color); |
(*rgb2scr)(&fbaddress[POINTPOS(x,y)], COLOR(color)); |
if (dbbuffer) { |
int dline = (y + dboffset) % yres; |
(*rgb2scr)(&dbbuffer[POINTPOS(x,dline)],color); |
(*rgb2scr)(&dbbuffer[POINTPOS(x,dline)], COLOR(color)); |
} |
} |
172,9 → 181,9 |
{ |
if (dbbuffer) { |
int dline = (y + dboffset) % yres; |
return (*scr2rgb)(&dbbuffer[POINTPOS(x,dline)]); |
return COLOR((*scr2rgb)(&dbbuffer[POINTPOS(x,dline)])); |
} |
return (*scr2rgb)(&fbaddress[POINTPOS(x,y)]); |
return COLOR((*scr2rgb)(&fbaddress[POINTPOS(x,y)])); |
} |
274,7 → 283,7 |
byte = helenos_bits[rowbytes * y + x / 8]; |
byte >>= x % 8; |
if (byte & 1) |
putpixel(startx + x, starty + y, LOGOCOLOR); |
putpixel(startx + x, starty + y, COLOR(LOGOCOLOR)); |
} |
} |
397,6 → 406,7 |
sysinfo_set_item_val("fb.bpp-align", NULL, align); |
sysinfo_set_item_val("fb.scanline", NULL, scan); |
sysinfo_set_item_val("fb.address.physical", NULL, addr); |
sysinfo_set_item_val("fb.invert-colors", NULL, invert_colors); |
/* Allocate double buffer */ |
int totsize = scanline * yres; |
416,9 → 426,11 |
blankline = (uint8_t *) malloc(ROW_BYTES, FRAME_ATOMIC); |
if (!blankline) |
panic("Failed to allocate blank line for framebuffer."); |
for (y=0; y < FONT_SCANLINES; y++) |
for (x=0; x < xres; x++) |
(*rgb2scr)(&blankline[POINTPOS(x,y)],BGCOLOR); |
for (y=0; y < FONT_SCANLINES; y++) { |
for (x=0; x < xres; x++) { |
(*rgb2scr)(&blankline[POINTPOS(x,y)], COLOR(BGCOLOR)); |
} |
} |
clear_screen(); |