41 | | Les IRQ (Interrupt !ReQuest)s sont des signaux électriques à 2 états (ON/OFF ou !Actif/Inactif ou encore !Levé/Baissé). Les IRQ sont levés par les contrôleurs de périphériques pour prévenir d'un événement (fin de commande, arrivée d'une donnée, etc.). Les IRQs provoquent l'exécution d'ISR (Interrupt Service Routine) par le noyau. Les ISR sont des fonctions qui reçoivent en argument un identifiant du contrôleur de périphérique qui a levé l'IRQ. Une ISR doit faire deux choses, (1) accéder aux registres du contrôleur de périphérique concerné pour faire ce que le périphérique demande et (2) acquitter l'IRQ, c'est-à-dire demander au contrôleur de périphérique de baisser/désactiver son IRQ (puisque celle-ci a été traitée). |
| 41 | Les IRQ (Interrupt !ReQuest)s sont des signaux électriques à 2 états (ON/OFF ou !Actif/Inactif ou encore !Levé/Baissé). Les IRQ sont levés par les contrôleurs de périphériques pour prévenir d'un événement (fin de commande, arrivée d'une donnée, etc.). Les IRQs provoquent l'exécution d'ISR (Interrupt Service Routine) par le noyau. Les ISR sont des fonctions qui reçoivent en argument un identifiant du contrôleur de périphérique qui a levé l'IRQ. Une ISR doit faire deux choses, (1) accéder aux registres du contrôleur de périphérique concerné pour faire ce que le périphérique demande et (2) acquitter l'IRQ, c'est-à-dire demander au contrôleur de périphérique de baisser/désactiver son IRQ (puisque celle-ci a été traitée). La demande d'acquittement est spécifique à chaque contrôleur de périphérique. Pour le TTY, il faut lire le registre `TTY_READ`. Pour le TIMER, il faut écrire dans le registre `TIMER_RSTIRQ`. |
87 | | * __tty_regs_map = 0xd0200000 ; |
88 | | * __icu_regs_map = 0xd2200000 ; |
89 | | * __timer_regs_map = 0xd3200000 ; |
90 | | * Ces adresses sont définies dans le ldscript du kernel `kernel.ld` |
| 87 | * `__tty_regs_map` = `0xd0200000` ; |
| 88 | * `__icu_regs_map` = `0xd2200000` ; |
| 89 | * `__timer_regs_map` = `0xd3200000` ; |
| 90 | * Ces adresses sont définies dans le ldscript du kernel `kernel.ld`, elles doivent être déclarées `extern` dans les codes C qui les utilisent. |
171 | | 1. Que signifie acquitter une IRQ et qui le demande à qui ? |
172 | | {{{#!protected ------------------------------------------------------------------------------------ |
173 | | '' |
174 | | * Cela signifie baisser ou désactiver le signal IRQ et c'est l'ISR qui fait cette demande au contrôleur de périphérique concerné. |
| 171 | 1. Que signifie acquitter une IRQ et qui le demande à qui ? Comment demande-t-on l'acquittement ? |
| 172 | {{{#!protected ------------------------------------------------------------------------------------ |
| 173 | '' |
| 174 | * Cela signifie demander au contrôleur de périphérique concerné de baisser (désactiver) le signal IRQ. C'est l'ISR qui fait cette demande en accédant aux registres du contrôleur de périphérique. Chaque périphérique a sa propre méthode d'acquittement (il faut lire la documentation), pour le TTY, l'acquittement est fait en lisant le registre TTY_READ, pour le TIMER, l'acquittement est fait en écrivant n'importe quelle valeur dans le registre TIMER_RSTIRQ. |