#include "appels_systeme.h" #include "clavier.h" #include "debug.h" #include "interruptions.h" /* pour l'acquittement au intc */ #include "console.h" #include "processus.h" #include "schedule.h" /*clavier.c *driver pour le clavier *detaillant les fonctions principales en rapport avec le clavier *le 02/06/10 par Pierre */ #define ADR_BASE 0x7f800000 /* a changer, ou pas */ /* variable globale : derniere touche enfoncée*/ char CLAV_GLOB; int code_break = 0; int Ctrl_On = 0; int Alt_On = 0; int Maj_On = 0; int echo = 1; char tampon_clav[taille_buffer]; char *curr_read; char *curr_write; char PS2_traduction(char c) { switch (c) { case 0x1C : return 0x61; case 0x32 : return 0x62; case 0x21 : return 0x63; case 0x23 : return 0x64; case 0x24 : return 0x65; case 0x2B : return 0x66; case 0x34 : return 0x67; case 0x33 : return 0x68; case 0x43 : return 0x69; case 0x3B : return 0x6A; case 0x42 : return 0x6B; case 0x4B : return 0x6C; case 0x3A : return 0x6D; case 0x31 : return 0x6E; case 0x44 : return 0x6F; case 0x4D : return 0x70; case 0x15 : return 0x71; case 0x2D : return 0x72; case 0x1B : return 0x73; case 0x2C : return 0x74; case 0x3C : return 0x75; case 0x2A : return 0x76; case 0x1D : return 0x77; case 0x22 : return 0x78; //a //b //c //d //e //f //g //h //i //j //k //l //m //n //o //p //q //r //s //t //u //v //w //x -1-
case 0x35 : return 0x79; //y case 0x1A : return 0x7A; //z //les chiffres maintenant case 0x45 : return 0x30; //0 case 0x16 : return 0x31; //1 case 0x1E : return 0x32; //2 case 0x26 : return 0x33; //3 case 0x25 : return 0x34; //4 case 0x2E : return 0x35; //5 case 0x36 : return 0x36; //6 case 0x3D : return 0x37; //7 case 0x3E : return 0x38; //8 case 0x46 : return 0x39; //9 /* Ponctuation */ case 0x0E : return 0x60; //accentgrave case 0x55 : return 0x3D; //= case 0x5C : return 0x5C; //antislash case 0x54 : return 0x5B; // [ case 0x52 : return 0x27; //' case 0x4E : return 0x2D; //- case 0x4C : return 0x3B; //; case 0x41 : return 0x2C; //, case 0x49 : return 0x2E; //. case 0x4A : return 0x2F; // / case 0x5B : return 0x5D; // ] /* Controle */ case 0x66 : return 0x7F; //<- (BKSP) //louche, faut renvoyer le signal DEL... case 0x0D : return 0x09; //TAB case 0x29 : return 0x20; //SPACE case 0x5A : return 0x0D; //ENTER case 0x08 : return 0x1B; //ESC /* Clavier Numerique (sans le /, trop penible a implementer)*/ case 0x7C : return 0x2B; //+ case 0x79 : return 0x0D; //enter case 0x84 : return 0x2D; // - case 0x71 : return 0x2E; //. case 0x70 : return 0x30; //0 case 0x69 : return 0x31; //1 case 0x72 : return 0x32; //2 case 0x7A : return 0x33; //3 case 0x6B : return 0x34; //4 case 0x73 : return 0x35; //5 case 0x74 : return 0x36; //6 case 0x6C : return 0x37; //7 case 0x75 : return 0x38; //8 case 0x7D : return 0x39; //9-2-
default: return 0x00; //null void PS2_get() { char val; unsigned long* adr; char to_kb[2]; /* Acquittement au niveau du contrôleur */ *((unsigned long*)(intc_base_address + IAR)) = (*((unsigned long*)(intc_base_address + IAR))) 0x02; adr = (unsigned long*)(adr_base); /*on ne prend que l'octet qui nous interesse */ val = (char) *adr; /*la on a recupere le make code de la touche reste a le traduire */ if(code_break!= 1) { if(val == (char) 0xF0) { /*c'est le break code*/ code_break = 1; else { if( val == (char) 0x14) { /* la touche Ctrl est appuyée */ Ctrl_On = 1; else if( val == (char) 0x12 val == (char) 0x59) { /* la touche maj est enfoncée */ Maj_On = 1; else if( val == (char) 0x11) { /* la touche alt est enfoncée */ Alt_On = 1; else if(ctrl_on == 1) { if(val == (char) 0x21) { /*signal Ctrl + C, on coupe*/ to_kb[0] = (char) 0x03; to_kb[1] = '\0'; keyboard_data(to_kb); else { /*euh, c'est pas une combinaison programmée, ca! */ else if(maj_on == 1) { if(ps2_traduction(val) >= (char) 0x61 && PS2_traduction(val) <= (char ) 0x7A) { /*c'est un caractere a mettre en majuscule*/ to_kb[0] = PS2_traduction(val) - (char) 0x20; to_kb[1] = '\0'; keyboard_data(to_kb); else { /*euh, c'est pas une combinaison programmée, ca! */ else if(alt_on == 1) { -3-
/*Ici il faudra metre d'eventuels racourcis avec alt +...*/ else if((to_kb[0] = PS2_traduction(val))!= (char) 0x00) { /*cela correspond a une touche autonome */ to_kb[1] = '\0'; keyboard_data(to_kb); else { /*euh ben, elle est pas a utiliser cette touche*/ else { /*break est deja a 1 on le remet a 0 */ code_break = 0; /* et on remet enventuelement les _On a 0 */ if( val == (char) 0x14) { /* la touche Ctrl est appuyée */ Ctrl_On = 0; if( val == (char) 0x12 val == (char) 0x59) { /* la touche maj est enfoncée */ Maj_On = 0; if( val == (char) 0x11) { /* la touche alt est enfoncée */ Alt_On = 0; /* void keyboard_data(char* str) */ /* { */ /* int i = 0; */ /* while ((*(str + i)!= '\0')) { */ /* if (((curr_write + 1) == curr_read) */ /* ((curr_write + 1) == (curr_read + TAILLE_BUFFER))) { */ /* printf("le tampon est plein\n"); */ /* *curr_write = '\r'; */ /* if (echo) { */ /* cons_write("\r", 1); */ /* */ /* curr_write++; */ /* if ((curr_write == (tampon_clav + TAILLE_BUFFER))) { */ /* curr_write = tampon_clav; */ /* */ /* break; */ /* */ /* *curr_write = *(str + i); */ /* if (echo) { */ /* cons_write(str+i, 1); */ /* */ /* curr_write++; */ /* if ((curr_write == (tampon_clav + TAILLE_BUFFER))) { */ /* curr_write = tampon_clav; */ -4-
/* */ /* i++; */ /* */ /* */ int tampon_plein() { if((curr_write + 1 == curr_read) (curr_write == curr_read + TAILLE_BUFFER)) { return 1; else { return 0; void keyboard_data(char *str) { processus_t *p; CLAV_GLOB = *str; if(*(str) == 13) { /* c'est le caractère d'entrée */ *curr_write = '\r'; if (echo) { cons_write(str, 1); if ((p = queue_out(&p_attente_io, processus_t, files_globales))) { p->etat = ACTIVABLE; queue_add(p, &p_activables, processus_t, files_globales, priorite); schedule(); incr_tampon_write(); else if(tampon_plein() == 0) { *curr_write = *str; if (echo) { cons_write(str, 1); incr_tampon_write(); void incr_tampon_write() { curr_write++; if (curr_write > tampon_clav + TAILLE_BUFFER) { curr_write = tampon_clav; void incr_tampon_read() { curr_read++; if (curr_read > tampon_clav + TAILLE_BUFFER) { -5-
curr_read = tampon_clav; char get_clavier() { return CLAV_GLOB; -6-