Skip to content

trying to be less x86 specific #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,3 +32,9 @@
- [Multitâche](x86_64/premiers-pas/06-multitache.md)
- [Tache utilisateur](x86_64/premiers-pas/06-tache-utilisateur.md)
- [Epilogue](x86_64/premiers-pas/06-epilogue.md)
- [périphériques]()
- [cartes réseaux]()
- [e1000](périphériques/cartes-réseaux/E1000.md)
- [RTL8139](périphériques/cartes-réseaux/RTL8139.md)
- [communication série]()
- [UART8250](périphériques/communication-serie/UART8250.md)
7 changes: 7 additions & 0 deletions src/périphériques/cartes-réseaux/E1000.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# E1000

# Références

- [Intel i217 datasheet](https://www.mouser.com/datasheet/2/612/i217-ethernet-controller-datasheet-257741.pdf)
- [Intel 82540EM datasheet](https://www.intel.com/content/dam/doc/manual/pci-pci-x-family-gbe-controllers-software-dev-manual.pdf)

5 changes: 5 additions & 0 deletions src/périphériques/cartes-réseaux/RTL8139.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# RTL8139

# Référence

- [RTL8139D Datasheet](http://realtek.info/pdf/rtl8139d.pdf)
112 changes: 112 additions & 0 deletions src/périphériques/communication-serie/UART8250.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
# UART8250 / UART16550

<div align="center">

[![NS 8250B](https://upload.wikimedia.org/wikipedia/commons/c/ce/UART_chip_NS_8250B.jpg)](https://commons.wikimedia.org/wiki/File:UART_chip_NS_8250B.jpg)

</div>

## Les registres

| Offset | Nom | Ecriture | Lecture |
| -----------------|-----------------------------------------|-----------|---------|
| 0x0 (DLAB == 0) | Transmit Holding Register (THR) | ✔️ | ❌ |
| 0x0 (DLAB == 0) | Receive Buffer Register (RBR) | ❌ | ✔️ |
| 0x1 (DLAB == 0) | Interrupt Enable Register (IER) | ✔️ | ✔️ |
| 0x2 (⚠️UART16550 seulement) | FIFO Control Register (FCR) | ✔️ | ❌ |
| 0x2 | Interrupt Identification Register (IIR) | ❌ | ✔️ |
| 0x3 | Line Control Register (LCR) | ✔️ | ✔️ |
| 0x4 | Modem Control Register (MCR) | ✔️ | ✔️ |
| 0x5 | Line Status Register (LSR) | ✔️ | ✔️ |
| 0x6 | Modem Status Register (MSR) | ✔️ | ✔️ |
| 0x7 | Scratch Register (SCR) | ✔️ | ✔️ |
| 0x0 (DLAB == 1) | Divisor Latch LSB (DLL) | ✔️ | ✔️ |
| 0x1 (DLAB == 1) | Divisor Latch MSB (DLH) | ✔️ | ✔️ |

### Transmit Holding Register (THR)

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)

| 7-4 | 3 | 2 | 1 | 0 |
|---------|--------------|----------------------|-----------|-------------------------|
| reservé | 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)

| 7-3 | 2-1 | 0 |
|---------|--------------|-------------------|
| reservé | Interrupt ID | Interrupt pending |

### Line Control Register (LCR)

| 7 | 6 | 5 | 4 | 3 | 2 | 1-0 |
|------|-----------|--------------|--------------------|---------------|-----------|-----------------|
| DLAB | Set Break | Stick parity | Even Parity Select | Parity enable | Stop Bits | Word length |

### 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

- [8250A UART datasheet](https://web.archive.org/web/20160503070506/http://archive.pcjs.org/pubs/pc/datasheets/8250A-UART.pdf)
- [PC16550D UART datasheet](https://web.archive.org/web/20180826215135/http://www.ti.com/lit/ds/symlink/pc16550d.pdf)