<!--
  notes.md - Misc notes

  Copyright (C) 2024-2025  Luke T. Shumaker <lukeshu@lukeshu.com>
  SPDX-License-Identifier: AGPL-3.0-or-later
-->

Which file to include:

> The <stdint.h> header is a subset of the <inttypes.h> header

|------------------------------------------|-----------------------------------|--------------------------------|
| C INTS                                   |                                   |                                |
| `{CHAR,SHRT,INT,LONG,LLONG}_{MIN,MAX}`   | `<limits.h>`                      |                                |
| `U{CHAR,SHRT,INT,LONG,LLONG}_MAX`        | `<limits.h>`                      |                                |
|------------------------------------------|-----------------------------------|--------------------------------|
| C SIZED INTS                             |                                   |                                |
| `(u)int{n}_t` (and `_{MIN,MAX,C}`)       | `<stdint.h>`                      | exact                          |
| `(u)int_least{n}_t` (and `_{MIN,MAX,C}`) | `<stdint.h>`                      | type may be more than `n` bits |
| `(u)int_fast{n}_t` (and `_{MIN,MAX,C}`)  | `<stdint.h>`                      | type may be more than `n` bits |
| `(u)intptr_t` (and `_{MIN,MAX,C}`)       | `<stdint.h>`                      |                                |
| `(u)intmax_t` (and `_{MIN,MAX,C}`)       | `<stdint.h>`                      |                                |
| `PRI*`                                   | `<inttypes.h>`                    |                                |
| `SCN*`                                   | `<inttypes.h>`                    |                                |
|------------------------------------------|-----------------------------------|--------------------------------|
| C ADDRESS INTS                           |                                   |                                |
| `ptrdiff_t`                              | `<stddef.h>`                      |                                |
| `PTRDIFF_{MIN,MAX}`                      | `<stdint.h>`                      |                                |
| `size_t`                                 | `<stddef.h>` (or `<sys/types.h>`) |                                |
| `SIZE_MAX`                               | `<stdint.h>`                      |                                |
|------------------------------------------|-----------------------------------|--------------------------------|
| C WCHAR INTS                             |                                   |                                |
| `wchar_t`                                | `<stddef.h>`                      |                                |
| `WCHAR_{MIN,MAX}`                        | `<stdint.h>`                      |                                |
| `wint_t`                                 | `<wchar.h>`                       |                                |
| `WINT_{MIN,MAX}`                         | `<stdint.h>`                      |                                |
|------------------------------------------|-----------------------------------|--------------------------------|
| POSIX INTS                               |                                   |                                |
| `sig_atomic_t`                           | `<signal.h>`                      |                                |
| `SIG_ATOMIC_{MIN,MAX}`                   | `<stdint.h>`                      |                                |
| `mode_t`                                 | `<sys/types.h>`                   | unsigned                       |
| `dev_t`                                  | `<sys/types.h>`                   | unsigned                       |
| `nlink_t`                                | `<sys/types.h>`                   | unsigned                       |
| `{u,g,}id_t`                             | `<sys/types.h>`                   | unsigned                       |
| `blkcnt_t`                               | `<sys/types.h>`                   | signed                         |
| `off_t`                                  | `<sys/types.h>`                   | signed                         |
| `fsblkcnt_t`                             | `<sys/types.h>`                   | unsigned                       |
| `fsfilecnt_t`                            | `<sys/types.h>`                   | unsigned                       |
| `ino_t`                                  | `<sys/types.h>`                   | unsigned                       |
| `blksize_t`                              | `<sys/types.h>`                   | signed                         |
| `pid_t`                                  | `<sys/types.h>`                   | signed                         |
| `ssize_t`                                | `<sys/types.h>`                   | signed                         |
| `SSIZE_MAX`                              | `<limits.h>`                      | not in newlib                  |
| `suseconds_t`                            | `<sys/types.h>`                   | signed                         |
| `clock_t`                                | `<sys/types.h>`                   | could be float                 |
| `time_t`                                 | `<sys/types.h>`                   | signed                         |


Here's my reading of the lowest-bitrate possible for our HDMI sink:

HDMI v1.4 (2009/06/05) § 6.2.1 "Format Support Requirements"

>  - An HDMI Source shall support at least one of the following video
>    format timings:
>     + 640x480p @ 59.94/60Hz
>     + 720x480p @ 59.94/60Hz
>     + 720x576p @ 50Hz
> …
>
> - An HDMI Sink that accepts 60Hz video formats shall support the
>   640x480p @ 59.94/60Hz and 720x480p @ 59.94/60Hz video format
>   timings
>
> - An HDMI Sink that accepts 50Hz video formats shall support the
>   640x480p @ 59.94/60Hz and 720x576p @ 50Hz video format timings.

These latter 2 requirements match what is in CEI-861-D §3.1 "General
Video Format requirements" Table 1.

I'm a little confused about the 50Hz systems requirement; if it
needs to support 640x480@60Hz, does that mean that it's *also* a 60Hz
system and must therefore also support 720x480@60Hz?

Anyway, I need to support at least 640x480p@60Hz and 720x480@60Hz, and
it would be nice to support 720x576p@50Hz.  Note that PicoDVI supports
these first two, but not the @50Hz one.

| format        | bitrate               |
|---------------|-----------------------|
| 640x480p@60Hz | 18,432,000 pixels/sec |
| 720x480p@60Hz | 20,736,000 pixels/sec |
| 720x576p@50Hz | 20,736,000 pixels/sec |

https://forums.parallax.com/discussion/download/128730/Hdmi-1.4-1000008562-6364143185282736974850538.pdf
https://ia803002.us.archive.org/1/items/CEA-861-D/CEA-861-D.pdf

The RP2040 has several clocks:

Sources:

- GPCLK0 (GPIO-based clock 0)
- GPCLK1 (GPIO-based clock 1)
- XOSC (External (Crystal) Oscillator)
  + System PLL
  + USB PLL
- ROSC (Ring Oscillator)

These can be muxed onto several clocks which each have dividers (and
most of them enable/disable too):

- clk_gpout0 (GPIO Muxing)
- clk_gpout1 (GPIO Muxing)
- clk_gpout2 (GPIO Muxing)
- clk_gpout3 (GPIO Muxing)
- clk_adc (ADC)
- clk_usb (USB)
- clk_RTC (RTC)
- clk_peri (UART and SPI)
- clk_sys (CPU, bus, RAM)
- clk_ref (watchdog and timers)

```
SSP = ARM Primecell Synchronous Serial Port
                    ^           ^      ^
```

- SPI (Serial Peripheral Interface - Motorola)
- SSI (Synchronous Serial Interface - Texas Instruments)
- Microwire (National Semiconductor)

| `sclk` | `SSPCLKOUT` | `SSP_CLK_OUT` | SSP clock output              |
| `ss_n` | `SSPFSSOUT` | `SSP_FSS_OUT` | SSP frame/slave select output |
| `tx`   | `SSPTXD`    | `SSP_TX_D`    | SSP transmit data             |
| `rd`   | `SSPRXD`    | `SSP_RX_D`    | SSP receive data              |

"The SPI uses `clk_peri` as its reference clock for SPI timing, and is
referred to as `SSPCLK` in the following sections.  `clk_sys` is used
as the bus clock, and is referred to as `PCLK` in the following
sections" wut does that mean

8 16-bit values in both the TX buffer and the RX buffer

| Ver. 1.0.0 | 2013-08-01 | https://www.alldatasheet.com/datasheet-pdf/view/554784/ETC2/W5500.html https://www.alldatasheet.com/pdfjsview/web/viewer.html?file=//www.alldatasheet.com/datasheet-pdf/view/554784/ETC2/W5500/+_44J97VwSw9bZYvAB+/datasheet.pdf |
| Ver. 1.0.1 | 2013-09-13 |                                                                                                                                                                                                                                  |
| Ver. 1.0.2 | 2013-11-14 | https://cdn.sparkfun.com/datasheets/Dev/Arduino/Shields/W5500_datasheet_v1.0.2_1.pdf                                                                                                                                             |
| Ver. 1.0.3 | 2014-05-29 |                                                                                                                                                                                                                                  |
| Ver. 1.0.4 | 2014-06-13 |                                                                                                                                                                                                                                  |
| Ver. 1.0.5 | 2014-11-10 |                                                                                                                                                                                                                                  |
| Ver. 1.0.6 | 2014-12-30 |                                                                                                                                                                                                                                  |
| Ver. 1.0.7 | 2016-02-24 |                                                                                                                                                                                                                                  |
| Ver. 1.0.8 | 2017-05-19 | https://docs.wiznet.io/img/products/w5500/w5500_ds_v108e.pdf (on-page version and date are wrong)                                                                                                                                |
| Ver. 1.0.9 | 2019-05-22 | https://docs.wiznet.io/img/products/w5500/w5500_ds_v109e.pdf                                                                                                                                                                     |
| Ver. 1.1.0 | 2022-12-17 | https://docs.wiznet.io/img/products/w5500/W5500_ds_v110e.pdf                                                                                                                                                                     |

https://github.com/Bodmer/TFT_eSPI/discussions/2432

----

The theoretical max rate of the the W5500 is just shy of 80 Mb/s = 10 MB/s

IDK about HDMI compression yet, but naively uncompressed we're looking
at wanting to shove ~60 MB/s (480 Mb/s).

Compression is an optional feature introduced in HDMI 2.1 :(

----

PIO-based USB needs the system clock to be a multiple of 120mhz