# 硬體韌體相關協議了解


## PCIe

以前有北橋負責讓 CPU -> RAM/GPU，南橋負責到 USB/SATA/PCI/Audio 等，現在南北橋晶片直接融合到 CPU 裡面，並且透過 PCIe 連接，像是：

* CPU -> GPU
* CPU -> SSD
* CPU -> 網卡
* CPU -> USB Controller

以 CPU -> GPU，常常會用 MMIO，MMIO 就是使用 PCIe 實作，並且還會有 DMA。

## MESI

MESI 協議是一個基於失效的快取一致性協議，是支持寫回（write-back）快取的最常用協議。

## 中斷

* x86 APIC/IOAPIC
* ARM GIC (Generic Interrupt Controller)

現代 PCIe device（GPU / NIC）不用傳線 IRQ，直接用 MSI/MSI-X，用 PCIe transaction 觸發 interrupt。

## MCU 協定

1. UART: 最簡單的協定，不能遠距離傳且通信速度慢，一對一，要設定 baud rate
2. RS232, RS485: 因為 UART 使用 TTL，不能遠距離傳輸，所以多了這兩個協定，其中 RS485 可以一對多
   他是 UART 的「電氣規格升級」
3. SPI: 因為 UART 是要設定兩方共同的通訊速度，但這會導致不能送太快，所以 SPI 使用 clock 讓他可以送很快
   每 bit 都有 timing guarantee，沒有 start/stop bit overhead，全雙工
4. I2C: 一對多 master/slave 架構，兩條線，半雙工，每個 device 有 address，共享 bus arbitration
5. Canbus: 多個 master 架構，主要用在車用跟工業控制
6. GPIO + EXTI（interrupt system）
7. ADC / DAC
8. PWM / Timer
9. SDIO / MMC
10. QSPI / OSP
11. Ethernet

### UART

只有三條線：

1. TX
2. RX
3. GND

沒有 Clock，非同步，主要用在 Console/Debug log，會用在各種地方，像是：

1. Boot ROM
2. GPU ROM
3. BMC 也有

以電腦可能要用 USB 連接，所以會有 USB-UART bridge chip。

### I2C

低速，控制、板級管理（management / control plane）協議，使用兩條線通訊 SDA（data）/SCL（clock），像是：

* GPU 透過 I2C 讀取外部 sensor 溫度
* GPU -> I2C -> EEPROM
* GPU -> I2C -> fan controller
* CPU -> I2C -> PMIC 控制器

## Reference

* [UART那么好用，为什么单片机还需要I2C和SPI？](https://www.youtube.com/watch?v=UGKT2OPyz1U)

