kbc.c (1514B)
1 #include <module.h> 2 #include <types.h> 3 #include <pc/kbc/kbc.h> 4 #include <pc/irq/irq.h> 5 #include <pc/io/io.h> 6 #include <interfaceUtilisateur/console/console.h> 7 8 MODULE(Kbc); 9 10 DEPENDANCE_MODULE(Kbc, Irq); 11 DEPENDANCE_MODULE(Kbc, Io); 12 DEPENDANCE_MODULE(Kbc, Console); 13 14 void gestionnaireRequeteInterruptionKbc() { 15 etatKbc->gestionnaireClavier(inb(PORT_KBC_SCANCODE)); 16 } 17 18 void gestionnaireClavierVide(uint8 scancode) { 19 scancode = scancode; 20 } 21 22 void activerClavier() { 23 uint8 ppi = inb(PORT_KBC_PPI); 24 ppi = ppi & ~0x80; 25 outb(PORT_KBC_PPI, ppi); 26 } 27 28 void activerSouris() { 29 30 } 31 32 void desactiverClavier() { 33 uint8 ppi = inb(PORT_KBC_PPI); 34 ppi = ppi | 0x80; 35 outb(PORT_KBC_PPI, ppi); 36 } 37 38 void attenteKbc() { 39 /* Attendre un tampon d'entrée vide */ 40 while ((inb(PORT_KBC_COMMANDE) & 2) == 2); 41 } 42 43 void attenteLectureKbc() { 44 /* Attendre un tampon d'entrée plein */ 45 while ((inb(PORT_KBC_COMMANDE) & 2) != 2); 46 } 47 48 void resetCpu() { 49 attenteKbc(); 50 outb(PORT_KBC_COMMANDE, KBC_DEMMANDE_ECRITURE_CLAVIER); 51 52 attenteKbc(); 53 outb(PORT_KBC_SCANCODE, KBC_RESET_CPU); 54 } 55 56 void definirGestionnaireClavier(GestionnaireClavier gestionnaireClavier) { 57 etatKbc->gestionnaireClavier = gestionnaireClavier; 58 } 59 60 void initKbc (void** etat) { 61 *etat = etatKbc; 62 63 etatKbc->gestionnaireClavier = gestionnaireClavierVide; 64 65 definirGestionnaireRequeteInterruption(LIGNE_IRQ_CLAVIER, gestionnaireRequeteInterruptionKbc); 66 activerLigneRequeteInterruption(LIGNE_IRQ_CLAVIER); 67 68 activerClavier(); 69 } 70 71 void deinitKbc (void** etat) { 72 *etat = NULL; 73 }