From 3eb651393afe2792b77b26b83ff95646a7316670 Mon Sep 17 00:00:00 2001 From: d0p1 Date: Tue, 31 May 2022 13:41:57 +0200 Subject: [PATCH] wip uart8250 --- .../communication-serie/UART8250.md" | 69 +++++++++++++++++-- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git "a/src/p\303\251riph\303\251riques/communication-serie/UART8250.md" "b/src/p\303\251riph\303\251riques/communication-serie/UART8250.md" index 697d85d..ad1980c 100644 --- "a/src/p\303\251riph\303\251riques/communication-serie/UART8250.md" +++ "b/src/p\303\251riph\303\251riques/communication-serie/UART8250.md" @@ -24,21 +24,78 @@ ### Transmit Holding Register (THR) -Tout ce qui sera ecrit sur ce registre sera transmis en liaison série. +Tout ce qui sera ecrit sur ce registre sera transmis par l'UART. ### Receive Buffer Register (RBR) +Tout ce qui est reçu par l'UART sur la laison série sera accessible sur ce registre. +### Interrupt Enable Register (IER) -## Interrupt Enable Register (IER) +| 7-4 | 3 | 2 | 1 | 0 | +|---------|--------------|----------------------|-----------|-------------------------| +| reservé | MODEM Status | Receiver Line Status | THR Empty | Received Data Available | -| 7-4 | 3 | 2 | 1 | 0 | -|----------|--------------|----------------------|-----------|-------------------------| -| reserved | MODEM Status | Receiver Line Status | THR Empty | Received Data Available | +- **__Received Data Available__**: Si le bit est à 1 alors une interruption sera généré à la réception d'un charactère. +- **__THR Empty__**: si le bit est à 1 alors une interruption sera généré quand il sera possible d'écrire à nouveau dans le registre **THR** -## Interrupt Identification Register (IIR) +### Interrupt Identification Register (IIR) +### Line Control Register (LCR) +### Modem Control Register (MCR) + +### Line Status Register (LSR) + +### Modem Status Register (MSR) + +### Scratch Register (SCR) + +### Divisor Latch LSB (DLL) & Divisor Latch MSB (DLH) + +| Baud Rate | 1.8432Mhz | 3.072 MHz | 8.0 MHz | +|-----------|-----------|-----------|---------| +| 50 | 2304 | 3840 | 10000 | +| 75 | 1536 | 2560 | 6667 | +| 110 | 1047 | 1745 | 4545 | +| 134.5 | 857 | 1428 | 3717 | +| 150 | 768 | 1280 | 3333 | +| 300 | 384 | 640 | 1667 | +| 600 | 192 | 320 | 833 | +| 1200 | 96 | 160 | 417 | +| 1800 | 64 | 107 | 277 | +| 2000 | 58 | 96 | 250 | +| 2400 | 48 | 80 | 208 | +| 3600 | 32 | 53 | 139 | +| 4800 | 24 | 40 | 104 | +| 7200 | 16 | 27 | 69 | +| 9600 | 12 | 20 | 52 | +| 19200 | 6 | 10 | 26 | +| 38400 | 3 | 5 | 13 | +| 56000 | 2 | - | 9 | +| 128000 | - | - | 4 | + +Pour l'IBM PC la clock est de 1.8432Mhz + +## Exemple (en pseudo C) + +Partons du principe que nous avont `uart8250_write` permetant d'ecrire une valeur dans un registre et `uart8250_read` permetant de lire la valeur d'un registre. + +### Initialisation de l'UART + +```c + /* on desactive les interuptions en metant IER à zero */ + uart8250_write(IER, 0x0); + + /* DLAB à 1 */ + uart8250_write(LCR, (1 << 7)); + + /* 9600 baud donc un diviseur de 12 (voir le tableau) */ + uart8250_write(DLH, 0x0); + uart8250_write(DLL, 0xC); + + /* TODO */ +``` ## Références