19
« am: 08. October 2012, 20:46 »
Hallo,
ich habe bei meinem Kernel jetzt Multitasking hinzugefügt. Es funktioniert auch ganz gut, doch es gibt jetzt Probleme beim einlesen von Tastatureingaben.
Ich habe die Funktionen getchar() und getn() für die Eingabe von Zeichen und Zahlen. Mit der Back-Space Taste können Zeichen und Ziffern wieder gelöscht werden, doch jetzt funktioniert es nicht mehr. Ich hab das Multitasking zum Test einmal wieder heraus genommen und es funktionierte wieder.
Hier einmal der Code meines Tastaturtreibers:
#include "IO_Ports.h"
#include "stdint.h"
#include "string.h"
#include "stdarg.h"
#ifndef KEYBOARD_H
#define KEYBOARD_H
int eingabe_j_n = 0;
int eingabe_g_k = 0;
#define MAX_SCANCODE 0x3a
char TASTEN_K[MAX_SCANCODE] = {27, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', 'ß', '´', 8, '\t', 'q', 'w', 'e', 'r', 't', 'z', 'u', 'i', 'o', 'p', 'ü', '+' , '\n' , 0 , 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'ö', 'ä', '<', 0, '#', 'y', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '-', 0, 0, 0, ' ', 0};
char TASTEN_G[MAX_SCANCODE] = {27, '!', '"', '§', '$', '%', '&', '/', '(', ')', '=', '?', '`', 8, '\t', 'Q', 'W', 'E', 'R', 'T', 'Z', 'U', 'I', 'O', 'P', 'Ü', '*' , '\n' , 0 , 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Ö', 'Ä', '>', 0, '\'', 'Y', 'X', 'C', 'V', 'B', 'N', 'M', ';', ':', '_', 0, 0, 0, ' ', 0};
void cmd_keyboard(uint8_t cmd)
{
int i = 1;
while (i == 1)
{
if(inb(0x64) & 0x2)
{
}
else
{
i = 0;
}
}
outb(0x60, cmd);
}
uint8_t read_scancode()
{
while (!(inb(0x64) & 0x1))
{
}
uint8_t scancode = inb(0x60);
return scancode;
while(inb(0x64) &0x1)
{
inb(0x60);
}
}
char translate_scancode(uint8_t scancode)
{
if(scancode == 0x2a || scancode == 0x36 || scancode == 0x3a)
{
if(eingabe_g_k == 1)
{
eingabe_g_k = 0;
cmd_keyboard(0xed);
outb(0x60,0x00);
}
else
{
eingabe_g_k = 1;
cmd_keyboard(0xed);
outb(0x60,0x02);
}
return 0;
}
if (scancode > MAX_SCANCODE)
{
return 0;
}
uint8_t i = 0x01;
while(i <= MAX_SCANCODE)
{
if (scancode == i)
{
if(eingabe_g_k == 0)
{
return TASTEN_K[i-1];
}
else if(eingabe_g_k == 1)
{
return TASTEN_G[i-1];
}
}
i++;
}
}
int getchar()
{
A:;
char chr;
while(eingabe_j_n != 1)
{
}
uint8_t scancode = read_scancode();
chr = translate_scancode(scancode);
if(chr == 8)
{
del_last_char();
}
else if (chr != 0)
{
put_char(chr);
}
else if(chr == 0)
{
eingabe_j_n = 0;
goto A;
}
eingabe_j_n = 0;
return chr;
}
int getch()
{
A:;
char chr;
while(eingabe_j_n != 1)
{
}
uint8_t scancode = read_scancode();
chr = translate_scancode(scancode);
if(chr == 0)
{
eingabe_j_n = 0;
goto A;
}
eingabe_j_n = 0;
return chr;
}
int getn()
{
int zahl = 0;
char chr = 0;
while(chr != '\n')
{
chr = getch();
if(chr == 8)
{
zahl = zahl / 10;
del_last_char();
}
else if(chr > 57 || chr < 48)
{
}
else
{
put_char(chr);
int ziffer = chr - 48;
zahl = zahl * 10 + ziffer;
}
}
return zahl;
}
void init_keyboard()
{
set_color(0x0e);kprintf("\tStarte Tastatur...");
while(inb(0x64) &0x1)
{
kprintf(".");
inb(0x60);
}
cmd_keyboard(0xF4);
read_scancode();
set_color(0x06);kprintf("\tTastatur gestartet!\n");set_color(0x07);
}
void handle_keyboard()
{
eingabe_j_n = 1;
}
#endif