Compare commits

..

No commits in common. "main" and "esp32s2" have entirely different histories.

22 changed files with 9070 additions and 7278 deletions

5
.gitignore vendored
View file

@ -1,6 +1 @@
/workdir /workdir
/*.fzpz
output.svg
pinlabels.svg
.DS_Store
.idea

Binary file not shown.

109
README.md
View file

@ -1,104 +1,17 @@
# PrettyPins # PrettyPins
PrettyPins is designed to create lovely pinout diagrams. examples:
![KB2040 pinout diagram](https://cdn-learn.adafruit.com/assets/assets/000/106/984/original/adafruit_products_Adafruit_KB2040_Pinout.png) ```
python3 parser.py "Adafruit Feather RP2040.fzpz" C:\Users\ladyada\Dropbox\micropython\circuitpython\ports\raspberrypi\boards\adafruit_feather_rp2040\pins.c rp2040pins.csv
```
## Requirements ```
The following is a list of required software and files necessary to run PrettyPins: python3 parser.py "Adafruit ItsyBitsy RP2040.fzpz" C:\Users\ladyada\Dropbox\micropython\circuitpython\ports\raspberrypi\boards\adafruit_feather_rp2040\pins.c rp2040pins.csv
* A local clone of the PrettyPins repository ```
* The Fritzing object file for the board for which you are generating a diagram (available [here](https://github.com/adafruit/Fritzing-Library/tree/master/parts))
* An SVG editor, such as InkScape (free and available for all major OS's) or Illustrator (not free, and not available for all major OS's)
* Python 3 installed on your machine
* A local clone of the CircuitPython repository (for boards that support CircuitPython)
* The latest Arduino core for the board-type you're working with installed on your machine (for boards that support Arduino)
* `pip install` the following libraries (in a virtual environment or otherwise):
* `click`
* `lxml`
* `svgutils`
* `svgwrite`
* `xmltodict`
## Running PrettyPins ```
1. Place the Fritzing object file in the PrettyPins directory. python3 parser.py "Adafruit QT Py RP2040.fzpz" C:\Users\ladyada\Dropbox\micropython\circuitpython\ports\raspberrypi\boards\adafruit_qtpy_rp2040\pins.c rp2040pins.csv
2. Run the PrettyPins command as shown below. ```
3. In the case of Arduino support, you must run the command TWICE for the Arduino pins to show up.
4. Open the `output.svg` and `pinlabels.svg` files into your SVG editor.
5. Save the `output.svg` file as something else, such as the name of the board you're diagramming.
* In Illustrator, when you "Save as", click "Ok", (and "Yes" to replacing the file if it already exists), then, under "Advanced Options", change "CSS Properties" to "Presentation Attributes". and "Decimal Places" to "4". Then, click Ok.
6. Copy the different seconds of labels out of `pinlabels.svg` into your working board file, and arrange them properly.
* For pins that are not easily accessible (such as NeoPixels or displays), either draw extra lines to the pin location, or create an icon for the pin next to the board and attach the labels to that.
* If you are replacing an old diagram (as with many of the ATtiny boards), include any notes from the original diagram in the new one.
7. Verify the pin label layout with Kattni by providing a screenshot of your working board file.
8. Finalise the diagram with the pin legend, any text blocks and the title/URL.
9. Save the SVG as follows:
* In Illustrator, do "Save as", click "Ok", (and "Yes" to replacing the file if it already exists), then, under "Advanced Options", change "CSS Properties" to "Presentation Attributes". and "Decimal Places" to "4". Then, click Ok.
* In Inkscape, save the file.
10. Finally, save the file as both a PDF and a PNG as well.
## Upload Files ```python3 parser.py "Adafruit Metro ESP32-S2.fzpz" C:\Users\ladyada\Dropbox\micropython\circuitpython\ports\esp32s2\boards\adafruit_metro_esp32s2\pins.c esp32s2pins.csv -s "^D([0-9])" "IO\1"```
Once you have an SVG, PDF and PNG, you need to upload them to the following locations, and link to them where indicated.
#### The PNG
1. The PNG gets added to the Pinouts page of the guide, rendered, immediately below the board image at the top of the page.
#### The PDF
1. Upload to the board-specific EagleCAD PCB file repository on GitHub.
2. Link under "Files:" on the Downloads page in the applicable board guide.
3. Link on the Pinouts page in the applicable board guide (under the rendered PNG of the diagram).
#### The SVG
1. Upload the SVG to Learn as a file using Media > Upload, under the "Files" section on the Downloads page. Title the file "PrettyPins SVG for Board Name".
## Example PrettyPins Command Structure by Board Type
These are some examples of what the PrettyPins commandline command looks like, based on board chip type. More to be added soon!
#### ATMega328:
ATMega328 does not support CircuitPython.
```python3 parser.py "Adafruit Metro Mini.fzpz" None atmega328pins.csv -s "^IO([0-9])" "D\1"```
#### ATtiny8x
ATtiny8x does not support CircuitPython.
```python parser.py "Adafruit Trinket 3V.fzpz" None attiny8xpins.csv```
#### RP2040:
RP2040 does not have official Arduino support (yet).
```python3 parser.py "Adafruit Feather RP2040.fzpz" path/to/circuitpython/ports/raspberrypi/boards/adafruit_feather_rp2040/pins.c rp2040pins.csv```
```python3 parser.py "Adafruit ItsyBitsy RP2040.fzpz" path/to/circuitpython/ports/raspberrypi/boards/adafruit_itsybitsy_rp2040/pins.c rp2040pins.csv```
```python3 parser.py "Adafruit QT Py RP2040.fzpz" path/to/circuitpython/ports/raspberrypi/boards/adafruit_qtpy_rp2040/pins.c rp2040pins.csv```
#### ESP32-S2:
```python3 parser.py "Adafruit Feather ESP32-S2.fzpz" path/to/circuitpython/ports/espressif/boards/adafruit_feather_esp32s2/pins.c esp32s2pins.csv```
```python3 parser.py "Adafruit Metro ESP32-S2.fzpz" path/to/circuitpython/ports/espressif/boards/adafruit_metro_esp32s2/pins.c esp32s2pins.csv -s "^D([0-9])" "IO\1"```
```python3 parser.py "Adafruit MagTag 2.9in.fzpz" path/to/circuitpython/ports/espressif/boards/adafruit_magtag_2.9_grayscale/pins.c esp32s2pins.csv -s "^D([0-9])" "IO\1"```
```python3 parser.py "Adafruit FunHouse.fzpz" path/to/circuitpython/ports/espressif/boards/adafruit_funhouse/pins.c esp32s2pins.csv -s "^D([0-9])" "IO\1"```
#### ESP32:
```python3 parser.py "Adafruit QT Py ESP32 Pico.fzpz" None -a ../../ArduinoSketches/hardware/espressif/esp32/variants/adafruit_qtpy_esp32 esp32pins.csv```
```python3 parser.py "Adafruit ESP32 Feather V2.fzpz" None -a ../../ArduinoSketches/hardware/espressif/esp32/variants/adafruit_feather_esp32_v2 esp32pins.csv```
```python3 parser.py "Adafruit HUZZAH32 ESP32 Feather.fzpz" None -a ../../ArduinoSketches/hardware/espressif/esp32/variants/feather_esp32 esp32pins.csv```
#### nRF52:
```python3 parser.py "Adafruit Feather nRF52840.fzpz" path/to/circuitpython/ports/nrf/boards/feather_nrf52840_express/pins.c nrf52840pins.csv -a ~/Library/Arduino15/packages/adafruit/hardware/nrf52/0.20.5/variants/feather_nrf52840_express```
```python3 parser.py "Adafruit ItsyBitsy nRF52840.fzpz" path/to/circuitpython/ports/nrf/boards/itsybitsy_nrf52840_express/pins.c nrf52840pins.csv -a ~/Library/Arduino15/packages/adafruit/hardware/nrf52/0.20.5/variants/itsybitsy_nrf52840_express```
```python3 parser.py "Adafruit nRF52840 CLUE.fzpz" path/to/circuitpython/ports/nrf/boards/clue_nrf52840_express/pins.c nrf52840pins.csv -a ~/Library/Arduino15/packages/adafruit/hardware/nrf52/0.20.5/variants/clue_nrf52840```
#### SAMD21:
```python3 parser.py "Adafruit Feather M0 Express.fzpz" path/to/circuitpython/ports/atmel-samd/boards/feather_m0_express/pins.c samd21pins.csv -a ~/Library/Arduino15/packages/adafruit/hardware/samd/variants/feather_m0```

View file

@ -1,26 +0,0 @@
GPIO,ADC,Other,PWM
PD0,,RX,
PD1,,TX,
PD2,,INT0,
PD3,,INT1,OC2B
PD4,,,
PD5,,,OC0B
PD6,,,OC0A
PD7,,,
PB0,,,
PB1,,,OC1A
PB2,,SS,OC1B
PB3,,MOSI,OC2A
PB4,,MISO,
PB5,,SCK,
PC0,A0,,
PC1,A1,,
PC2,A2,,
PC3,A3,,
PC4,A4,SDA,
PC5,A5,SCL,
A6,A6,,
A7,A7,,
,,,
,,,
DESCRIPTION,,,
1 GPIO ADC Other PWM
2 PD0 RX
3 PD1 TX
4 PD2 INT0
5 PD3 INT1 OC2B
6 PD4
7 PD5 OC0B
8 PD6 OC0A
9 PD7
10 PB0
11 PB1 OC1A
12 PB2 SS OC1B
13 PB3 MOSI OC2A
14 PB4 MISO
15 PB5 SCK
16 PC0 A0
17 PC1 A1
18 PC2 A2
19 PC3 A3
20 PC4 A4 SDA
21 PC5 A5 SCL
22 A6 A6
23 A7 A7
24
25
26 DESCRIPTION

View file

@ -1,26 +0,0 @@
GPIO,ADC,Arduino ADC,Other,INT,PWM
PD2,,,RX,INT2,
PD3,,,TX,INT3,
PD1,,,SDA,INT1,
PD0,,,SCL,INT0,OC0B
PD4,ADC8,A6,,,
PC6,,,,,OC3A/OC4A
PD7,ADC10,A7,,,OC4D
PE6,,,,INT6,
PB4,ADC11,A8,,PCINT4,
PB5,ADC12,A9,,PCINT5,OC1A/!OC4B
PB6,ADC13,A10,,PCINT6,OC1B/OC4B
PB7,,,,PCINT7,OC0A/OC1C
PD6,ADC9,A11,,,!OC4D
PC7,,,,,OC4A
PB3,,,MISO,PCINT3,
PB2,,,MOSI,PCINT2,
PB1,,,SCK,PCINT1,
PF7,ADC7,A0,,,
PF6,ADC6,A1,,,
PF5,ADC5,A2,,,
PF4,ADC4,A3,,,
PF1,ADC1,A4,,,
PF0,ADC0,A5,,,
,,,,,
DESCRIPTION,,,,,
1 GPIO ADC Arduino ADC Other INT PWM
2 PD2 RX INT2
3 PD3 TX INT3
4 PD1 SDA INT1
5 PD0 SCL INT0 OC0B
6 PD4 ADC8 A6
7 PC6 OC3A/OC4A
8 PD7 ADC10 A7 OC4D
9 PE6 INT6
10 PB4 ADC11 A8 PCINT4
11 PB5 ADC12 A9 PCINT5 OC1A/!OC4B
12 PB6 ADC13 A10 PCINT6 OC1B/OC4B
13 PB7 PCINT7 OC0A/OC1C
14 PD6 ADC9 A11 !OC4D
15 PC7 OC4A
16 PB3 MISO PCINT3
17 PB2 MOSI PCINT2
18 PB1 SCK PCINT1
19 PF7 ADC7 A0
20 PF6 ADC6 A1
21 PF5 ADC5 A2
22 PF4 ADC4 A3
23 PF1 ADC1 A4
24 PF0 ADC0 A5
25
26 DESCRIPTION

View file

@ -1,9 +0,0 @@
GPIO,INT,PWM,,SPI,ADC,Special
PB0,PCINT0,OC0A/!OC1A,SDA,MOSI,,
PB1,PCINT1,OC0B/OC1A,,MISO,,
PB2,INT0/PCINT2,,SCL,SCK,A1,
PB3,PCINT3,!OC1B,,,A3,USB
PB4,PCINT4,OC1B,,,A2,USB
,,,,,,
,,,,,,
DESCRIPTION,,,,,,
1 GPIO INT PWM SPI ADC Special
2 PB0 PCINT0 OC0A/!OC1A SDA MOSI
3 PB1 PCINT1 OC0B/OC1A MISO
4 PB2 INT0/PCINT2 SCL SCK A1
5 PB3 PCINT3 !OC1B A3 USB
6 PB4 PCINT4 OC1B A2 USB
7
8
9 DESCRIPTION

View file

@ -1,26 +0,0 @@
GPIO,ADC,HS/QSPI,Other
0,ADC1_CH0,,32K_XP
1,ADC1_CH1,,32K_XN
2,ADC1_CH2,FSPIQ,
3,ADC1_CH3,,
4,ADC1_CH4,,MTMS
5,ADC2_CH0,FSPIHD,MTDI
6,,FSPICLK,MTCK
7,,FSPID,MTDO
8,,,
9,,,
10,,FSPICS0,
11,,,VDD_SPI
12,,SPIHD,
13,,SPIWP,
14,,SPICS0,MTMS
15,,SPICLK,
16,,SPID,
17,,SPIQ,
18,,,USB D+AC0-
19,,,USB D+-
20,,,U0RXD
21,,,U0TXD
,,,
,,,
DESCRIPTION,,,
1 GPIO ADC HS/QSPI Other
2 0 ADC1_CH0 32K_XP
3 1 ADC1_CH1 32K_XN
4 2 ADC1_CH2 FSPIQ
5 3 ADC1_CH3
6 4 ADC1_CH4 MTMS
7 5 ADC2_CH0 FSPIHD MTDI
8 6 FSPICLK MTCK
9 7 FSPID MTDO
10 8
11 9
12 10 FSPICS0
13 11 VDD_SPI
14 12 SPIHD
15 13 SPIWP
16 14 SPICS0 MTMS
17 15 SPICLK
18 16 SPID
19 17 SPIQ
20 18 USB D+AC0-
21 19 USB D+-
22 20 U0RXD
23 21 U0TXD
24
25
26 DESCRIPTION

View file

@ -1,34 +0,0 @@
GPIO,Power Domain,ADC,SPI,Debug,Other
IO0,LP_UART_DTRN,ADC1_CH0,,,XTAL_32K_P
IO1,LP_UART_DSRN,ADC1_CH1,,,XTAL_32K_N
IO2,LP_UART_RTSN,ADC1_CH2,FSPIQ,,
IO3,LP_UART_CTSN,ADC1_CH3,,,
IO4,LP_UART_RXD,ADC1_CH4,FSPIHD,MTMS,
IO5,LP_UART_TXD,ADC1_CH5,FSPIWP,MTDI,
IO6,LP_I2C_SDA,ADC1_CH6,FSPICLK,MTCK,
IO7,LP_I2C_SCL,,FSPID,MTDO,
IO8,,,,,
IO9,,,,,
IO10,,,,,
IO11,,,,,
IO12,,,,,USB_D-
IO13,,,,,USB_D+
IO14,,,,,
IO15,,,,,
IO16,,,,,
IO17,,,,,
IO18,,,SDIO_CMD,,
IO19,,,SDIO_CLK,,
IO20,,,SDIO_DATA0,,
IO21,,,SDIO_DATA1,,
IO22,,,SDIO_DATA2,,
IO23,,,SDIO_DATA3,,
IO24,,,SPICS0,,
IO25,,,SPIQ,,
IO26,,,SPIWP,,
IO27,,,,,VDD_SPI
IO28,,,SPIHD,,
IO29,,,SPICLK,,
IO30,,,SPID,,
,,,,,
DESCRIPTION,"The ESP32-C6 is Espressifs first Wi-Fi 6 SoC integrating 2.4 GHz Wi-Fi 6, Bluetooth 5 (LE) and the 802.15.4 protocol.",,,,
1 GPIO Power Domain ADC SPI Debug Other
2 IO0 LP_UART_DTRN ADC1_CH0 XTAL_32K_P
3 IO1 LP_UART_DSRN ADC1_CH1 XTAL_32K_N
4 IO2 LP_UART_RTSN ADC1_CH2 FSPIQ
5 IO3 LP_UART_CTSN ADC1_CH3
6 IO4 LP_UART_RXD ADC1_CH4 FSPIHD MTMS
7 IO5 LP_UART_TXD ADC1_CH5 FSPIWP MTDI
8 IO6 LP_I2C_SDA ADC1_CH6 FSPICLK MTCK
9 IO7 LP_I2C_SCL FSPID MTDO
10 IO8
11 IO9
12 IO10
13 IO11
14 IO12 USB_D-
15 IO13 USB_D+
16 IO14
17 IO15
18 IO16
19 IO17
20 IO18 SDIO_CMD
21 IO19 SDIO_CLK
22 IO20 SDIO_DATA0
23 IO21 SDIO_DATA1
24 IO22 SDIO_DATA2
25 IO23 SDIO_DATA3
26 IO24 SPICS0
27 IO25 SPIQ
28 IO26 SPIWP
29 IO27 VDD_SPI
30 IO28 SPIHD
31 IO29 SPICLK
32 IO30 SPID
33
34 DESCRIPTION The ESP32-C6 is Espressif’s first Wi-Fi 6 SoC integrating 2.4 GHz Wi-Fi 6, Bluetooth 5 (LE) and the 802.15.4 protocol.

View file

@ -1,57 +0,0 @@
GPIO,ADC,HS/QSPI,SDMMC,Touch,RTC,UART,Other,Special
0,ADC2_CH1,,,T1,RTC11,,CLK_OUT1,
1,,,,,,U0TXD,CLK_OUT3,
2,ADC2_CH2,HSPIWP,HS2_DATA0,T2,RTC12,,,
3,,,,,,U0RXD,CLK_OUT2,
4,ADC2_CH0,HSPIHD,HS2_DATA1,T0,RTC10,,,
5,,VSPICS0,HS1_DATA6,,,,,
6,,SPICLK,HS1_CLK,,,U1CTS,,
7,,SPIQ,HS1_DATA0,,,U2RTS,,
8,,SPID,HS1_DATA1,,,U2CTS,,
9,,SPIHD,HS1_DATA2,,,U1RXD,,
10,,SPIWP,HS1_DATA3,,,U1TXD,,
11,,SPI_CS0,HS1_CMD,,,U1RTS,,
12,ADC2_CH5,HSPIQ,HS2_DATA2,T5,RTC15,,MTDI,
13,ADC2_CH4,HSPID,HS2_DATA3,T4,RTC14,,MTCK,
14,ADC2_CH6,HSPICLK,HS2_CLK,T6,RTC16,,MTMS,
15,ADC2_CH3,HSPICS0,HS2_CMD,T3,RTC13,,MTDO,
16,,,HS1_DATA4,,,U2RXD,,
17,,,HS1_DATA5,,,U2TXD,,
18,,VSPICLK,HS1_DATA7,,,,,
19,,VSPIQ,,,,U0CTS,,
20,,,,,,,,
21,,VSPIHD,,,,,,
22,,VSPIWP,,,,U0RTS,,
23,,VSPID,HS1_STROBE,,,,,
25,ADC2_CH8,,,,RTC6,,DAC1,
26,ADC2_CH9,,,,RTC7,,DAC2,
27,ADC2_CH7,,,T7,RTC17,,,
32,ADC1_CH4,,,T9,RTC9,,32K_XP,
33,ADC1_CH5,,,T8,RTC8,,32K_XN,
34,ADC1_CH6,,,,RTC4,,VDET1,Input Only
35,ADC1_CH7,,,,RTC5,,VDET2,Input Only
36,ADC1_CH0,,,,RTC0,,SENSE_V+,Input Only
37,ADC1_CH1,,,,RTC1,,SENSE_CAP+,Input Only
38,ADC1_CH2,,,,RTC2,,SENSE_CAP-,Input Only
39,ADC1_CH3,,,,RTC3,,SENSE_V-,Input Only
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
,,,,,,,,
DESCRIPTION,,,,,,,,
1 GPIO ADC HS/QSPI SDMMC Touch RTC UART Other Special
2 0 ADC2_CH1 T1 RTC11 CLK_OUT1
3 1 U0TXD CLK_OUT3
4 2 ADC2_CH2 HSPIWP HS2_DATA0 T2 RTC12
5 3 U0RXD CLK_OUT2
6 4 ADC2_CH0 HSPIHD HS2_DATA1 T0 RTC10
7 5 VSPICS0 HS1_DATA6
8 6 SPICLK HS1_CLK U1CTS
9 7 SPIQ HS1_DATA0 U2RTS
10 8 SPID HS1_DATA1 U2CTS
11 9 SPIHD HS1_DATA2 U1RXD
12 10 SPIWP HS1_DATA3 U1TXD
13 11 SPI_CS0 HS1_CMD U1RTS
14 12 ADC2_CH5 HSPIQ HS2_DATA2 T5 RTC15 MTDI
15 13 ADC2_CH4 HSPID HS2_DATA3 T4 RTC14 MTCK
16 14 ADC2_CH6 HSPICLK HS2_CLK T6 RTC16 MTMS
17 15 ADC2_CH3 HSPICS0 HS2_CMD T3 RTC13 MTDO
18 16 HS1_DATA4 U2RXD
19 17 HS1_DATA5 U2TXD
20 18 VSPICLK HS1_DATA7
21 19 VSPIQ U0CTS
22 20
23 21 VSPIHD
24 22 VSPIWP U0RTS
25 23 VSPID HS1_STROBE
26 25 ADC2_CH8 RTC6 DAC1
27 26 ADC2_CH9 RTC7 DAC2
28 27 ADC2_CH7 T7 RTC17
29 32 ADC1_CH4 T9 RTC9 32K_XP
30 33 ADC1_CH5 T8 RTC8 32K_XN
31 34 ADC1_CH6 RTC4 VDET1 Input Only
32 35 ADC1_CH7 RTC5 VDET2 Input Only
33 36 ADC1_CH0 RTC0 SENSE_V+ Input Only
34 37 ADC1_CH1 RTC1 SENSE_CAP+ Input Only
35 38 ADC1_CH2 RTC2 SENSE_CAP- Input Only
36 39 ADC1_CH3 RTC3 SENSE_V- Input Only
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 DESCRIPTION

View file

@ -62,4 +62,4 @@ GPIO46,CPU,,,,,INPUT ONLY,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
DESCRIPTION,The ESP32 description goes here DESCRIPTION,The,RP2040,,Pi,Raspberry,Cortex-M0+,running,at,up,to,133MHz,with,264kB,on-chip,SRAM,and,built,in,USB.,Flash,memory,is,provided,by,external,QSPI,chip.,All,GPIO,is,3.3V,in/out,max,unless,otherwise,stated.

Can't render this file because it has a wrong number of fields in line 65.

View file

@ -1,65 +0,0 @@
GPIO,Power Domain,ADC,HS/QSPI,Touch,Debug,Other
GPIO0,RTC,,,,,
GPIO1,RTC,ADC1_CH0,,T1,,
GPIO2,RTC,ADC1_CH1,,T2,,
GPIO3,RTC,ADC1_CH2,,T3,,
GPIO4,RTC,ADC1_CH3,,T4,,
GPIO5,RTC,ADC1_CH4,,T5,,
GPIO6,RTC,ADC1_CH5,,T6,,
GPIO7,RTC,ADC1_CH6,,T7,,
GPIO8,RTC,ADC1_CH7,,T8,,
GPIO9,RTC,ADC1_CH8,FSPIHD,T9,,
GPIO10,RTC,ADC1_CH9,FSPICS0,T10,,
GPIO11,RTC,ADC2_CH0,FSPID,T11,,
GPIO12,RTC,ADC2_CH1,FSPICLK,T12,,
GPIO13,RTC,ADC2_CH2,FSPIQ,T13,,
GPIO14,RTC,ADC2_CH3,FSPIWP,T14,,
GPIO15,RTC,ADC2_CH4,,,U0RTS,XTAL_32K_P
GPIO16,RTC,ADC2_CH5,,,U0CTS,XTAL_32K_N
GPIO17,RTC,ADC2_CH6,,,U1TXD,
GPIO18,RTC,ADC2_CH7,,,U1RXD,
GPIO19,RTC,ADC2_CH8,,,U1RTS,USB_D-
GPIO20,RTC,ADC2_CH9,,,U1CTS,USB_D+
GPIO21,RTC,,,,,
GPIO26,SPI,,SPICS1,,,
GPIO27,SPI,,SPIHD,,,
GPIO28,SPI,,SPIWP,,,
GPIO29,SPI,,SPICS0,,,
GPIO30,SPI,,SPICLK,,,
GPIO31,SPI,,SPIQ,,,
GPIO32,SPI,,SPID,,,
GPIO33,SPI/CPU,,FSPIHD,,,
GPIO34,SPI/CPU,,FSPICS0,,,
GPIO35,SPI/CPU,,FSPID,,,
GPIO36,SPI/CPU,,FSPICLK,,,
GPIO37,SPI/CPU,,FSPIQ,,,
GPIO38,CPU,,FSPIWP,,,
GPIO39,CPU,,,,MTCK,
GPIO40,CPU,,,,MTDO,
GPIO41,CPU,,,,MTDI,
GPIO42,CPU,,,,MTMS,
GPIO43,CPU,,,,U0TXD,
GPIO44,CPU,,,,U0RXD,
GPIO45,CPU,,,,,
GPIO46,CPU,,,,,INPUT ONLY
GPIO47,CPU,,CLK_P_DIFF,,,
GPIO48,CPU,,CLK_N_DIFF,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
,,,,,,
DESCRIPTION,The ESP32 description goes here,,,,,
1 GPIO Power Domain ADC HS/QSPI Touch Debug Other
2 GPIO0 RTC
3 GPIO1 RTC ADC1_CH0 T1
4 GPIO2 RTC ADC1_CH1 T2
5 GPIO3 RTC ADC1_CH2 T3
6 GPIO4 RTC ADC1_CH3 T4
7 GPIO5 RTC ADC1_CH4 T5
8 GPIO6 RTC ADC1_CH5 T6
9 GPIO7 RTC ADC1_CH6 T7
10 GPIO8 RTC ADC1_CH7 T8
11 GPIO9 RTC ADC1_CH8 FSPIHD T9
12 GPIO10 RTC ADC1_CH9 FSPICS0 T10
13 GPIO11 RTC ADC2_CH0 FSPID T11
14 GPIO12 RTC ADC2_CH1 FSPICLK T12
15 GPIO13 RTC ADC2_CH2 FSPIQ T13
16 GPIO14 RTC ADC2_CH3 FSPIWP T14
17 GPIO15 RTC ADC2_CH4 U0RTS XTAL_32K_P
18 GPIO16 RTC ADC2_CH5 U0CTS XTAL_32K_N
19 GPIO17 RTC ADC2_CH6 U1TXD
20 GPIO18 RTC ADC2_CH7 U1RXD
21 GPIO19 RTC ADC2_CH8 U1RTS USB_D-
22 GPIO20 RTC ADC2_CH9 U1CTS USB_D+
23 GPIO21 RTC
24 GPIO26 SPI SPICS1
25 GPIO27 SPI SPIHD
26 GPIO28 SPI SPIWP
27 GPIO29 SPI SPICS0
28 GPIO30 SPI SPICLK
29 GPIO31 SPI SPIQ
30 GPIO32 SPI SPID
31 GPIO33 SPI/CPU FSPIHD
32 GPIO34 SPI/CPU FSPICS0
33 GPIO35 SPI/CPU FSPID
34 GPIO36 SPI/CPU FSPICLK
35 GPIO37 SPI/CPU FSPIQ
36 GPIO38 CPU FSPIWP
37 GPIO39 CPU MTCK
38 GPIO40 CPU MTDO
39 GPIO41 CPU MTDI
40 GPIO42 CPU MTMS
41 GPIO43 CPU U0TXD
42 GPIO44 CPU U0RXD
43 GPIO45 CPU
44 GPIO46 CPU INPUT ONLY
45 GPIO47 CPU CLK_P_DIFF
46 GPIO48 CPU CLK_N_DIFF
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 DESCRIPTION The ESP32 description goes here

View file

@ -1,49 +0,0 @@
GPIO,ADC,PWM,I2C,SPI,UART,I2S,Other,Debug
GPIO_00,,,,DQS/PCS3/PCS3,,MCLK,,
GPIO_01,,PWM0_B,SDA,,,RX_BCLK,,
GPIO_02,,PWM0_A,SCL,,,RX_SYNC,,
GPIO_03,,PWM1_B,,,,RX_DATA0,,
GPIO_04,,PWM1_A,,,,TX_DATA0,,
GPIO_05,,PWM2_B,,,RXD,TX_DATA1/RX_DATA1,,
GPIO_06,,PWM2_A,,,TXD,TX_BCLK,,
GPIO_07,,PWM3_B,,,RTS_B/RXD,TX_SYNC,,
GPIO_08,,PWM3_A,,,CTS_B/TXD,MCLK,,
GPIO_09,,,SDA,SS1_B,RXD,,,
GPIO_10,,,HREQ/SCL,,TXD,,,
GPIO_11,,,SDA,SS1_B,RXD,,,TRACE3
GPIO_12,,,SCL,,TXD,,,TRACE2
GPIO_13,,,,PCS2,RXD,,,TRACE1
GPIO_AD_00,ADC0,,,PCS2,TXD,,,TRACE0
GPIO_AD_01,ADC1,,SDA,PCS1,RXD,,,TRACE_SWO
GPIO_AD_02,ADC2,,SCL,PCS1,TXD,,,TRACE_CLK
GPIO_AD_03,ADC3,PWM2_B,,SDI,,,,JTAG_DE_B
GPIO_AD_04,ADC4,PWM2_A,,SDO,,,,
GPIO_AD_05,ADC5,PWM3_B,,PCS0,,,,
GPIO_AD_06,ADC6,PWM3_A,HREQ,SCK,,,,
GPIO_AD_07,ADC7,,SDA,,RTS_B/RXD,,XBAR1_INOUT03,CM7_RXEV
GPIO_AD_08,ADC8,,SCL,,CTS_B/TXD,,,CM7_TXEV/JTAG_TRSTB
GPIO_AD_09,ADC9,PWM3_X,,SDI,,,,TRACE_SWO/JTAG_TDO
GPIO_AD_10,ADC10,PWM2_X,,SDO,,,,JTAG_TDI
GPIO_AD_11,ADC11,PWM1_X,,PCS0,,,,JTAG_MOD
GPIO_AD_12,ADC12,PWM0_X,,SCK,,,,JTAG_TCK
GPIO_AD_13,ADC13,,SDA,,RTS_B/RTS_B,,,JTAG_TMS
GPIO_AD_14,ADC14,,SCL,,CTS_B/CTS_B,,XBAR1_INOUT02,
GPIO_SD_00,,,,SS0_B,,TX_SYNC,,CM7_RXEV
GPIO_SD_01,,PWM0_B,,DATA1,,TX_BCLK,,
GPIO_SD_02,,PWM0_A,,DATA2,,TX_DATA,,
GPIO_SD_03,,PWM1_B,,DATA0,,RX_DATA,,
GPIO_SD_04,,PWM1_A,,DATA3,,RX_SYNC,,
GPIO_SD_05,,,SDA,SS1_B/SDI,,,,
GPIO_SD_06,,,SCL,SS0_B/SDO,,,,
GPIO_SD_07,,,SDA,DATA1/PCS0,,,,
GPIO_SD_08,,,SCL,DATA2/SCK,,,,
GPIO_SD_09,,,,DATA0/SDI,RXD,,,
GPIO_SD_10,,,,SCLK/SDO,TXD,,,
GPIO_SD_11,,,,DATA3/SCK,RXD,,,
GPIO_SD_12,,,,DQS/PCS0,TXD,,,
GPIO_SD_13,,,,SCLK,,RX_BCLK,,CM7_TXEV
GPIO_SD_14,,,,DQS/DQS,,,,
PMIC_ON_REQ,,,,,,,,
POR_B,,,,,,,,
ONOFF,,,,,,,,
DESCRIPTION,,,,,,,,
1 GPIO ADC PWM I2C SPI UART I2S Other Debug
2 GPIO_00 DQS/PCS3/PCS3 MCLK
3 GPIO_01 PWM0_B SDA RX_BCLK
4 GPIO_02 PWM0_A SCL RX_SYNC
5 GPIO_03 PWM1_B RX_DATA0
6 GPIO_04 PWM1_A TX_DATA0
7 GPIO_05 PWM2_B RXD TX_DATA1/RX_DATA1
8 GPIO_06 PWM2_A TXD TX_BCLK
9 GPIO_07 PWM3_B RTS_B/RXD TX_SYNC
10 GPIO_08 PWM3_A CTS_B/TXD MCLK
11 GPIO_09 SDA SS1_B RXD
12 GPIO_10 HREQ/SCL TXD
13 GPIO_11 SDA SS1_B RXD TRACE3
14 GPIO_12 SCL TXD TRACE2
15 GPIO_13 PCS2 RXD TRACE1
16 GPIO_AD_00 ADC0 PCS2 TXD TRACE0
17 GPIO_AD_01 ADC1 SDA PCS1 RXD TRACE_SWO
18 GPIO_AD_02 ADC2 SCL PCS1 TXD TRACE_CLK
19 GPIO_AD_03 ADC3 PWM2_B SDI JTAG_DE_B
20 GPIO_AD_04 ADC4 PWM2_A SDO
21 GPIO_AD_05 ADC5 PWM3_B PCS0
22 GPIO_AD_06 ADC6 PWM3_A HREQ SCK
23 GPIO_AD_07 ADC7 SDA RTS_B/RXD XBAR1_INOUT03 CM7_RXEV
24 GPIO_AD_08 ADC8 SCL CTS_B/TXD CM7_TXEV/JTAG_TRSTB
25 GPIO_AD_09 ADC9 PWM3_X SDI TRACE_SWO/JTAG_TDO
26 GPIO_AD_10 ADC10 PWM2_X SDO JTAG_TDI
27 GPIO_AD_11 ADC11 PWM1_X PCS0 JTAG_MOD
28 GPIO_AD_12 ADC12 PWM0_X SCK JTAG_TCK
29 GPIO_AD_13 ADC13 SDA RTS_B/RTS_B JTAG_TMS
30 GPIO_AD_14 ADC14 SCL CTS_B/CTS_B XBAR1_INOUT02
31 GPIO_SD_00 SS0_B TX_SYNC CM7_RXEV
32 GPIO_SD_01 PWM0_B DATA1 TX_BCLK
33 GPIO_SD_02 PWM0_A DATA2 TX_DATA
34 GPIO_SD_03 PWM1_B DATA0 RX_DATA
35 GPIO_SD_04 PWM1_A DATA3 RX_SYNC
36 GPIO_SD_05 SDA SS1_B/SDI
37 GPIO_SD_06 SCL SS0_B/SDO
38 GPIO_SD_07 SDA DATA1/PCS0
39 GPIO_SD_08 SCL DATA2/SCK
40 GPIO_SD_09 DATA0/SDI RXD
41 GPIO_SD_10 SCLK/SDO TXD
42 GPIO_SD_11 DATA3/SCK RXD
43 GPIO_SD_12 DQS/PCS0 TXD
44 GPIO_SD_13 SCLK RX_BCLK CM7_TXEV
45 GPIO_SD_14 DQS/DQS
46 PMIC_ON_REQ
47 POR_B
48 ONOFF
49 DESCRIPTION

View file

@ -1,55 +0,0 @@
GPIO,High Speed,Low Speed,ADC,Special
P0.00,HS,,,XL1
P0.01,HS,,,XL2
P0.02,,LS,AIN0,
P0.03,,LS,AIN1,
P0.04,HS,,AIN2,
P0.05,HS,,AIN3,
P0.06,HS,,,
P0.07,HS,,,
P0.08,HS,,,
P0.09,,LS,,NFC1
P0.10,,LS,,NFC2
P0.11,HS,,,
P0.12,HS,,,
P0.13,HS,,,
P0.14,HS,,,
P0.15,HS,,,
P0.16,HS,,,
P0.17,HS,,,
P0.18,HS,,,RESET
P0.19,QSPI/SCK,,,
P0.20,HS,,,
P0.21,QSPI,,,
P0.22,QSPI,,,
P0.23,QSPI,,,
P0.24,HS,,,
P0.25,HS,,,
P0.26,HS,,,
P0.27,HS,,,
P0.28,,LS,AIN4,
P0.29,,LS,AIN5,
P0.30,,LS,AIN6,
P0.31,,LS,AIN7,
P1.00,QSPI,,,
P1.01,,LS,,
P1.02,,LS,,
P1.03,,LS,,
P1.04,,LS,,
P1.05,,LS,,
P1.06,,LS,,
P1.07,,LS,,
P1.08,HS,,,
P1.09,HS,,,
P1.10,,LS,,
P1.11,,LS,,
P1.12,,LS,,
P1.13,,LS,,
P1.14,,LS,,
P1.15,,LS,,
,,,,
,,,,
,,,,
,,,,
,,,,
DESCRIPTION,"The Nordic nRF52840 is an ARM Cortex-M4 running at 64MHz with 256kB on-chip SRAM, 1MB of Flash memory and built-in Bluetooth Low Energy and native USB. Any pin can be used for I2C/SPI/UART/I2S/PDM/etc peripheral usage. LS pins can interfere with radio reception when over 10 Khz, however they are not restricted from going faster. All GPIO is 3.3V in/out max unless otherwise stated. ",,,,,
Can't render this file because it has a wrong number of fields in line 55.

9306
output.svg

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 88 KiB

After

Width:  |  Height:  |  Size: 850 KiB

692
parser.py
View file

@ -15,8 +15,6 @@ import glob
import os import os
import math import math
import time import time
import textwrap
import subprocess
MM_TO_PX = 96 / 25.4 # SVGs measure in px but maybe we want mm! MM_TO_PX = 96 / 25.4 # SVGs measure in px but maybe we want mm!
PX_TO_MM = 25.4 / 96 # SVGs measure in px but maybe we want mm! PX_TO_MM = 25.4 / 96 # SVGs measure in px but maybe we want mm!
@ -42,90 +40,65 @@ TITLE_FONTSIZE = 16
URL_FONTSIZE = 12 URL_FONTSIZE = 12
# The following table is derived from # Color palette has been revised based on a recommended table from
# http://mkweb.bcgsc.ca/biovis2012/color-blindness-palette.png # http://mkweb.bcgsc.ca/biovis2012/ to accommodate multiple types of
# It provides 13 to 15 colors (plus white) that appear perceptually distinct # color blindness. Some of these might be a bit vivid to the normally-
# to most types of color blindness (they do NOT appear as the SAME colors, # sighted, so I'm keeping a note here of the original values used if
# merely DISTINGUISHABLE from one another). # you want to switch back (at the expense of some users' ability to
# It is generally not advised (but occasionally acceptable) to use colors # distinguish pin colors). Use the colors from the table exactly,
# not in this table (as regular #RRGGBB), BUT they should be made distinct # DO NOT try to adjust a little lighter or darker, as the resulting
# some other way -- for example, CircuitPython pin name boxes are light gray # color may head off in a tangent direction for color blind users.
# (not in table) but assigned an outline. Also, STEMMA QT SDA and SCL boxes # If something doesn't appeal, pick a different color from the table,
# are assigned colors of the physical wiring, so the wires and labels match # or repeat an existing one but distinguish it with/without an outline.
# (BOTH are then similarly 'off' to color blind users). Some of these entries #
# are a bit vivid to the normally-sighted, but they should be used exacly, # Type Old New (biovis2012 table index)
# do NOT try to adjust a little lighter or darker, as the result might go in # CPy Name #E6E6E6 #E6E6E6 - light gray, not in table, distinguished by outline
# a different direction for color blind users. Pick a different index, or # Power #E60000 #920000 (11)
# distinguish it with/without an outline, thanks. # GND #000000 #000000 (1)
palette = ( # Control #B0B0B0 #004949
'#FFFFFF', # Keeps list index in sync w/numbers in ref image (1-15) # Arduino #00FF00 #00FF00 - not currently used?
'#000000', # #1 # Port #F0E65A #FFFF6D (15) - same as QT_SCL
'#004949', # #2 # Analog #FFB95A #DB6D00 (13) - avoid using (4) elsewhere
'#009292', # #3 do not use w/#7 # PWM #FAB4BE #FFB6DB (5)
'#FF6DB6', # #4 do not use w/#13 # UART #96C8FA #B6DBFF (10)
'#FFB6DB', # #5 # SPI #78F07D #24FF24 (14)
'#490092', # #6 # I2C #D7C8FF #B66DFF (8)
'#006DDB', # #7 do not use w/#3 # QT_SCL #FFFF00 #FFFF00 - not remapped, keep wire color so these match RL
'#B66DFF', # #8 # QT_SDA #0000FF #0000FF - same
'#6DB6FF', # #9 # ExtInt #FF00FF #FF00FF - not currently used?
'#B6DBFF', # #10 # PCInt #FFC000 #FFCC00 - not currently used?
'#920000', # #11 # Misc #A0A0FF #A0A0FF - not currently used?
'#924900', # #12 # Misc2 #C0C0FF #C0C0FF - not currently used?
'#DB6D00', # #13 do not use w/#4
'#24FF24', # #14
'#FFFF6D') # #15
# This is a sequence of 9 palette indices that appear in a chromatic-ish
# sequence for normal-sighted viewers, and are distinct and non-repeating
# for anyone else. MUX boxes, when drawn from center-to-outskirts in this
# order, are nicely appealing. If a chip type has fewer than 9 muxes,
# colors in the sequence can be skipped by adding an empty column in the
# CSV (e.g. brown isn't very appealing). For future ref, if more than 9
# muxes become necessary, maybe repeat the sequence but add a box outline?
chroma = (
15, # Yellow
14, # Green
3, # Teal
10, # Cyan
9, # Light blue
8, # Purple
5, # Light Pink
12, # Brown
13) # Orange (after this, list repeats but adds box outline)
# NOT in this list, but still distinct and available for other uses, are
# #1 (black, used for ground), #11 (dark red, used for power), #6 (dark
# purple, used for control), #2 (dark teal, used for Arduino pin name), #7
# (medium blue, not currently used and should be avoided if possible as it
# appears similar to #3 for some) and #4 (hot pink, not used and also
# should be avoided as it resembles #13 orange to some.)
# This is a base set of pin themes that are common to ALL chips.
# Any additional 'muxed' functions get drawn in chroma sequence
# following left-to-right column order in CSV file.
themes = [ themes = [
{'type':'Power', 'fill':palette[11], 'font-weight':'bold'},
{'type':'GND', 'fill':palette[1], 'font-weight':'bold'},
{'type':'Control', 'fill':palette[6], 'font-weight':'bold'},
{'type':'Arduino', 'fill':palette[2], 'font-weight':'bold'},
{'type':'CircuitPython Name', 'fill':'#E6E6E6', 'outline':'auto', 'font-weight':'bold'}, {'type':'CircuitPython Name', 'fill':'#E6E6E6', 'outline':'auto', 'font-weight':'bold'},
{'type':'QT_SCL', 'fill':'#FFFF00', 'font-weight':'bold'}, {'type':'Power', 'fill':'#920000', 'outline':'none', 'font-weight':'bold'},
{'type':'QT_SDA', 'fill':'#0000FF', 'font-weight':'bold'}, {'type':'GND', 'fill':'#000000', 'outline':'none', 'font-weight':'bold'},
{'type':'Control', 'fill':'#004949', 'outline':'none', 'font-weight':'bold'},
{'type':'Arduino', 'fill':'#00FF00', 'outline':'none', 'font-weight':'bold'},
{'type':'Port', 'fill':'#FFFF6D', 'outline':'none', 'font-weight':'normal'},
{'type':'Analog', 'fill':'#DB6D00', 'outline':'none', 'font-weight':'normal'},
{'type':'PWM', 'fill':'#FFB6DB', 'outline':'none', 'font-weight':'normal'},
{'type':'UART', 'fill':'#B6DBFF', 'outline':'none', 'font-weight':'normal'},
{'type':'SPI', 'fill':'#24FF24', 'outline':'none', 'font-weight':'normal'},
{'type':'I2C', 'fill':'#B66DFF', 'outline':'none', 'font-weight':'normal'},
{'type':'QT_SCL', 'fill':'#FFFF00', 'outline':'none', 'font-weight':'bold'},
{'type':'QT_SDA', 'fill':'#0000FF', 'outline':'none', 'font-weight':'bold'},
{'type':'ExtInt', 'fill':'#FF00FF', 'outline':'none', 'font-weight':'normal'},
{'type':'PCInt', 'fill':'#FFC000', 'outline':'none', 'font-weight':'normal'},
{'type':'Misc', 'fill':'#A0A0FF', 'outline':'none', 'font-weight':'normal'},
{'type':'Misc2', 'fill':'#C0C0FF', 'outline':'none', 'font-weight':'normal'},
] ]
# some eagle cad names are not as pretty # some eagle cad names are not as pretty
conn_renames = [('!RESET', 'RESET'), conn_renames = [('!RESET', 'RESET'),
('D5_5V', 'D5'), ('D5_5V', 'D5'),
('+3V3', '3.3V'), ('+3V3', '3.3V'),
('3V3', '3.3V'),
('+5V', '5V') ('+5V', '5V')
] ]
product_url = None product_url = None
product_title = None product_title = None
chip_description = None chip_description = None
pinmuxes = None # Set by get_chip_pinout() on CSV load
pinmux_in_use = None # Ditto
arduino_in_use = False # Is set true if Arduino pin names found
longest_arduinopin = 0 # Longest label for Arduino pins (for box sizing)
# This function digs through the FZP (XML) file and the SVG (also, ironically, XML) to find what # This function digs through the FZP (XML) file and the SVG (also, ironically, XML) to find what
# frtizing calls a connection - these are pads that folks can connect to! they are 'named' by # frtizing calls a connection - these are pads that folks can connect to! they are 'named' by
@ -143,10 +116,7 @@ def get_connections(fzp, svg, substitute):
d = {'name': c_name, 'svgid': c_svg} d = {'name': c_name, 'svgid': c_svg}
connections.append(d) connections.append(d)
if 'url' in xmldict['module']:
product_url = xmldict['module']['url'] product_url = xmldict['module']['url']
else:
product_url = 'Missing product URL'
product_title = xmldict['module']['title'] product_title = xmldict['module']['title']
print(product_title, product_url) print(product_title, product_url)
#print(connections) #print(connections)
@ -187,314 +157,6 @@ def get_connections(fzp, svg, substitute):
c['name'] = re.sub(substitute[0], substitute[1], c['name']) c['name'] = re.sub(substitute[0], substitute[1], c['name'])
return connections return connections
def get_arduino_mapping(connections, variantfolder):
global longest_arduinopin
if not variantfolder:
return connections
###################################################### special case of very early chips
if ("atmega328" in variantfolder) or ("atmega32u4" in variantfolder) or ("attiny8x" in variantfolder):
pinmap8x = ["PB0", "PB1", "PB2", "PB3", "PB4"]
pinmap328 = ["PD0", "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7",
"PB0", "PB1", "PB2", "PB3", "PB4", "PB5",
"PC0", "PC1", "PC2", "PC3", "PC4", "PC5"]
specialnames328 = {"A0" : "PC0", "A1" : "PC1", "A2" : "PC2",
"A3" : "PC3", "A4" : "PC4", "A5" : "PC5",
"A4/SDA" : "PC4", "A5/SCL" : "PC5",
"SS" : "PB2", "MOSI" : "PB3",
"MISO": "PB4", "SCK": "PB5"}
pinmap32u4 = ["PD2", "PD3", "PD1", "PD0", "PD4", "PC6", "PD7", "PE6",
"PB4", "PB5", "PB6", "PB7", "PD6", "PC7",
"PB3", "PB1", "PB2", "PB0",
"PF7", "PF6", "PF5", "PF4", "PF1", "PF0"]
specialnames32u4 = {"SDA" : "PD1", "SCL" : "PD0",
"MISO" : "PB3", "SCK" : "PB1", "MOSI" : "PB2",
"A0" : "PF7", "A1" : "PF6", "A2" : "PF5",
"A3" : "PF4", "A4" : "PF1", "A5" : "PF0" }
if "attiny8x" in variantfolder:
pinmap = pinmap8x
specialnames = None
if "atmega328" in variantfolder:
pinmap = pinmap328
specialnames = specialnames328
if "atmega32u4" in variantfolder:
pinmap = pinmap32u4
specialnames = specialnames32u4
for conn in connections:
print(conn['name'])
# digital pins
matches = re.match(r'(IO|D|#)([0-9]+)', conn['name'])
if matches:
#print(matches)
digitalname = matches.group(2)
conn['pinname'] = pinmap[int(digitalname)]
conn['arduinopin'] = digitalname
longest_arduinopin = max(longest_arduinopin, len(str(conn['arduinopin'])))
# other pins :/
if specialnames:
if conn['name'] in specialnames:
conn['pinname'] = specialnames[conn['name']]
conn['arduinopin'] = pinmap.index(conn['pinname'])
longest_arduinopin = max(longest_arduinopin, len(str(conn['arduinopin'])))
#print(connections)
return connections
###################################################### NRF52 board variant handler
elif "nrf52" in variantfolder.lower():
# copy over the variant.cpp minus any includes
variantcpp = open(variantfolder+"/"+"variant.cpp").readlines()
outfilecpp = open("variant.cpp", "w")
# Add some new header text so we can compile the raw variant cpp/h without arduino BSP
outfilecpp.write("""
#include <stdint.h>
#include <stdio.h>
#include "variant.h"
#define OUTPUT 1
#define INPUT 0
#define HIGH 1
#define LOW 0
#define ledOff(x) (x)
#define pinMode(x, y) (x)
#define digitalWrite(x, y) (x)
""")
for line in variantcpp:
# cut out the arduino deps
if "#include" in line:
continue
outfilecpp.write(line)
# here's the code that will actually print out the pin mapping as a CSV:
outfilecpp.write("""
int main(void) {
for (uint32_t pin=0; pin<sizeof(g_ADigitalPinMap)/4; pin++) {
uint8_t portnum = g_ADigitalPinMap[pin] / 32;
uint8_t portpin = g_ADigitalPinMap[pin] % 32;
printf("%d", pin);
""")
for analog in range(0, 32):
outfilecpp.write("#ifdef PIN_A%d\n" % analog)
outfilecpp.write(" if (PIN_A%d == pin) printf(\"/A%d\");\n" % (analog, analog))
outfilecpp.write("#endif\n")
outfilecpp.write("""
printf(", P%d.%02d\\n", portnum, portpin);
}
}
""")
outfilecpp.close()
# ditto for the header file, copy it over, except remove all arduino headers
varianth = open(variantfolder+"/"+"variant.h").readlines()
outfileh = open("variant.h", "w")
outfileh.write("#include <stdint.h>\n")
for line in varianth:
if "#include" in line:
continue
outfileh.write(line)
outfileh.close()
###################################################### SAMDxx board variant handler
elif "samd" in variantfolder.lower():
# copy over the variant.cpp minus any includes
variantcpp = open(variantfolder+"/"+"variant.cpp").readlines()
outfilecpp = open("variant.cpp", "w")
# Add some new header text so we can compile the raw variant cpp/h without arduino BSP
outfilecpp.write("""
#include <stdint.h>
#include <stdio.h>
#include "variant.h"
#define OUTPUT 1
#define INPUT 0
#define HIGH 1
#define LOW 0
#define ledOff(x) (x)
#define pinMode(x, y) (x)
#define digitalWrite(x, y) (x)
#define EXTERNAL_INT_NMI 32
#define PIN_ATTR_PWM 0
#define PIN_ATTR_ANALOG 0
#define PIN_ATTR_ANALOG_ALT 0
#define PIN_ATTR_DIGITAL 0
#define PIO_SERCOM 0
#define PIO_DIGITAL 0
#define PIO_ANALOG 0
#define PIO_SERCOM_ALT 0
#define PIO_OUTPUT 0
#define PIO_TIMER 0
#define PIO_TIMER_ALT 0
#define PIO_PWM 0
#define PIO_PWM_ALT 0
#define PIN_ATTR_TIMER 0
#define PIN_ATTR_TIMER_ALT 0
#define PIO_COM 0
#define PORTA 0
#define PORTB 1
#define PORTC 2
#define PORTD 3
#define DAC_Channel0 0
""")
for define in ("NOT_ON_TIMER", "NOT_ON_PWM", "No_ADC_Channel",
"EXTERNAL_INT_NONE", "PIN_ATTR_NONE",
"PIN_ATTR_PWM_E", "PIN_ATTR_PWM_F", "PIN_ATTR_PWM_G",
"DAC_Channel1", "TCC_INST_NUM", "TC_INST_NUM",
"NOT_A_PORT", "PIO_NOT_A_PIN", "PIN_NOT_A_PIN"):
outfilecpp.write("#define %s 10\n" % define)
for adc in range(0, 32):
outfilecpp.write("#define ADC_Channel%d %d\n" % (adc, adc))
for irq in range(0, 32):
outfilecpp.write("#define EXTERNAL_INT_%d %d\n" % (irq, irq))
for tcc in range(0, 8):
outfilecpp.write("#define PWM0_CH%d %d\n" % (tcc, tcc))
outfilecpp.write("#define TCC0_CH%d %d\n" % (tcc, tcc))
outfilecpp.write("#define PWM1_CH%d %d\n" % (tcc, tcc))
outfilecpp.write("#define TCC1_CH%d %d\n" % (tcc, tcc))
outfilecpp.write("#define TCC%d_GCLK_ID %d\n" % (tcc, tcc))
for tc in range(0, 8):
outfilecpp.write("#define PWM2_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TCC2_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TCC3_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TCC4_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define PWM3_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC3_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define PWM4_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC7_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC6_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC5_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC4_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC2_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC1_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC0_CH%d %d\n" % (tc, tc))
outfilecpp.write("#define TC%d_GCLK_ID %d\n" % (tc, tc))
outfilecpp.write("""
typedef struct _PinDescription
{
uint32_t ulPort ;
uint32_t ulPin ;
uint32_t ulPinType ;
uint32_t ulPinAttribute ;
uint32_t ulADCChannelNumber ;
uint32_t ulPWMChannel ;
uint32_t ulTCChannel ;
uint32_t ulExtInt ;
} PinDescription ;
""")
blocklist = ("#include", "extern", "apTCInstances", "IrqHandler", "Uart", "SERCOM ")
for line in variantcpp:
# cut out the arduino deps
if any([block in line for block in blocklist]):
continue
outfilecpp.write(line)
# here's the code that will actually print out the pin mapping as a CSV:
outfilecpp.write("""
int main(void) {
for (uint32_t pin=0; pin<sizeof(g_APinDescription)/sizeof(PinDescription); pin++) {
uint8_t portnum = g_APinDescription[pin].ulPort;
uint8_t portpin = g_APinDescription[pin].ulPin;
printf("%d", pin);
""")
for analog in range(0, 32):
outfilecpp.write("#ifdef PIN_A%d\n" % analog)
outfilecpp.write(" if ((PIN_A%d == pin) || ((g_APinDescription[PIN_A%d].ulPort == portnum) && (g_APinDescription[PIN_A%d].ulPin == portpin))) printf(\"/A%d\");\n" % (analog, analog, analog, analog))
outfilecpp.write("#endif\n")
outfilecpp.write("""
printf(", P%c%02d\\n", 'A'+portnum, portpin);
}
}
""")
outfilecpp.close()
# ditto for the header file, copy it over, except remove all arduino headers
varianth = open(variantfolder+"/"+"variant.h").readlines()
outfileh = open("variant.h", "w")
outfileh.write("#include <stdint.h>\n")
blocklist = ("#include", "extern SERCOM", "extern Uart")
for line in varianth:
if any([block in line for block in blocklist]):
continue
outfileh.write(line)
outfileh.close()
arduinopins = ""
###################################################### SAMDxx board variant handler
elif "esp32" in variantfolder.lower():
for conn in connections:
print(conn['name'])
# digital pins
iomatches = re.match(r'(GPIO|IO|D|I|#)([0-9]+)', conn['name'])
if iomatches:
print(iomatches)
digitalname = iomatches.group(2)
conn['pinname'] = digitalname
#conn['arduinopin'] = digitalname
longest_arduinopin = max(longest_arduinopin, len(digitalname))
else:
conn['pinname'] = conn['name']
# open the file
varianth = open(variantfolder+"/"+"pins_arduino.h").readlines()
arduinopins = ""
for line in varianth:
#print(line)
# find the const defines
matches2 = re.match(r'\s*static\s*const\s*uint8_t\s*([A-Z0-9_]+)\s*=\s*([0-9]+)\s*;.*', line)
if matches2:
prettyname = matches2[1]
pinnumber = matches2[2]
print(prettyname, pinnumber)
for conn in connections:
if conn['pinname'] == prettyname:
conn['pinname'] = pinnumber
#print(conn)
arduinopins += pinnumber + ", " + prettyname + "\n"
# ok after we map everything, lets find internal pins
for pinpair in arduinopins.split('\n'):
if not pinpair:
continue
pinnumber, prettyname = pinpair.split(",")
conn = next((c for c in connections if c.get('pinname') == pinnumber), None)
if conn:
continue
print("Found an internal pin!")
newconn = {'name': prettyname, 'pinname': pinnumber}
print(newconn)
connections.append(newconn)
#print(arduinopins)
else:
raise NotImplementedError("Unknown Arduino variant type! (if RP2040, leave off -a arguments and try again)", variantfolder.lower())
if not arduinopins: # some variants can auto-extract the pins for us, if not we do it the hard way
time.sleep(1)
# now compile it!
compileit = subprocess.Popen("g++ -w variant.cpp -o arduinopins", shell=True, stdout=subprocess.PIPE)
#print(compileit.stdout.read())
runit = subprocess.Popen("./arduinopins", shell=True, stdout=subprocess.PIPE)
time.sleep(1)
arduinopins = runit.stdout.read().decode("utf-8")
#print(arduinopins)
#exit()
for pinpair in arduinopins.split("\n"):
if not pinpair:
continue
arduinopin, pinname = pinpair.split(", ")
for conn in (c for c in connections if c.get('pinname') == pinname):
if 'arduinopin' in conn:
continue
conn['arduinopin'] = arduinopin
print(arduinopin, pinname, conn)
longest_arduinopin = max(longest_arduinopin, len(arduinopin))
return connections
def get_circuitpy_aliases(connections, circuitpydef): def get_circuitpy_aliases(connections, circuitpydef):
# now check the circuitpython definition file # now check the circuitpython definition file
pyvar = open(circuitpydef).readlines() pyvar = open(circuitpydef).readlines()
@ -504,13 +166,7 @@ def get_circuitpy_aliases(connections, circuitpydef):
matches = re.match(r'.*MP_QSTR_(.*)\)\s*,\s*MP_ROM_PTR\(&pin_(.*)\)', line) matches = re.match(r'.*MP_QSTR_(.*)\)\s*,\s*MP_ROM_PTR\(&pin_(.*)\)', line)
if not matches: if not matches:
continue continue
pypairs.append((matches.group(1), matches.group(2)))
# Special case for nRF52840, we cant use . in the pin name so rename P0_0 -> P0.0
# so it matches the 'true' name of the pin
pinname = matches.group(2)
if re.match(r"P[0-1]_[0-9]+", pinname):
pinname = pinname.replace("_", ".")
pypairs.append([matches.group(1), pinname])
# for every known connection, lets set the 'true' pin name # for every known connection, lets set the 'true' pin name
for conn in connections: for conn in connections:
@ -550,8 +206,7 @@ def get_circuitpy_aliases(connections, circuitpydef):
return connections return connections
def get_chip_pinout(connections, pinoutcsv): def get_chip_pinout(connections, pinoutcsv):
global themes, chip_description, pinmuxes, pinmux_in_use global chip_description
with open(pinoutcsv, mode='r') as infile: with open(pinoutcsv, mode='r') as infile:
pinarray = [] pinarray = []
reader = csv.reader(infile) reader = csv.reader(infile)
@ -567,39 +222,17 @@ def get_chip_pinout(connections, pinoutcsv):
d[header[i]] = mux d[header[i]] = mux
pinarray.append(d) pinarray.append(d)
pinmuxes = header pinmuxes = header
pinmux_in_use = [0] * len(pinmuxes)
print("Mux options available: ", pinmuxes) print("Mux options available: ", pinmuxes)
return pinarray return pinarray
def draw_label(dwg, group, label_text, label_type, box_x, box_y, box_w, box_h): def draw_label(dwg, group, label_text, label_type, box_x, box_y, box_w, box_h):
# Some initial assumptions on label style, might override later below
box_outline = None # No box outline
text_weight = None # Normal text weight
text_color = 'black'
# Check if label_type is in the theme set...
theme = next((theme for theme in themes if theme['type'] == label_type), None) theme = next((theme for theme in themes if theme['type'] == label_type), None)
if theme: # label_type IS one of the global theme settings
box_fill = theme['fill']
if 'outline' in theme:
box_outline = theme['outline'] box_outline = theme['outline']
if 'font-weight' in theme: box_fill = theme['fill']
text_weight = theme['font-weight'] text_color = 'black'
elif label_type == 'Arduino': # Some auto-color things only work if RGB (not named) fill is specified...
box_fill = palette[2] if (box_fill[0] == '#'):
else: # label_type IS NOT in themes, must be a muxed pin.
# Switch to chromatic color scheme based on index of label_type
# in the CSV pinmuxes header.
box_fill = palette[chroma[pinmuxes.index(label_type) % len(chroma)]]
if pinmuxes.index(label_type) >= len(chroma):
box_outline = 'auto' # Repeating color sequence, add outline
if (box_fill == 'black'):
text_color = 'white'
elif (box_fill[0] == '#'):
red = int(box_fill[1:3], 16) red = int(box_fill[1:3], 16)
green = int(box_fill[3:5], 16) green = int(box_fill[3:5], 16)
blue = int(box_fill[5:7], 16) blue = int(box_fill[5:7], 16)
@ -613,13 +246,17 @@ def draw_label(dwg, group, label_text, label_type, box_x, box_y, box_w, box_h):
if box_outline == 'auto': if box_outline == 'auto':
rgb = ((red // 2)) << 16 | ((green // 2) << 8) | (blue // 2) rgb = ((red // 2)) << 16 | ((green // 2) << 8) | (blue // 2)
box_outline = '#{0:0{1}X}'.format(rgb, 6) box_outline = '#{0:0{1}X}'.format(rgb, 6)
elif (box_fill == 'black'):
text_color = 'white'
#box_opacity = theme['opacity'] # Not used, everything's gone opaque
weight = theme['font-weight']
# draw a box # draw a box
box_x += BOX_INSET[0] # Inset a bit so boxes aren't touching box_x += BOX_INSET[0] # Inset a bit so boxes aren't touching
box_y += BOX_INSET[1] box_y += BOX_INSET[1]
box_w -= BOX_INSET[0] * 2 box_w -= BOX_INSET[0] * 2
box_h -= BOX_INSET[1] * 2 box_h -= BOX_INSET[1] * 2
if box_outline: if box_outline != 'none':
box_x += BOX_STROKE_WIDTH * 0.5 # Inset further for stroke box_x += BOX_STROKE_WIDTH * 0.5 # Inset further for stroke
box_y += BOX_STROKE_WIDTH * 0.5 # (so box extents visually align) box_y += BOX_STROKE_WIDTH * 0.5 # (so box extents visually align)
box_w -= BOX_STROKE_WIDTH box_w -= BOX_STROKE_WIDTH
@ -627,8 +264,7 @@ def draw_label(dwg, group, label_text, label_type, box_x, box_y, box_w, box_h):
group.add(dwg.rect( group.add(dwg.rect(
(box_x, box_y), (box_x, box_y),
(box_w, box_h), (box_w, box_h),
BOX_CORNER_RADIUS[0] - BOX_STROKE_WIDTH * 0.5, BOX_CORNER_RADIUS[0], BOX_CORNER_RADIUS[1],
BOX_CORNER_RADIUS[1] - BOX_STROKE_WIDTH * 0.5,
stroke = box_outline, stroke = box_outline,
stroke_width = BOX_STROKE_WIDTH, stroke_width = BOX_STROKE_WIDTH,
fill = box_fill fill = box_fill
@ -641,36 +277,24 @@ def draw_label(dwg, group, label_text, label_type, box_x, box_y, box_w, box_h):
fill = box_fill fill = box_fill
)) ))
if label_text: if label_text:
if text_weight:
group.add(dwg.text(
label_text,
insert = (box_x+box_w/2, box_y+box_h/2+LABEL_HEIGHTADJUST),
font_size = LABEL_FONTSIZE,
font_family = LABEL_FONT,
font_weight = text_weight,
fill = text_color,
text_anchor = "middle",
))
else:
group.add(dwg.text( group.add(dwg.text(
label_text, label_text,
insert = (box_x+box_w/2, box_y+box_h/2+LABEL_HEIGHTADJUST), insert = (box_x+box_w/2, box_y+box_h/2+LABEL_HEIGHTADJUST),
font_size = LABEL_FONTSIZE, font_size = LABEL_FONTSIZE,
font_family = LABEL_FONT, font_family = LABEL_FONT,
font_weight = weight,
fill = text_color, fill = text_color,
text_anchor = "middle", text_anchor = "middle",
)) ))
def draw_pinlabels_svg(connections): def draw_pinlabels_svg(connections):
global arduino_in_use
dwg = svgwrite.Drawing(filename=str("pinlabels.svg"), profile='tiny', size=(100,100)) dwg = svgwrite.Drawing(filename=str("pinlabels.svg"), profile='tiny', size=(100,100))
# collect all muxstrings to calculate label widths: # collect all muxstrings to calculate label widths:
muxstringlen = {} muxstringlen = {}
for i, conn in enumerate(connections): for i, conn in enumerate(connections):
if not conn.get('mux'): if not 'mux' in conn:
continue continue
for mux in conn['mux']: for mux in conn['mux']:
if not mux in muxstringlen: if not mux in muxstringlen:
@ -692,33 +316,13 @@ def draw_pinlabels_svg(connections):
for i, conn in enumerate(tops+[None,]+bottoms+[None,]+rights+[None,]+lefts+[None,]+others): for i, conn in enumerate(tops+[None,]+bottoms+[None,]+rights+[None,]+lefts+[None,]+others):
if conn == None: # Gap between groups if conn == None: # Gap between groups
continue continue
box_x = 0 box_x = last_used_x = 0
box_w = max(6, len(conn['name'])+1) * BOX_WIDTH_PER_CHAR box_w = max(6, len(conn['name'])+1) * BOX_WIDTH_PER_CHAR
# If it's a left/bottom box, and wider than the standard width,
# scoot left so the right edge is aligned with other boxes.
if conn['location'] in ('left', 'bottom'):
box_x -= box_w - 6 * BOX_WIDTH_PER_CHAR
last_used_x = box_x
first_box_w = box_w first_box_w = box_w
last_used_w = box_w last_used_w = box_w
if conn['location'] in ('top', 'right', 'unknown'): if conn['location'] in ('top', 'right', 'unknown'):
box_x += box_w box_x += box_w
if 'mux' in conn: # power pins don't have muxing, its cool!
# Adjust endpoint if there's an Arduino pin defined.
# Neither a theme nor a mux, just a weird one-off...
if 'arduinopin' in conn:
#box_w = (longest_arduinopin + 1) * BOX_WIDTH_PER_CHAR
box_w = longest_arduinopin * BOX_WIDTH_PER_CHAR
if conn['location'] in ('top', 'right', 'unknown'):
last_used_x = box_x # Save-and-increment
box_x += box_w
elif conn['location'] in ('left', 'bottom'):
box_x -= box_w # Increment-and-save
last_used_x = box_x
last_used_w = box_w
if conn.get('mux'): # power pins don't have muxing, its cool!
for mux in conn['mux']: for mux in conn['mux']:
box_w = (muxstringlen[mux]+1) * BOX_WIDTH_PER_CHAR box_w = (muxstringlen[mux]+1) * BOX_WIDTH_PER_CHAR
# Increment box_x regardless to maintain mux columns. # Increment box_x regardless to maintain mux columns.
@ -738,9 +342,9 @@ def draw_pinlabels_svg(connections):
g = dwg.g() # Create group for connection g = dwg.g() # Create group for connection
group.append(g) # Add to list group.append(g) # Add to list
if conn['location'] in ('top', 'right', 'unknown'): if conn['location'] in ('top', 'right', 'unknown'):
g.add(dwg.line(start=(-4, line_y), end=(last_used_x + last_used_w * 0.5, line_y), stroke=ROW_STROKE_COLOR, stroke_width = ROW_STROKE_WIDTH, stroke_linecap='round')) g.add(dwg.line(start=(-4, line_y), end=(last_used_x + last_used_w * 0.5, line_y), stroke=ROW_STROKE_COLOR, stroke_width = ROW_STROKE_WIDTH, stroke_linecap='round'));
if conn['location'] in ('bottom', 'left'): if conn['location'] in ('bottom', 'left'):
g.add(dwg.line(start=(6 * BOX_WIDTH_PER_CHAR + 4, line_y), end=(last_used_x + last_used_w * 0.5, line_y), stroke=ROW_STROKE_COLOR, stroke_width = ROW_STROKE_WIDTH, stroke_linecap='round')) g.add(dwg.line(start=(first_box_w + 4, line_y), end=(last_used_x + last_used_w * 0.5, line_y), stroke=ROW_STROKE_COLOR, stroke_width = ROW_STROKE_WIDTH, stroke_linecap='round'));
# pick out each connection # pick out each connection
group_index = 0 # Only increments on non-None connections, unlike enum group_index = 0 # Only increments on non-None connections, unlike enum
@ -761,25 +365,20 @@ def draw_pinlabels_svg(connections):
# clean up some names! # clean up some names!
label_type = 'CircuitPython Name' label_type = 'CircuitPython Name'
if name_label in ("3.3V", "VMAX", "VHIGH", "VIN", "5V", "VBAT", "VBUS", "VHI", "VCCIO", "VIO"): if name_label in ("3.3V", "VHIGH", "VIN", "5V", "VBAT", "VBUS", "VHI"):
label_type = 'Power' label_type = 'Power'
if name_label in ("GND"): if name_label in ("GND"):
label_type = 'GND' label_type = 'GND'
if name_label in ("EN", "RST", "RESET", "SWCLK", "SWC", "SWDIO", "SWD"): if name_label in ("EN", "RESET", "SWCLK", "SWC", "SWDIO", "SWD"):
label_type = 'Control' label_type = 'Control'
if name_label in ('SCL', 'SCL1', 'SCL0') and conn.get('svgtype') == 'ellipse': if name_label in ('SCL', 'SCL1', 'SCL0') and conn['svgtype'] == 'ellipse':
# special stemma QT! # special stemma QT!
label_type = 'QT_SCL' label_type = 'QT_SCL'
if name_label in ('SDA', 'SDA1', 'SDA0') and conn.get('svgtype') == 'ellipse': if name_label in ('SDA', 'SDA1', 'SDA0') and conn['svgtype'] == 'ellipse':
# special stemma QT! # special stemma QT!
label_type = 'QT_SDA' label_type = 'QT_SDA'
# Draw the first-column box (could be power pin or Arduino pin #) # Draw the first-column box (could be power pin or Arduino pin #)
# (this box/label relates to the global 'themes' list).
# If it's in left/bottom groups, scoot left a little if box is
# wider than the 6-char default (so right edges align).
if conn['location'] in ('left', 'bottom'):
box_x -= box_w - 6 * BOX_WIDTH_PER_CHAR
draw_label(dwg, group[group_index], name_label, label_type, box_x, box_y, box_w, box_h) draw_label(dwg, group[group_index], name_label, label_type, box_x, box_y, box_w, box_h)
# Increment box_x only on 'right' locations, because the behavior # Increment box_x only on 'right' locations, because the behavior
# for subsequent right boxes is to draw-and-increment, whereas # for subsequent right boxes is to draw-and-increment, whereas
@ -788,25 +387,10 @@ def draw_pinlabels_svg(connections):
box_x += box_w box_x += box_w
mark_as_in_use(label_type) mark_as_in_use(label_type)
# Arduino pins are sort of brute-force wedged in here, neither a if 'mux' in conn: # power pins don't have muxing, its cool!
# theme nor a muxed pin...the position and label-drawing from
# above are duplicated (except box_x decrement is different).
if 'arduinopin' in conn:
box_w = (longest_arduinopin + 1) * BOX_WIDTH_PER_CHAR
if conn['location'] in ('left', 'bottom'):
box_x -= box_w
draw_label(dwg, group[group_index], conn['arduinopin'], 'Arduino', box_x, box_y, box_w, box_h)
if conn['location'] in ('top', 'right', 'unknown'):
box_x += box_w
arduino_in_use = True
if conn.get('mux'): # power pins don't have muxing, its cool!
for mux in conn['mux']: for mux in conn['mux']:
label = conn['mux'][mux] # Label (if any) for this pin/mux label = conn['mux'][mux]
if muxstringlen[mux]: # Typical label length for this mux
box_w = (muxstringlen[mux]+1) * BOX_WIDTH_PER_CHAR box_w = (muxstringlen[mux]+1) * BOX_WIDTH_PER_CHAR
else:
box_w = 0
if not label: if not label:
# Increment box_x regardless for sparse tables # Increment box_x regardless for sparse tables
if conn['location'] in ('top', 'right', 'unknown'): if conn['location'] in ('top', 'right', 'unknown'):
@ -816,64 +400,35 @@ def draw_pinlabels_svg(connections):
continue continue
if mux == 'GPIO': # the underlying pin GPIO name if mux == 'GPIO': # the underlying pin GPIO name
label_type = 'Port' label_type = 'Port'
elif mux in ('SPI', 'HS/QSPI', 'QSPI/CAN') : # SPI ports elif mux in ('SPI', 'HS/QSPI') : # SPI ports
label_type = 'SPI' label_type = 'SPI'
elif mux in ('I2C',): # I2C ports elif mux == 'I2C': # I2C ports
label_type = 'I2C' label_type = 'I2C'
elif mux in ('UART', 'Debug'): # UART ports elif mux in ('UART', 'Debug'): # UART ports
label_type = 'UART' label_type = 'UART'
elif mux == 'PWM': # PWM's elif mux == 'PWM': # PWM's
label_type = 'PWM' label_type = 'PWM'
elif mux in('Touch', 'TOUCH'): # touch capable elif mux == 'Touch': # touch capable
label_type = 'Touch' label_type = 'Analog'
elif mux == 'ADC': # analog ins elif mux == 'ADC': # analog ins
label_type = 'Analog' label_type = 'Analog'
elif mux == 'Arduino ADC': # analog ins
label_type = 'SERCOM'
elif mux == 'Other': elif mux == 'Other':
label_type = 'I2C' label_type = 'I2C'
elif mux == 'Power Domain': elif mux == 'Power Domain':
label_type = 'Power Domain' label_type = 'Power'
elif mux in ('High Speed', "PCC"):
label_type = 'High Speed'
elif mux == 'Low Speed':
label_type = 'Low Speed'
elif mux == 'RTC':
label_type = 'Low Speed'
elif mux == 'Speed':
label_type = 'Speed'
elif mux in('Special', 'SPECIAL'):
label_type = 'Special'
elif mux == 'INT':
label_type = 'Interrupt'
elif mux == 'DAC/AREF':
label_type = 'DAC/AREF'
elif mux == 'SERCOM':
label_type = 'SERCOM'
elif mux == 'SERCOM Alt':
label_type = 'SERCOM Alt'
elif mux == 'Timer':
label_type = 'Timer'
elif mux == 'Timer Alt':
label_type = 'Timer Alt'
elif mux == 'Timer Alt2':
label_type = 'Timer Alt2'
elif mux in ('SDMMC', "I2S"):
label_type = 'SERCOM'
else: else:
continue continue
# Here, labels are chromatic mux items, not in themes
if conn['location'] in ('top', 'right', 'unknown'): if conn['location'] in ('top', 'right', 'unknown'):
# Draw-and-increment # Draw-and-increment
draw_label(dwg, group[group_index], label, mux, box_x, box_y, box_w, box_h) draw_label(dwg, group[group_index], label, label_type, box_x, box_y, box_w, box_h)
box_x += box_w box_x += box_w
if conn['location'] in ('bottom', 'left'): if conn['location'] in ('bottom', 'left'):
# Increment-and-draw # Increment-and-draw
box_x -= box_w box_x -= box_w
draw_label(dwg, group[group_index], label, mux, box_x, box_y, box_w, box_h) draw_label(dwg, group[group_index], label, label_type, box_x, box_y, box_w, box_h)
mark_as_in_use(mux) # Show label type on legend mark_as_in_use(label_type) # Show label type on legend
else: else:
# For power pins with no mux, keep legend up to date # For power pins with no mux, keep legend up to date
# and don't 'continue,' so group_index keeps in sync. # and don't 'continue,' so group_index keeps in sync.
@ -885,18 +440,22 @@ def draw_pinlabels_svg(connections):
# Add legend # Add legend
g = dwg.g() g = dwg.g()
box_y = BOX_HEIGHT * (i + 4) box_y = BOX_HEIGHT * (i + 4)
# Draw legend items for in-use themes
for theme in themes: for theme in themes:
# Skip themes not in use, and the STEMMA QT connector # Skip themes not in use, and the STEMMA QT connector
if 'in_use' in theme and not theme['type'].startswith('QT_'): if 'in_use' in theme and not theme['type'].startswith('QT_'):
box_y = draw_legend_box(dwg, g, theme['type'], box_y) label_type = theme['type']
# Wedge the Arduino pin in there if needed draw_label(dwg, g, None, label_type, 0, box_y, BOX_HEIGHT, BOX_HEIGHT)
if arduino_in_use: label_text = label_type
box_y = draw_legend_box(dwg, g, 'Arduino', box_y) g.add(dwg.text(
# And then add in-use pin mux items to legend label_text,
for i, mux in enumerate(pinmuxes): insert = (BOX_HEIGHT * 1.2, box_y+box_h/2+LABEL_HEIGHTADJUST),
if pinmux_in_use[i]: font_size = LABEL_FONTSIZE,
box_y = draw_legend_box(dwg, g, mux, box_y) font_family = LABEL_FONT,
font_weight = 'bold',
fill = 'black',
text_anchor = 'start'
))
box_y += BOX_HEIGHT
dwg.add(g) dwg.add(g)
# add title and url # add title and url
@ -908,7 +467,7 @@ def draw_pinlabels_svg(connections):
font_family = LABEL_FONT, font_family = LABEL_FONT,
font_weight = 'bold', font_weight = 'bold',
fill = 'black', fill = 'black',
text_anchor = 'middle' text_anchor = 'end'
)) ))
g.add(dwg.text( g.add(dwg.text(
product_url, product_url,
@ -917,66 +476,37 @@ def draw_pinlabels_svg(connections):
font_family = LABEL_FONT, font_family = LABEL_FONT,
font_weight = 'bold', font_weight = 'bold',
fill = 'black', fill = 'black',
text_anchor = 'middle' text_anchor = 'end'
)) ))
dwg.add(g) dwg.add(g)
print(chip_description) print(chip_description)
box_y += 30 dwg.add(dwg.text(
g = dwg.g() # Create group for description chip_description,
strings = textwrap.wrap(chip_description, width=40) insert = (0, box_y+30),
for s in strings:
g.add(dwg.text(
s,
insert = (0, box_y),
font_size = LABEL_FONTSIZE, font_size = LABEL_FONTSIZE,
font_family = LABEL_FONT, font_family = LABEL_FONT,
font_weight = 'normal', font_weight = 'normal',
fill = 'black', fill = 'black',
text_anchor = 'start',
))
box_y += LABEL_FONTSIZE
dwg.add(g)
dwg.save()
# Draws colored box and label, returns next avail Y position
def draw_legend_box(dwg, g, label_text, box_y):
draw_label(dwg, g, None, label_text, 0, box_y, BOX_HEIGHT, BOX_HEIGHT)
if label_text == 'Arduino':
label_text = 'Arduino Name'
g.add(dwg.text(
label_text,
insert = (BOX_HEIGHT * 1.2, box_y+BOX_HEIGHT/2+LABEL_HEIGHTADJUST),
font_size = LABEL_FONTSIZE,
font_family = LABEL_FONT,
font_weight = 'bold',
fill = 'black',
text_anchor = 'start' text_anchor = 'start'
)) ))
return box_y + BOX_HEIGHT dwg.save()
# Add an 'in_use' key to themes that get referenced. # Add an 'in_use' key to themes that get referenced.
# Only these items are shown on the legend. # Only these items are shown on the legend.
def mark_as_in_use(label_type): def mark_as_in_use(label_type):
# If label_type matches a theme, add/set 'in_use' element:
for theme in themes: for theme in themes:
if theme['type'] == label_type: if theme['type'] == label_type and not 'in_use' in theme:
theme['in_use'] = '1' theme['in_use'] = '1'
return
# If label_type didn't match any themes, it must be a pinmux,
# marked in a simple array.
pinmux_in_use[pinmuxes.index(label_type)] = 1
@click.command() @click.command()
@click.argument('FZPZ') @click.argument('FZPZ')
@click.argument('circuitpydef') @click.argument('circuitpydef')
@click.argument('pinoutcsv') @click.argument('pinoutcsv')
@click.option('-a', '--arduino', 'arduinovariantfolder')
@click.option('-s', '--substitute', 'substitute', nargs=2) @click.option('-s', '--substitute', 'substitute', nargs=2)
def parse(fzpz, circuitpydef, pinoutcsv, arduinovariantfolder, substitute): def parse(fzpz, circuitpydef, pinoutcsv, substitute):
# fzpz are actually zip files! # fzpz are actually zip files!
shutil.copyfile(fzpz, fzpz+".zip") shutil.copyfile(fzpz, fzpz+".zip")
# delete any old workdir # delete any old workdir
@ -1001,23 +531,11 @@ def parse(fzpz, circuitpydef, pinoutcsv, arduinovariantfolder, substitute):
if conn['name'] == rename[0]: if conn['name'] == rename[0]:
conn['name'] = rename[1] conn['name'] = rename[1]
# find the 'true' GPIO pin names via the circuitpython file # find the 'true' GPIO pine via the circuitpython file
# e.g. "MISO" and "D2" map to "GPIO03" or "P0.04"
if circuitpydef != "None":
connections = get_circuitpy_aliases(connections, circuitpydef) connections = get_circuitpy_aliases(connections, circuitpydef)
# find the mapping between gpio pins and arduino pins
# atmega 328's/32u4 dont have a mapping
if not arduinovariantfolder and pinoutcsv == "atmega328pins.csv":
arduinovariantfolder = "atmega328"
if not arduinovariantfolder and pinoutcsv == "atmega32u4pins.csv":
arduinovariantfolder = "atmega32u4"
if not arduinovariantfolder and pinoutcsv == "attiny8xpins.csv":
arduinovariantfolder = "attiny8x"
connections = get_arduino_mapping(connections, arduinovariantfolder)
# open and parse the pinout mapper CSV # open and parse the pinout mapper CSV
pinarray = get_chip_pinout(connections, pinoutcsv) pinarray = get_chip_pinout(connections, pinoutcsv)
#print(pinarray)
# get SVG width and height # get SVG width and height
bb_sg = sg.fromfile(svgfilename) bb_sg = sg.fromfile(svgfilename)
@ -1026,18 +544,10 @@ def parse(fzpz, circuitpydef, pinoutcsv, arduinovariantfolder, substitute):
svg_height = bb_sg.height svg_height = bb_sg.height
if "in" in svg_width: if "in" in svg_width:
svg_width = 25.4 * float(svg_width[:-2]) * MM_TO_PX svg_width = 25.4 * float(svg_width[:-2]) * MM_TO_PX
elif "mm" in svg_width:
svg_width = float(svg_width[:-2]) * MM_TO_PX
elif "px" in svg_width:
svg_width = float(svg_width[:-2])
else: else:
raise RuntimeError("Dont know units of width!", svg_width) raise RuntimeError("Dont know units of width!", svg_width)
if "in" in svg_height: if "in" in svg_height:
svg_height = 25.4 * float(svg_height[:-2]) * MM_TO_PX svg_height = 25.4 * float(svg_height[:-2]) * MM_TO_PX
elif "mm" in svg_height:
svg_height = float(svg_height[:-2]) * MM_TO_PX
elif "px" in svg_height:
svg_height = float(svg_height[:-2])
else: else:
raise RuntimeError("Dont know units of width!", svg_height) raise RuntimeError("Dont know units of width!", svg_height)
@ -1077,9 +587,7 @@ def parse(fzpz, circuitpydef, pinoutcsv, arduinovariantfolder, substitute):
if not 'pinname' in conn: if not 'pinname' in conn:
continue continue
# find muxes next # find muxes next
muxes = next((pin for pin in pinarray if pin['GPIO'] == conn['pinname']), None) muxes = next((pin for pin in pinarray if pin['GPIO'] == conn['pinname']), None)
#print("***", muxes)
conn['mux'] = muxes conn['mux'] = muxes
draw_pinlabels_svg(connections) draw_pinlabels_svg(connections)

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 150 KiB

After

Width:  |  Height:  |  Size: 49 KiB

View file

@ -1,406 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1280px" height="1024px" viewBox="0 0 1280 1024" enable-background="new 0 0 1280 1024" xml:space="preserve">
<g>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="35" y1="46.9" x2="59" y2="46.9"/>
<path fill="#920000" d="M49.9,43.8h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1H49.9c-0.6,0-1.1-0.5-1.1-1.1V45
C48.8,44.3,49.3,43.8,49.9,43.8z"/>
<text transform="matrix(1 0 0 1 51.8051 48.6211)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">3.3V</text>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="44.2" y1="32.5" x2="59" y2="32.5"/>
<path fill="#FFFF6D" d="M49.9,29.5h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1H49.9c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C48.7,30,49.2,29.5,49.9,29.5z"/>
<text transform="matrix(1 0 0 1 53.5721 34.2982)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="39.6" y1="39.7" x2="59" y2="39.7"/>
<path fill="#006DDB" d="M49.9,36.7h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1H49.9c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C48.7,37.2,49.2,36.7,49.9,36.7z"/>
<text transform="matrix(1 0 0 1 53.5721 41.4981)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="30.5" y1="54" x2="59" y2="54"/>
<path d="M49.9,51h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1H49.9c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C48.8,51.5,49.3,51,49.9,51z"/>
<text transform="matrix(1 0 0 1 53.6053 55.744)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="35" y1="46.9" x2="35.1" y2="26.4"/>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="30.5" y1="53.8" x2="30.5" y2="26.4"/>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="39.6" y1="39.7" x2="39.6" y2="26.4"/>
<line fill="none" stroke="#8C8C8C" stroke-width="0.7087" stroke-linecap="round" x1="44.1" y1="32.5" x2="44.1" y2="26.4"/>
</g>
<g id="g18467" transform="translate(4.4999716,-4.9999826)">
</g>
<g>
<path fill="#DCDCDC" d="M184.9,27.1v-0.2c-0.2,0-0.4,0-0.6,0c-0.3,0-0.5,0-0.8-0.1v0.3h-3.1v-0.3c-0.2,0-0.4,0-0.6,0
c-0.3,0-0.6,0-0.8-0.1V27h-1.3v9.9h1.3v0.2c0.2,0,0.3,0,0.5,0c0.3,0,0.6,0,0.9,0.1V37h3.1v0.3c0.2,0,0.3,0,0.5,0
c0.3,0,0.6,0,0.9,0.1V37h1.3v-9.9H184.9z"/>
<circle fill="#1E1E1E" cx="181.9" cy="32.1" r="2.5"/>
<rect x="177.7" y="36.9" fill="#B4B4B4" width="8.5" height="0.6"/>
<rect x="177.7" y="26.7" fill="#B4B4B4" width="8.5" height="0.6"/>
</g>
<g>
<line fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" x1="234.5" y1="42.4" x2="245.1" y2="40.6"/>
<line fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" x1="234.6" y1="38.1" x2="245.1" y2="33.4"/>
<line fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" x1="245.1" y1="54.9" x2="234.5" y2="50.2"/>
<line fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" x1="245" y1="47.8" x2="234.5" y2="46.1"/>
<line fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" x1="245.1" y1="47.8" x2="255.7" y2="47.8"/>
<line fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" x1="245.1" y1="33.4" x2="255.7" y2="33.4"/>
<line fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" x1="245.1" y1="40.6" x2="255.7" y2="40.6"/>
<line fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" x1="245.1" y1="54.9" x2="255.7" y2="54.9"/>
<path fill="#920000" d="M256.9,44.7h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C255.7,45.2,256.2,44.7,256.9,44.7z"/>
<text transform="matrix(1 0 0 1 258.7333 49.4797)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">3.3V</text>
<path fill="#FFFF6D" d="M256.8,30.4H275c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C255.7,30.9,256.2,30.4,256.8,30.4z"/>
<text transform="matrix(1 0 0 1 260.5004 35.1569)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<path fill="#006DDB" d="M256.8,37.6H275c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C255.7,38.1,256.2,37.6,256.8,37.6z"/>
<text transform="matrix(1 0 0 1 260.5004 42.3569)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<path d="M256.9,51.8h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C255.7,52.3,256.2,51.8,256.9,51.8z"/>
<text transform="matrix(1 0 0 1 260.5336 56.6027)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
<path fill="#FFFF00" d="M256.8,30.4H275c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C255.7,30.9,256.2,30.4,256.8,30.4z"/>
<text transform="matrix(1 0 0 1 260.5002 35.1569)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<path fill="#0000FF" d="M256.8,37.6H275c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C255.7,38.1,256.2,37.6,256.8,37.6z"/>
<text transform="matrix(1 0 0 1 260.5002 42.3569)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<line fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" x1="223.8" y1="38.1" x2="234.5" y2="38.1"/>
<line fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" x1="223.8" y1="42.4" x2="234.5" y2="42.4"/>
<line fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" x1="223.8" y1="46.1" x2="234.4" y2="46.1"/>
<line fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" x1="223.8" y1="50.2" x2="234.5" y2="50.2"/>
<g>
<rect id="rect18427_1_" x="209.9" y="36.2" fill="#333333" stroke="#333333" stroke-width="0.2877" stroke-miterlimit="3.8362" width="12.6" height="15.5"/>
<rect id="rect18429_1_" x="222.4" y="33.6" fill="#666666" width="3.3" height="20.8"/>
<g>
<rect id="rect18431_1_" x="218.8" y="49.2" fill="#666666" width="3.9" height="2.8"/>
<rect id="rect18433_1_" x="218.8" y="46.5" fill="#666666" width="3.9" height="1.5"/>
<rect id="rect18435_1_" x="218.8" y="43.4" fill="#666666" width="3.9" height="1.1"/>
<rect id="rect18437_1_" x="218.8" y="39.8" fill="#666666" width="3.9" height="1.5"/>
<rect id="rect18439_1_" x="218.8" y="36" fill="#666666" width="3.9" height="2.6"/>
</g>
</g>
</g>
<g>
<path fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M145.5,55.5h-43.7
c-1,0-1.9-0.9-1.9-1.9V34.7"/>
<path fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M145.5,62.7h-47
c-1,0-1.9-0.9-1.9-1.9V34.7"/>
<path fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M145.5,41.1h-37
c-1,0-1.9-0.9-1.9-1.9v-4.5"/>
<path fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M145.5,48.3h-40.4
c-1,0-1.9-0.9-1.9-1.9V34.7"/>
<g>
<rect id="rect18427_2_" x="93.8" y="19.6" fill="#333333" stroke="#333333" stroke-width="0.2877" stroke-miterlimit="3.8362" width="15.5" height="12.6"/>
<rect id="rect18429_2_" x="91.1" y="32" fill="#666666" width="20.8" height="3.3"/>
<g>
<rect id="rect18431_2_" x="106.8" y="28.4" fill="#666666" width="2.8" height="3.9"/>
<rect id="rect18433_2_" x="104.1" y="28.4" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18435_2_" x="100.9" y="28.4" fill="#666666" width="1.1" height="3.9"/>
<rect id="rect18437_2_" x="97.4" y="28.4" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18439_2_" x="93.5" y="28.4" fill="#666666" width="2.6" height="3.9"/>
</g>
</g>
<path fill="#920000" d="M136.4,52.5h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C135.3,53,135.8,52.5,136.4,52.5z"/>
<text transform="matrix(1 0 0 1 138.337 57.2971)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">3.3V</text>
<path fill="#0000FF" d="M136.4,45.3h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C135.3,45.8,135.8,45.3,136.4,45.3z"/>
<text transform="matrix(1 0 0 1 140.1373 50.097)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<path fill="#FFFF00" d="M136.4,38.1h18.2c0.6,0,1.1,0.5,1.1,1.1V43c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C135.3,38.6,135.8,38.1,136.4,38.1z"/>
<text transform="matrix(1 0 0 1 140.1373 42.897)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<path d="M136.4,59.7h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C135.3,60.2,135.8,59.7,136.4,59.7z"/>
<text transform="matrix(1 0 0 1 140.1373 64.497)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
</g>
<g>
<line fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" x1="343.1" y1="46.4" x2="332.5" y2="48.2"/>
<line fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" x1="343" y1="50.7" x2="332.5" y2="55.4"/>
<line fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" x1="332.5" y1="33.9" x2="343.1" y2="38.6"/>
<line fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" x1="332.6" y1="41" x2="343.1" y2="42.7"/>
<line fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" x1="332.5" y1="41" x2="321.9" y2="41"/>
<line fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" x1="332.5" y1="55.4" x2="321.9" y2="55.4"/>
<line fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" x1="332.5" y1="48.2" x2="321.9" y2="48.2"/>
<line fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" x1="332.5" y1="33.9" x2="321.9" y2="33.9"/>
<line fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" x1="353.8" y1="50.7" x2="343.1" y2="50.7"/>
<line fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" x1="353.8" y1="46.4" x2="343.1" y2="46.4"/>
<line fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" x1="353.8" y1="42.7" x2="343.2" y2="42.7"/>
<line fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" x1="353.8" y1="38.6" x2="343.1" y2="38.6"/>
<g>
<rect id="rect18427_3_" x="355.8" y="37" fill="#333333" stroke="#333333" stroke-width="0.2877" stroke-miterlimit="3.8362" width="12.6" height="15.5"/>
<rect id="rect18429_3_" x="352.6" y="34.3" fill="#666666" width="3.3" height="20.8"/>
<g>
<rect id="rect18431_3_" x="355.6" y="36.7" fill="#666666" width="3.9" height="2.8"/>
<rect id="rect18433_3_" x="355.6" y="40.7" fill="#666666" width="3.9" height="1.5"/>
<rect id="rect18435_3_" x="355.6" y="44.2" fill="#666666" width="3.9" height="1.1"/>
<rect id="rect18437_3_" x="355.6" y="47.4" fill="#666666" width="3.9" height="1.5"/>
<rect id="rect18439_3_" x="355.6" y="50.1" fill="#666666" width="3.9" height="2.6"/>
</g>
</g>
<path fill="#920000" d="M304.1,38.2h18.2c0.6,0,1.1,0.5,1.1,1.1V43c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C302.9,38.7,303.4,38.2,304.1,38.2z"/>
<text transform="matrix(1 0 0 1 305.9028 42.9297)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">3.3V</text>
<path d="M304.1,31h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C302.9,31.5,303.4,31,304.1,31z"/>
<text transform="matrix(1 0 0 1 307.7031 35.8027)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
<path fill="#FFFF00" d="M304.2,52.4h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C303.1,52.9,303.6,52.4,304.2,52.4z"/>
<text transform="matrix(1 0 0 1 307.857 57.1569)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<path fill="#0000FF" d="M304.2,45.3h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C303.1,45.8,303.6,45.3,304.2,45.3z"/>
<text transform="matrix(1 0 0 1 307.857 50.0569)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
</g>
<g>
<g>
<path fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M456.4,39.2v18.9
c0,1-0.9,1.9-1.9,1.9h-43.7"/>
<path fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M459.7,39.2v26.1
c0,1-0.9,1.9-1.9,1.9h-47"/>
<path fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M449.7,39.2v4.5
c0,1-0.9,1.9-1.9,1.9h-37"/>
<path fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M453.1,39.2v11.7
c0,1-0.9,1.9-1.9,1.9h-40.4"/>
</g>
<g>
<rect id="rect18427_00000178914106809447511930000013866159404436575389_" x="447.2" y="23.9" fill="#333333" stroke="#333333" stroke-width="0.2877" stroke-miterlimit="3.8362" width="15.5" height="12.6"/>
<rect id="rect18429_00000031928373075921312910000014790377498140978847_" x="444.5" y="36.3" fill="#666666" width="20.8" height="3.3"/>
<g>
<rect id="rect18431_00000170993680101322717880000001644850932840291517_" x="460.2" y="32.7" fill="#666666" width="2.8" height="3.9"/>
<rect id="rect18433_00000103241704361221988900000015591929497546297534_" x="457.5" y="32.7" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18435_00000173155515476320139280000004429963318720837812_" x="454.3" y="32.7" fill="#666666" width="1.1" height="3.9"/>
<rect id="rect18437_00000061454898119703330670000013955461483550485126_" x="450.8" y="32.7" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18439_00000055704433746169303960000015895652824250320515_" x="446.9" y="32.7" fill="#666666" width="2.6" height="3.9"/>
</g>
</g>
<g>
<path fill="#920000" d="M409.6,56.8h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C408.5,57.3,409,56.8,409.6,56.8z"/>
<text transform="matrix(1 0 0 1 411.4896 61.5797)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">3.3V</text>
<path fill="#0000FF" d="M409.6,49.6h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C408.5,50.1,409,49.6,409.6,49.6z"/>
<text transform="matrix(1 0 0 1 413.2899 54.3796)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<path fill="#FFFF00" d="M409.6,42.4h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C408.5,42.9,409,42.4,409.6,42.4z"/>
<text transform="matrix(1 0 0 1 413.2899 47.1795)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<path d="M409.6,64h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C408.5,64.5,409,64,409.6,64z"/>
<text transform="matrix(1 0 0 1 413.2899 68.7795)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
</g>
</g>
<g>
<path fill="#E91E32" d="M529.4,45.5c-0.1,0-0.1,0.1-0.1,0.1v2.3c0,0.1,0.1,0.1,0.1,0.1H555c0.1,0,0.1-0.1,0.1-0.1v-2.3
c0-0.1-0.1-0.1-0.1-0.1H529.4z"/>
<path fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" d="M529.4,45.5
c-0.1,0-0.1,0.1-0.1,0.1v2.3c0,0.1,0.1,0.1,0.1,0.1H555c0.1,0,0.1-0.1,0.1-0.1v-2.3c0-0.1-0.1-0.1-0.1-0.1H529.4z"/>
<path fill="#231F20" d="M529.4,38.9c-0.1,0-0.1,0.1-0.1,0.1v2.3c0,0.1,0.1,0.1,0.1,0.1H555c0.1,0,0.1-0.1,0.1-0.1V39
c0-0.1-0.1-0.1-0.1-0.1H529.4z"/>
<path fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" d="M529.4,38.9
c-0.1,0-0.1,0.1-0.1,0.1v2.3c0,0.1,0.1,0.1,0.1,0.1H555c0.1,0,0.1-0.1,0.1-0.1V39c0-0.1-0.1-0.1-0.1-0.1H529.4z"/>
<polygon fill="#F4F4F4" points="529.9,45 529.9,48.6 531.6,49.4 531.6,53.1 528.9,53.1 525.4,51.1 508.6,51.1 508.6,44.2
508.6,35.7 525.4,35.7 528.9,33.7 531.6,33.7 531.6,37.5 529.9,38.2 529.9,42 531.6,42.7 531.6,44.2 "/>
<polygon fill="none" stroke="#231F20" stroke-width="0.2" points="529.9,45 529.9,48.6 531.6,49.4 531.6,53.1 528.9,53.1
525.4,51.1 508.6,51.1 508.6,44.2 508.6,35.7 525.4,35.7 528.9,33.7 531.6,33.7 531.6,37.5 529.9,38.2 529.9,42 531.6,42.7
531.6,44.2 "/>
<rect x="508.6" y="35.7" fill="#919497" width="16.9" height="15.4"/>
<rect x="508.6" y="35.7" fill="none" stroke="#231F20" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="16.9" height="15.4"/>
<polygon fill="#F4F4F4" points="513.7,51.1 508.6,51.1 508.6,44.2 513.7,44.2 513.7,45.5 510.6,45.5 510.6,48 513.7,48 "/>
<polygon fill="none" stroke="#231F20" stroke-width="0.2" points="513.7,51.1 508.6,51.1 508.6,44.2 513.7,44.2 513.7,45.5
510.6,45.5 510.6,48 513.7,48 "/>
<rect x="508.6" y="42.7" fill="#E1E1E1" width="14.4" height="1.5"/>
<rect x="508.6" y="42.7" fill="none" stroke="#231F20" stroke-width="0.2" width="14.4" height="1.5"/>
<rect x="513.7" y="49.4" fill="#E1E1E1" width="9.1" height="1.8"/>
<rect x="513.7" y="49.4" fill="none" stroke="#231F20" stroke-width="0.2" width="9.1" height="1.8"/>
<rect x="513.7" y="35.7" fill="#E1E1E1" width="9.1" height="1.8"/>
<rect x="513.7" y="35.7" fill="none" stroke="#231F20" stroke-width="0.2" width="9.1" height="1.8"/>
<line fill="none" stroke="#000000" stroke-width="0.2" x1="516.2" y1="44.7" x2="516.2" y2="48.9"/>
<line fill="none" stroke="#000000" stroke-width="0.2" x1="525.4" y1="51.1" x2="525.4" y2="44.8"/>
<line fill="none" stroke="#000000" stroke-width="0.2" x1="512.1" y1="48" x2="512.1" y2="45.5"/>
<line fill="none" stroke="#000000" stroke-width="0.2" x1="512.1" y1="41.4" x2="512.1" y2="38.9"/>
<line fill="none" stroke="#000000" stroke-width="0.2" x1="516.2" y1="37.9" x2="516.2" y2="42.3"/>
<line fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" x1="529.9" y1="38.2" x2="529.9" y2="33.7"/>
<line fill="none" stroke="#000000" stroke-width="0.2" x1="525.4" y1="44.8" x2="525.4" y2="35.7"/>
<rect x="529.9" y="42.7" fill="#FFFFFF" width="1.7" height="1.5"/>
<rect x="529.9" y="42.7" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="1.7" height="1.5"/>
<rect x="525.4" y="42" fill="#FFFFFF" width="4.5" height="2.9"/>
<rect x="525.4" y="42" fill="none" stroke="#000000" stroke-width="0.2" width="4.5" height="2.9"/>
<rect x="528.9" y="45" fill="#FFFFFF" width="1" height="8.2"/>
<rect x="528.9" y="45" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="1" height="8.2"/>
<rect x="528.9" y="33.7" fill="#FFFFFF" width="1" height="8.3"/>
<rect x="528.9" y="33.7" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="1" height="8.3"/>
<rect x="510.6" y="38.9" fill="#F1EED9" width="5.2" height="2.5"/>
<rect x="510.6" y="38.9" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="5.2" height="2.5"/>
<rect x="515.1" y="38.9" fill="#E6E1CC" width="0.7" height="2.5"/>
<rect x="515.1" y="38.9" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="0.7" height="2.5"/>
<line fill="none" stroke="#6E7071" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" x1="513.7" y1="44.2" x2="513.7" y2="42.7"/>
<rect x="510.6" y="45.5" fill="#F1EED9" width="5.2" height="2.5"/>
<rect x="510.6" y="45.5" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="5.2" height="2.5"/>
<rect x="515.1" y="45.5" fill="#E6E1CC" width="0.7" height="2.5"/>
<rect x="515.1" y="45.5" fill="none" stroke="#000000" stroke-width="0.2" stroke-linecap="round" stroke-linejoin="round" width="0.7" height="2.5"/>
<path fill="#F4F4F4" d="M522.5,51.1h3V35.7h-3v1.2c0,0.6-0.5,1-1,1h-5.7v4.4h5.7c0.6,0,1,0.5,1,1v0.3c0,0.6-0.5,1-1,1h-5.7v4.3h5.7
c0.6,0,1,0.5,1,1V51.1z"/>
<path fill="none" stroke="#231F20" stroke-width="0.2" d="M522.5,51.1h3V35.7h-3v1.2c0,0.6-0.5,1-1,1h-5.7v4.4h5.7c0.6,0,1,0.5,1,1
v0.3c0,0.6-0.5,1-1,1h-5.7v4.3h5.7c0.6,0,1,0.5,1,1V51.1z"/>
<polyline fill="#F4F4F4" points="513.7,35.7 508.6,35.7 508.6,42.7 513.7,42.7 513.7,41.4 510.6,41.4 510.6,38.9 513.7,38.9
513.7,35.7 "/>
<polyline fill="none" stroke="#231F20" stroke-width="0.2" points="513.7,35.7 508.6,35.7 508.6,42.7 513.7,42.7 513.7,41.4
510.6,41.4 510.6,38.9 513.7,38.9 513.7,35.7 "/>
</g>
<g>
<path fill="#A3A5A7" d="M617.2,53.4h-17c-0.1,0-0.1,0-0.2,0c-0.9-0.1-1.6-0.8-1.6-1.8c0-0.3,0.1-0.6,0.2-0.9c0,0,0-0.1,0.1-0.1
l8.5-13.8l0.1-0.1c0.3-0.4,0.8-0.7,1.4-0.7c0.6,0,1.1,0.3,1.4,0.7c0,0,0,0.1,0.1,0.1l8.5,13.8l0.1,0.1c0.1,0.2,0.2,0.5,0.2,0.8
c0,0.9-0.7,1.7-1.6,1.8C617.4,53.4,617.3,53.4,617.2,53.4 M608.7,36.4c-0.5,0-0.9,0.2-1.2,0.6l-0.1,0.1l-8.5,13.8c0,0,0,0,0,0.1
c-0.1,0.2-0.2,0.5-0.2,0.7c0,0.8,0.6,1.4,1.3,1.5c0.1,0,0.1,0,0.1,0h17h0.1c0.8-0.1,1.3-0.7,1.3-1.5c0-0.2-0.1-0.5-0.2-0.7
c0,0,0-0.1-0.1-0.1L610,37.1c0,0,0,0-0.1-0.1C609.6,36.6,609.2,36.4,608.7,36.4"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#F39337" d="M618.1,51.6c0,0.5-0.4,0.9-0.9,0.9l0,0h-17l0,0l0,0
c-0.5,0-0.9-0.4-0.9-0.9c0-0.2,0.1-0.3,0.1-0.5l0,0l8.5-13.8l0,0c0.2-0.2,0.4-0.4,0.7-0.4s0.6,0.2,0.8,0.4l0,0l8.5,13.8l0,0
C618.1,51.3,618.1,51.5,618.1,51.6"/>
<path fill="#E3E4E4" d="M617.2,52.7H600l0,0c-0.5-0.1-0.9-0.5-0.9-1c0-0.1,0-0.3,0.1-0.4l0,0l0.1-0.1l8.6-13.9l0,0
c0.2-0.2,0.5-0.4,0.8-0.4s0.6,0.1,0.8,0.4l0,0l0.1,0.1l8.6,13.9l0,0c0.1,0.1,0.1,0.3,0.1,0.4c0,0.5-0.4,0.9-0.9,1l0,0L617.2,52.7z
M600.3,52.4H617l0,0h0.1c0.4,0,0.7-0.3,0.7-0.7c0-0.1,0-0.3-0.1-0.4l-0.1-0.1l0,0l-8.4-13.6l0,0l-0.1-0.1
c-0.1-0.2-0.4-0.4-0.6-0.4c-0.2,0-0.5,0.1-0.6,0.3l-0.1,0.1l0,0l-8.4,13.5l0,0l-0.1,0.1c-0.1,0.1-0.1,0.3-0.1,0.4
c0,0.4,0.3,0.7,0.7,0.7L600.3,52.4L600.3,52.4L600.3,52.4z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M609.9,42c0-0.6-0.5-1.2-1.2-1.2c-0.6,0-1.2,0.5-1.2,1.2v4.4
c0,0.7,0.5,1.2,1.2,1.2c0.6,0,1.2-0.5,1.2-1.2V42z"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M608.7,48.4c-0.6,0-1.2,0.5-1.2,1.2c0,0.6,0.5,1.2,1.2,1.2
c0.6,0,1.2-0.5,1.2-1.2S609.4,48.4,608.7,48.4"/>
</g>
<g>
<path fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M724.2,36.6v19.8
c0,1.4-0.7,2.3-2,2.3h-40.3"/>
<path fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M720.9,30.6v18.9
c0,1-0.9,1.9-1.8,1.9h-41.4"/>
<path fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M727.5,31.4v31.3
c0,2.8-0.5,3.2-3.2,3.2h-35.7"/>
<path fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M717.5,23.7v18.6
c0,1-0.9,1.9-1.9,1.9h-37.9"/>
<path fill="#0000FF" d="M677.4,55.5h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C676.3,56,676.8,55.5,677.4,55.5z"/>
<path d="M677.4,41h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C676.3,41.5,676.8,41,677.4,41z"/>
<text transform="matrix(1 0 0 1 681.131 45.8295)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
<path fill="#FFFF00" d="M677.4,62.7h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C676.3,63.2,676.8,62.7,677.4,62.7z"/>
<g>
<rect id="rect18427_00000060028905247321236260000016538577171732800398_" x="715" y="22.5" fill="#333333" stroke="#333333" stroke-width="0.2877" stroke-miterlimit="3.8362" width="15.5" height="12.6"/>
<rect id="rect18429_00000136380620032927873150000008133730919514636695_" x="712.3" y="35" fill="#666666" width="20.8" height="3.3"/>
<g>
<rect id="rect18431_00000067232381136894892490000013012950741728482693_" x="728" y="31.4" fill="#666666" width="2.8" height="3.9"/>
<rect id="rect18433_00000039092270229879896300000000163092724316894638_" x="725.3" y="31.4" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18435_00000018217946427967510590000005138267382436280508_" x="722.1" y="31.4" fill="#666666" width="1.1" height="3.9"/>
<rect id="rect18437_00000053525560374292404480000001696303565037957564_" x="718.6" y="31.4" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18439_00000061453906011602837510000005837779149130639238_" x="714.7" y="31.4" fill="#666666" width="2.6" height="3.9"/>
</g>
</g>
<path fill="#920000" d="M677.4,48.2h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C676.3,48.8,676.8,48.2,677.4,48.2z"/>
<text transform="matrix(1 0 0 1 679.3307 53.0297)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">3.3V</text>
<path fill="#0000FF" d="M677.4,55.5h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C676.3,56,676.8,55.5,677.4,55.5z"/>
<text transform="matrix(1 0 0 1 681.131 60.2296)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<path fill="#FFFF00" d="M677.4,62.7h18.2c0.6,0,1.1,0.5,1.1,1.1v3.8c0,0.6-0.5,1.1-1.1,1.1h-18.2c-0.6,0-1.1-0.5-1.1-1.1v-3.8
C676.3,63.2,676.8,62.7,677.4,62.7z"/>
<text transform="matrix(1 0 0 1 681.131 67.4295)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
</g>
<g>
<path fill="#A3A5A7" d="M617.2,83.2h-17c-0.1,0-0.1,0-0.2,0c-1-0.1-1.7-0.9-1.6-1.9c0-0.2,0.1-0.5,0.2-0.7c0,0,0-0.1,0.1-0.1
l8.5-13.8l0.1-0.1c0.6-0.8,1.7-0.9,2.5-0.3c0.1,0.1,0.3,0.2,0.4,0.4c0,0,0,0.1,0.1,0.1l8.5,13.8l0.1,0.1c0.4,0.9,0.1,1.9-0.8,2.4
c-0.2,0.1-0.4,0.2-0.6,0.2C617.3,83.2,617.3,83.2,617.2,83.2 M608.7,66.1c-0.5,0-0.9,0.2-1.2,0.6l-0.1,0.1l-8.5,13.8c0,0,0,0,0,0.1
c-0.1,0.2-0.2,0.5-0.2,0.7c0,0.8,0.6,1.4,1.3,1.5h0.1h17h0.1c0.8-0.1,1.3-0.7,1.3-1.5c0-0.2-0.1-0.5-0.2-0.7c0,0,0-0.1-0.1-0.1
L610,66.8c0,0,0,0-0.1-0.1C609.6,66.4,609.2,66.1,608.7,66.1"/>
<path fill-rule="evenodd" clip-rule="evenodd" fill="#1536FF" d="M618.1,81.4c0,0.5-0.4,0.9-0.9,0.9l0,0h-17l0,0l0,0
c-0.5,0-0.9-0.4-0.9-0.9c0-0.2,0-0.3,0.1-0.5l0,0l8.5-13.8l0,0c0.3-0.4,0.8-0.5,1.2-0.3c0.1,0.1,0.2,0.2,0.3,0.3l0,0L618,81l0,0
C618.1,81.1,618.1,81.3,618.1,81.4"/>
<path fill="#E3E4E4" d="M617.2,82.4H600l0,0c-0.5-0.1-0.9-0.5-0.9-1c0-0.1,0-0.3,0.1-0.4l0,0l0.1-0.1l8.6-13.9l0,0
c0.4-0.4,1-0.5,1.4-0.1l0.1,0.1l0,0l0.1,0.1l8.6,13.9l0,0c0.2,0.5,0,1.1-0.5,1.3c-0.1,0-0.2,0.1-0.3,0.1l0,0H617.2z M600.3,82.2
H617l0,0h0.1c0.4,0,0.7-0.3,0.7-0.7c0-0.1,0-0.3-0.1-0.4l-0.1-0.1l0,0l-8.4-13.6l0,0l-0.1-0.1c-0.2-0.3-0.7-0.5-1-0.3
c-0.1,0.1-0.2,0.1-0.2,0.2l-0.1,0.1l0,0l-8.4,13.6l0,0l-0.1,0.1c-0.2,0.3-0.1,0.8,0.2,1c0.1,0.1,0.3,0.1,0.4,0.1L600.3,82.2
L600.3,82.2L600.3,82.2z"/>
<text transform="matrix(1 0 0 1 604.9225 80.8256)" fill="#FFFFFF" font-family="'ArialRoundedMTBold'" font-size="13px">?</text>
</g>
<g>
<path fill="none" stroke="#FF0000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M780.7648,49.9665
v-18.9c0-1,0.9-1.9,1.9-1.9h43.7"/>
<path fill="none" stroke="#000000" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M777.4648,49.9665
v-26.1c0-1,0.7156-1.9,1.5107-1.9h37.3708"/>
<path fill="none" stroke="#FFFF00" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M787.4648,49.9665
v-4.5c0-1,0.7454-1.9,1.5736-1.9h30.6431"/>
<path fill="none" stroke="#0000FF" stroke-width="0.7087" stroke-linecap="round" stroke-linejoin="round" d="M784.0648,49.9665
v-11.7c0-1,0.7706-1.9,1.6269-1.9h34.5937"/>
<g>
<rect id="rect18427_00000116943696674707758360000017825434837459895480_" x="774.6648" y="52.4665" fill="#333333" stroke="#333333" stroke-width="0.2877" stroke-miterlimit="3.8362" width="15.5" height="12.6"/>
<rect id="rect18429_00000137090772507022974370000005226029994886005931_" x="771.9648" y="49.3665" fill="#666666" width="20.8" height="3.3"/>
<g>
<rect id="rect18431_00000065787331369743706590000015133379946716299431_" x="787.6648" y="52.3665" fill="#666666" width="2.8" height="3.9"/>
<rect id="rect18433_00000003825769621864205960000008149423384283175824_" x="784.9648" y="52.3665" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18435_00000155829848388907457810000001883953621611135370_" x="781.7648" y="52.3665" fill="#666666" width="1.1" height="3.9"/>
<rect id="rect18437_00000166674337339107047640000008104075451349266357_" x="778.2648" y="52.3665" fill="#666666" width="1.5" height="3.9"/>
<rect id="rect18439_00000121968638656140496540000015156553289452774056_" x="774.3648" y="52.3665" fill="#666666" width="2.6" height="3.9"/>
</g>
</g>
<path fill="#FFFF00" stroke="#737373" stroke-width="0.3543" d="M801.7148,40.7107h18.1984c0.5284,0,0.9567,0.4283,0.9567,0.9567
v3.7984c0,0.5284-0.4283,0.9567-0.9567,0.9567h-18.1984c-0.5284,0-0.9567-0.4283-0.9567-0.9567v-3.7984
C800.7582,41.139,801.1865,40.7107,801.7148,40.7107z"/>
<text transform="matrix(1 0 0 1 805.4132 45.3166)" font-family="'CourierNewPS-BoldMT'" font-size="6px">SCL</text>
<path fill="#0000FF" stroke="#737373" stroke-width="0.3543" d="M801.7148,33.5107h18.1984c0.5284,0,0.9567,0.4283,0.9567,0.9567
v3.7984c0,0.5284-0.4283,0.9567-0.9567,0.9567h-18.1984c-0.5284,0-0.9567-0.4283-0.9567-0.9567v-3.7984
C800.7582,33.939,801.1865,33.5107,801.7148,33.5107z"/>
<text transform="matrix(1 0 0 1 805.4132 38.1166)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">SDA</text>
<g>
<path fill="#920000" stroke="#737373" stroke-width="0.3543" d="M801.7148,26.3106h25.3984c0.5283,0,0.9567,0.4283,0.9567,0.9567
v3.7984c0,0.5284-0.4283,0.9567-0.9567,0.9567h-25.3984c-0.5284,0-0.9567-0.4283-0.9567-0.9567v-3.7984
C800.7582,26.7389,801.1865,26.3106,801.7148,26.3106z"/>
<text transform="matrix(1 0 0 1 801.812 30.9165)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">VSENSOR</text>
</g>
<path d="M801.7148,18.9335h18.1983c0.6262,0,1.1339,0.5077,1.1339,1.1339v3.7983c0,0.6262-0.5077,1.1339-1.1339,1.1339h-18.1983
c-0.6262,0-1.1339-0.5077-1.1339-1.1339v-3.7983C800.5809,19.4412,801.0886,18.9335,801.7148,18.9335z"/>
<text transform="matrix(1 0 0 1 805.4132 23.7166)" fill="#FFFFFF" font-family="'CourierNewPS-BoldMT'" font-size="6px">GND</text>
</g>
<g>
<polygon fill="#DCDCDC" points="183.2591,44.422 184.4936,44.422 184.4936,45.839 185.6044,45.839 185.6044,55.761
184.4936,55.761 184.4936,57.178 183.2591,57.178 183.2591,55.761 180.5417,55.761 180.5417,57.178 179.3073,57.178
179.3073,55.761 178.1955,55.761 178.1955,45.839 179.3073,45.839 179.3073,44.422 180.5417,44.422 180.5417,45.839
183.2591,45.839 "/>
<ellipse fill="#1E1E1E" cx="181.997" cy="50.8615" rx="3.2202" ry="4.3886"/>
<rect x="178.1955" y="55.7674" fill="#B4B4B4" width="7.4089" height="0.397"/>
<rect x="178.1955" y="45.5624" fill="#B4B4B4" width="7.4089" height="0.397"/>
</g>
<g>
<rect x="175.619" y="17.4079" fill="#DCDCDC" width="12.756" height="1.3462"/>
<rect x="176.8311" y="10.9257" fill="#DCDCDC" width="10.1269" height="8.0787"/>
<rect x="175.619" y="11.2114" fill="#DCDCDC" width="12.756" height="1.3462"/>
<ellipse fill="#1E1E1E" cx="181.9354" cy="15.0707" rx="4.3886" ry="3.5113"/>
<rect x="176.6326" y="10.9257" fill="#B4B4B4" width="0.397" height="8.0787"/>
<rect x="186.8376" y="10.9257" fill="#B4B4B4" width="0.397" height="8.0787"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 31 KiB

View file

@ -1,51 +0,0 @@
GPIO,SPI,UART,I2C,PWM,ADC,Other
GPIO0,RX0,TX0,SDA0,PWM0A,,
GPIO1,CSn0,RX0,SCL0,PWM0B,,
GPIO2,SCK0,CTS0,SDA1,PWM1A,,
GPIO3,TX0,RTS0,SCL1,PWM1B,,
GPIO4,RX0,TX1,SDA0,PWM2A,,
GPIO5,CSn0,RX1,SCL0,PWM2B,,
GPIO6,SCK0,CTS1,SDA1,PWM3A,,
GPIO7,TX0,RTS1,SCL1,PWM3B,,
GPIO8,RX1,TX1,SDA0,PWM4A,,
GPIO9,CSn1,RX1,SCL0,PWM4B,,
GPIO10,SCK1,CTS1,SDA1,PWM5A,,
GPIO11,TX1,RTS1,SCL1,PWM5B,,
GPIO12,RX1,TX0,SDA0,PWM6A,,HSTX
GPIO13,CSn1,RX0,SCL0,PWM6B,,HSTX
GPIO14,SCK1,CTS0,SDA1,PWM7A,,HSTX
GPIO15,TX1,RTS0,SCL1,PWM7B,,HSTX
GPIO16,RX0,TX0,SDA0,PWM0A,,HSTX
GPIO17,CSn0,RX0,SCL0,PWM0B,,HSTX
GPIO18,SCK0,CTS0,SDA1,PWM1A,,HSTX
GPIO19,TX0,RTS0,SCL1,PWM1B,,HSTX
GPIO20,RX0,TX1,SDA0,PWM2A,,
GPIO21,CSn0,RX1,SCL0,PWM2B,,
GPIO22,SCK0,CTS1,SDA1,PWM3A,,
GPIO23,TX0,RTS1,SCL1,PWM3B,,
GPIO24,RX1,TX1,SDA0,PWM4A,,
GPIO25,CSn1,RX1,SCL0,PWM4B,,
GPIO26,SCK1,CTS1,SDA1,PWM5A,,
GPIO27,TX1,RTS1,SCL1,PWM5B,,
GPIO28,RX1,TX0,SDA0,PWM6A,,
GPIO29,CSn1,RX0,SCL0,PWM6B,,
GPIO30,SCK1,CTS0,SDA1,PWM7A,,
GPIO31,TX1,RTS0,SCL1,PWM7B,,
GPIO32,RX0,TX0,SDA0,PWM8A,,
GPIO33,CSn0,RX0,SCL0,PWM8B,,
GPIO34,SCK0,CTS0,SDA1,PWM9A,,
GPIO35,TX0,RTS0,SCL1,PWM9B,,
GPIO36,RX0,TX1,SDA0,PWM10A,,
GPIO37,CSn0,RX1,SCL0,PWM10B,,
GPIO38,SCK0,CTS1,SDA1,PWM11A,,
GPIO39,TX0,RTS1,SCL1,PWM11B,,
GPIO40,RX1,TX1,SDA0,PWM8A,ADC0,
GPIO41,CSn1,RX1,SCL0,PWM8B,ADC1,
GPIO42,SCK1,CTS1,SDA1,PWM9A,ADC2,
GPIO43,TX1,RTS1,SCL1,PWM9B,ADC3,
GPIO44,RX1,TX0,SDA0,PWM10A,ADC4,
GPIO45,CSn1,RX0,SCL0,PWM10B,ADC5,
GPIO46,SCK1,CTS0,SDA1,PWM11A,ADC6,
GPIO47,TX1,RTS0,SCL1,PWM11B,ADC7,
,,,,,,
DESCRIPTION,The Raspberry Pi RP2350 is a dual ARM M33 core with 150 MHz clock rate and built in USB. Flash memory is provided by external QSPI chip.,,,,,
1 GPIO SPI UART I2C PWM ADC Other
2 GPIO0 RX0 TX0 SDA0 PWM0A
3 GPIO1 CSn0 RX0 SCL0 PWM0B
4 GPIO2 SCK0 CTS0 SDA1 PWM1A
5 GPIO3 TX0 RTS0 SCL1 PWM1B
6 GPIO4 RX0 TX1 SDA0 PWM2A
7 GPIO5 CSn0 RX1 SCL0 PWM2B
8 GPIO6 SCK0 CTS1 SDA1 PWM3A
9 GPIO7 TX0 RTS1 SCL1 PWM3B
10 GPIO8 RX1 TX1 SDA0 PWM4A
11 GPIO9 CSn1 RX1 SCL0 PWM4B
12 GPIO10 SCK1 CTS1 SDA1 PWM5A
13 GPIO11 TX1 RTS1 SCL1 PWM5B
14 GPIO12 RX1 TX0 SDA0 PWM6A HSTX
15 GPIO13 CSn1 RX0 SCL0 PWM6B HSTX
16 GPIO14 SCK1 CTS0 SDA1 PWM7A HSTX
17 GPIO15 TX1 RTS0 SCL1 PWM7B HSTX
18 GPIO16 RX0 TX0 SDA0 PWM0A HSTX
19 GPIO17 CSn0 RX0 SCL0 PWM0B HSTX
20 GPIO18 SCK0 CTS0 SDA1 PWM1A HSTX
21 GPIO19 TX0 RTS0 SCL1 PWM1B HSTX
22 GPIO20 RX0 TX1 SDA0 PWM2A
23 GPIO21 CSn0 RX1 SCL0 PWM2B
24 GPIO22 SCK0 CTS1 SDA1 PWM3A
25 GPIO23 TX0 RTS1 SCL1 PWM3B
26 GPIO24 RX1 TX1 SDA0 PWM4A
27 GPIO25 CSn1 RX1 SCL0 PWM4B
28 GPIO26 SCK1 CTS1 SDA1 PWM5A
29 GPIO27 TX1 RTS1 SCL1 PWM5B
30 GPIO28 RX1 TX0 SDA0 PWM6A
31 GPIO29 CSn1 RX0 SCL0 PWM6B
32 GPIO30 SCK1 CTS0 SDA1 PWM7A
33 GPIO31 TX1 RTS0 SCL1 PWM7B
34 GPIO32 RX0 TX0 SDA0 PWM8A
35 GPIO33 CSn0 RX0 SCL0 PWM8B
36 GPIO34 SCK0 CTS0 SDA1 PWM9A
37 GPIO35 TX0 RTS0 SCL1 PWM9B
38 GPIO36 RX0 TX1 SDA0 PWM10A
39 GPIO37 CSn0 RX1 SCL0 PWM10B
40 GPIO38 SCK0 CTS1 SDA1 PWM11A
41 GPIO39 TX0 RTS1 SCL1 PWM11B
42 GPIO40 RX1 TX1 SDA0 PWM8A ADC0
43 GPIO41 CSn1 RX1 SCL0 PWM8B ADC1
44 GPIO42 SCK1 CTS1 SDA1 PWM9A ADC2
45 GPIO43 TX1 RTS1 SCL1 PWM9B ADC3
46 GPIO44 RX1 TX0 SDA0 PWM10A ADC4
47 GPIO45 CSn1 RX0 SCL0 PWM10B ADC5
48 GPIO46 SCK1 CTS0 SDA1 PWM11A ADC6
49 GPIO47 TX1 RTS0 SCL1 PWM11B ADC7
50
51 DESCRIPTION The Raspberry Pi RP2350 is a dual ARM M33 core with 150 MHz clock rate and built in USB. Flash memory is provided by external QSPI chip.

View file

@ -1,33 +0,0 @@
GPIO,SPI,UART,I2C,PWM,ADC,Other
GPIO0,RX0,TX0,SDA0,PWM0A,,
GPIO1,CSn0,RX0,SCL0,PWM0B,,
GPIO2,SCK0,CTS0,SDA1,PWM1A,,
GPIO3,TX0,RTS0,SCL1,PWM1B,,
GPIO4,RX0,TX1,SDA0,PWM2A,,
GPIO5,CSn0,RX1,SCL0,PWM2B,,
GPIO6,SCK0,CTS1,SDA1,PWM3A,,
GPIO7,TX0,RTS1,SCL1,PWM3B,,
GPIO8,RX1,TX1,SDA0,PWM4A,,
GPIO9,CSn1,RX1,SCL0,PWM4B,,
GPIO10,SCK1,CTS1,SDA1,PWM5A,,
GPIO11,TX1,RTS1,SCL1,PWM5B,,
GPIO12,RX1,TX0,SDA0,PWM6A,,HSTX
GPIO13,CSn1,RX0,SCL0,PWM6B,,HSTX
GPIO14,SCK1,CTS0,SDA1,PWM7A,,HSTX
GPIO15,TX1,RTS0,SCL1,PWM7B,,HSTX
GPIO16,RX0,TX0,SDA0,PWM0A,,HSTX
GPIO17,CSn0,RX0,SCL0,PWM0B,,HSTX
GPIO18,SCK0,CTS0,SDA1,PWM1A,,HSTX
GPIO19,TX0,RTS0,SCL1,PWM1B,,HSTX
GPIO20,RX0,TX1,SDA0,PWM2A,,
GPIO21,CSn0,RX1,SCL0,PWM2B,,
GPIO22,SCK0,CTS1,SDA1,PWM3A,,
GPIO23,TX0,RTS1,SCL1,PWM3B,,
GPIO24,RX1,TX1,SDA0,PWM4A,,
GPIO25,CSn1,RX1,SCL0,PWM4B,,
GPIO26,SCK1,CTS1,SDA1,PWM5A,ADC0,
GPIO27,TX1,RTS1,SCL1,PWM5B,ADC1,
GPIO28,RX1,TX0,SDA0,PWM6A,ADC2,
GPIO29,CSn1,RX0,SCL0,PWM6B,ADC3,
,,,,,,
DESCRIPTION,The Raspberry Pi RP2350 is a dual ARM M33 core with 150 MHz clock rate and built in USB. Flash memory is provided by external QSPI chip.,,,,,
1 GPIO SPI UART I2C PWM ADC Other
2 GPIO0 RX0 TX0 SDA0 PWM0A
3 GPIO1 CSn0 RX0 SCL0 PWM0B
4 GPIO2 SCK0 CTS0 SDA1 PWM1A
5 GPIO3 TX0 RTS0 SCL1 PWM1B
6 GPIO4 RX0 TX1 SDA0 PWM2A
7 GPIO5 CSn0 RX1 SCL0 PWM2B
8 GPIO6 SCK0 CTS1 SDA1 PWM3A
9 GPIO7 TX0 RTS1 SCL1 PWM3B
10 GPIO8 RX1 TX1 SDA0 PWM4A
11 GPIO9 CSn1 RX1 SCL0 PWM4B
12 GPIO10 SCK1 CTS1 SDA1 PWM5A
13 GPIO11 TX1 RTS1 SCL1 PWM5B
14 GPIO12 RX1 TX0 SDA0 PWM6A HSTX
15 GPIO13 CSn1 RX0 SCL0 PWM6B HSTX
16 GPIO14 SCK1 CTS0 SDA1 PWM7A HSTX
17 GPIO15 TX1 RTS0 SCL1 PWM7B HSTX
18 GPIO16 RX0 TX0 SDA0 PWM0A HSTX
19 GPIO17 CSn0 RX0 SCL0 PWM0B HSTX
20 GPIO18 SCK0 CTS0 SDA1 PWM1A HSTX
21 GPIO19 TX0 RTS0 SCL1 PWM1B HSTX
22 GPIO20 RX0 TX1 SDA0 PWM2A
23 GPIO21 CSn0 RX1 SCL0 PWM2B
24 GPIO22 SCK0 CTS1 SDA1 PWM3A
25 GPIO23 TX0 RTS1 SCL1 PWM3B
26 GPIO24 RX1 TX1 SDA0 PWM4A
27 GPIO25 CSn1 RX1 SCL0 PWM4B
28 GPIO26 SCK1 CTS1 SDA1 PWM5A ADC0
29 GPIO27 TX1 RTS1 SCL1 PWM5B ADC1
30 GPIO28 RX1 TX0 SDA0 PWM6A ADC2
31 GPIO29 CSn1 RX0 SCL0 PWM6B ADC3
32
33 DESCRIPTION The Raspberry Pi RP2350 is a dual ARM M33 core with 150 MHz clock rate and built in USB. Flash memory is provided by external QSPI chip.

View file

@ -1,88 +0,0 @@
GPIO,INT,DAC/AREF,ADC,Touch,SERCOM,SERCOM Alt,Timer,Timer Alt,Special
PA00,0,,,,,S1.0,TCC2[0],,
PA01,1,,,,,S1.1,TCC2[1],,
PA02,2,VOUT,AIN0,Y0,,,,,
PA03,3,VREFA,AIN1,Y1,,,,,
PA04,4,VREFB,AIN4,Y2,,S0.0,TCC0[0],,
PA05,5,,AIN5,Y3,,S0.1,TCC0[1],,
PA06,6,,AIN6,Y4,,S0.2,TCC1[0],,
PA07,7,,AIN7,Y5,,S0.3,TCC1[1],,I2S/SD0
PA08,NMI,,AIN16,,S0.0,S2.0,TCC0[0],TCC1[2],I2S/SD1
PA09,9,,AIN17,,S0.1,S2.0,TCC0[1],TCC1[3],I2S/MCK0
PA10,10,,AIN18,,S0.2,S2.2,TCC1[0],TCC0[2],I2S/SCK0
PA11,11,,AIN19,,S0.3,S2.3,TCC1[1],TCC0[3],I2S/FS0
PA12,12,,,,S2.0,S4.0,TCC2[0],TCC0[6],
PA13,13,,,,S2.1,S4.1,TCC2[1],TCC0[7],
PA14,14,,,,S2.2,S4.2,TC3[0],TCC0[4],
PA15,15,,,,S2.3,S4.3,TC3[1],TCC0[5],
PA16,0,,,,S1.0,S3.0,TCC2[0],TCC0[6],
PA17,1,,,,S1.1,S3.1,TCC2[1],TCC0[7],
PA18,2,,,,S1.2,S3.2,TC3[0],TCC0[2],
PA19,3,,,,S1.3,S3.3,TC3[1],TCC0[3],I2S/SD0
PA20,4,,,,S5.2,S3.2,TC7[0],TCC0[6],I2S/SCK0
PA21,5,,,,S5.3,S3.3,TC7[1],TCC0[7],I2S/FS0
PA22,6,,,,S3.0,S5.0,TC4[0],TCC0[4],
PA23,7,,,,S3.1,S5.1,TC4[1],TCC0[5],
PA24,12,,,,S3.2,S5.2,TC5[0],TCC1[2],USB D-
PA25,13,,,,S3.3,S5.3,TC5[1],TCC1[3],USB D+
PA27,15,,,,,,,,
PA28,8,,,,,,,,
PA30,10,,,,,S1.2,TCC1[0],,SWCLK
PA31,11,,,,,S1.3,TCC1[1],,SWDIO
PB00,0,,AIN8,Y6,,S5.2,TC7[0],,
PB01,1,,AIN9,Y7,,S5.3,TC7[1],,
PB02,2,,AIN10,Y8,,S5.0,TC6[0],,
PB03,3,,AIN11,Y9,,S5.1,TC6[1],,
PB04,4,,AIN12,Y10,,,,,
PB05,5,,AIN13,Y11,,,,,
PB06,6,,AIN14,Y12,,,,,
PB07,7,,AIN15,Y13,,,,,
PB08,8,,AIN2,Y14,,S4.0,TC4[0],,
PB09,9,,AIN3,Y15,,S4.1,TC4[1],,
PB10,10,,,,,S4.2,TC5[0],TCC0[4],I2S/MCK1
PB11,11,,,,,S4.3,TC5[1],TCC0[5],I2S/SCK1
PB12,12,,,,S4.0,,TC4[0],TCC0[6],I2S/FS1
PB13,13,,,,S4.1,,TC4[1],TCC0[7],
PB14,14,,,,S4.2,,TC5[0],,
PB15,15,,,,S4.3,,TC5[1],,
PB16,0,,,,S5.0,,TC6[0],TCC0[4],I2S/SD1
PB17,1,,,,S5.1,,TC6[1],TCC0[5],I2S/MCK0
PB22,6,,,,,S5.2,TC7[0],,
PB23,7,,,,,S5.3,TC7[1],,
PB30,14,,,,,S5.0,TCC0[0],TCC1[2],
PB31,15,,,,,S5.1,TCC0[1],TCC1[3],
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
,,,,,,,,,
DESCRIPTION,"The Microchip (nee Atmel) SAMD21 is an ARM Cortex-M0+ running at 48 MHz with 32kB on-chip SRAM, 256KB Flash memory and built in USB. All GPIO is 3.3V in/out max unless otherwise stated. SERCOMs can be used as UART (TX on SERCOM pad 0 or 2, RX on any pad), I2C (SDA on pad 0, SCL on pad 1), or SPI (SCK on pad 1 or 3, MOSI on pad 0 or 3 (SCK on pad 1) or pad 0 or 2 (SCK on pad 3), MISO on any pad remaining) ",,,,,,,,
1 GPIO INT DAC/AREF ADC Touch SERCOM SERCOM Alt Timer Timer Alt Special
2 PA00 0 S1.0 TCC2[0]
3 PA01 1 S1.1 TCC2[1]
4 PA02 2 VOUT AIN0 Y0
5 PA03 3 VREFA AIN1 Y1
6 PA04 4 VREFB AIN4 Y2 S0.0 TCC0[0]
7 PA05 5 AIN5 Y3 S0.1 TCC0[1]
8 PA06 6 AIN6 Y4 S0.2 TCC1[0]
9 PA07 7 AIN7 Y5 S0.3 TCC1[1] I2S/SD0
10 PA08 NMI AIN16 S0.0 S2.0 TCC0[0] TCC1[2] I2S/SD1
11 PA09 9 AIN17 S0.1 S2.0 TCC0[1] TCC1[3] I2S/MCK0
12 PA10 10 AIN18 S0.2 S2.2 TCC1[0] TCC0[2] I2S/SCK0
13 PA11 11 AIN19 S0.3 S2.3 TCC1[1] TCC0[3] I2S/FS0
14 PA12 12 S2.0 S4.0 TCC2[0] TCC0[6]
15 PA13 13 S2.1 S4.1 TCC2[1] TCC0[7]
16 PA14 14 S2.2 S4.2 TC3[0] TCC0[4]
17 PA15 15 S2.3 S4.3 TC3[1] TCC0[5]
18 PA16 0 S1.0 S3.0 TCC2[0] TCC0[6]
19 PA17 1 S1.1 S3.1 TCC2[1] TCC0[7]
20 PA18 2 S1.2 S3.2 TC3[0] TCC0[2]
21 PA19 3 S1.3 S3.3 TC3[1] TCC0[3] I2S/SD0
22 PA20 4 S5.2 S3.2 TC7[0] TCC0[6] I2S/SCK0
23 PA21 5 S5.3 S3.3 TC7[1] TCC0[7] I2S/FS0
24 PA22 6 S3.0 S5.0 TC4[0] TCC0[4]
25 PA23 7 S3.1 S5.1 TC4[1] TCC0[5]
26 PA24 12 S3.2 S5.2 TC5[0] TCC1[2] USB D-
27 PA25 13 S3.3 S5.3 TC5[1] TCC1[3] USB D+
28 PA27 15
29 PA28 8
30 PA30 10 S1.2 TCC1[0] SWCLK
31 PA31 11 S1.3 TCC1[1] SWDIO
32 PB00 0 AIN8 Y6 S5.2 TC7[0]
33 PB01 1 AIN9 Y7 S5.3 TC7[1]
34 PB02 2 AIN10 Y8 S5.0 TC6[0]
35 PB03 3 AIN11 Y9 S5.1 TC6[1]
36 PB04 4 AIN12 Y10
37 PB05 5 AIN13 Y11
38 PB06 6 AIN14 Y12
39 PB07 7 AIN15 Y13
40 PB08 8 AIN2 Y14 S4.0 TC4[0]
41 PB09 9 AIN3 Y15 S4.1 TC4[1]
42 PB10 10 S4.2 TC5[0] TCC0[4] I2S/MCK1
43 PB11 11 S4.3 TC5[1] TCC0[5] I2S/SCK1
44 PB12 12 S4.0 TC4[0] TCC0[6] I2S/FS1
45 PB13 13 S4.1 TC4[1] TCC0[7]
46 PB14 14 S4.2 TC5[0]
47 PB15 15 S4.3 TC5[1]
48 PB16 0 S5.0 TC6[0] TCC0[4] I2S/SD1
49 PB17 1 S5.1 TC6[1] TCC0[5] I2S/MCK0
50 PB22 6 S5.2 TC7[0]
51 PB23 7 S5.3 TC7[1]
52 PB30 14 S5.0 TCC0[0] TCC1[2]
53 PB31 15 S5.1 TCC0[1] TCC1[3]
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88 DESCRIPTION The Microchip (nee Atmel) SAMD21 is an ARM Cortex-M0+ running at 48 MHz with 32kB on-chip SRAM, 256KB Flash memory and built in USB. All GPIO is 3.3V in/out max unless otherwise stated. SERCOMs can be used as UART (TX on SERCOM pad 0 or 2, RX on any pad), I2C (SDA on pad 0, SCL on pad 1), or SPI (SCK on pad 1 or 3, MOSI on pad 0 or 3 (SCK on pad 1) or pad 0 or 2 (SCK on pad 3), MISO on any pad remaining)

View file

@ -1,122 +0,0 @@
GPIO,INT,DAC/AREF,ADC,SERCOM,SERCOM Alt,Timer,Timer Alt,Timer Alt2,QSPI/CAN,Special,I2S,PCC
PA00,0,,,,S1.0,TC2[0],,,,,,
PA01,1,,,,S1.1,TC2[1],,,,,,
PA02,2,VOUT0,A0[0],,,,,,,,,
PA03,3,VREFA,A0[1],,,,,,,,,
PA04,4,VREFB,A0[4],,S0.0,TC0[0],,,,,,
PA05,5,VOUT1,A0[5],,S0.1,TC0[1],,,,,,
PA06,6,VREFC,A0[6],,S0.2,TC1[0],,,,SDCD,,
PA07,7,,A0[7],,S0.3,TC1[1],,,,SDWP,,
PA08,NMI,,A0[8]/A1[2],S0.0,S2.1,TC0[0],TCC0[0],TCC1[4],DATA0,SDCMD,MCK0,
PA09,9,,A0[0]/A1[3],S0.1,S2.0,TC0[1],TCC0[1],TCC1[5],DATA1,SDDAT0,FS0,
PA10,10,,A0[10],S0.2,S2.2,TC1[0],TCC0[2],TCC1[6],DATA2,SDDAT1,SCK0,
PA11,11,,A0[11],S0.3,S2.3,TC1[1],TCC0[3],TCC1[7],DATA3,SDDAT2,SDO,
PA12,12,,,S2.0,S4.1,TC2[0],TCC0[6],TCC1[2],,SDCD,,DEN1
PA13,13,,,S2.1,S4.0,TC2[1],TCC0[7],TCC1[3],,SDWP,,DEN2
PA14,14,,,S2.2,S4.2,TC3[0],TCC2[0],TCC1[2],,,,CLK
PA15,15,,,S2.3,S4.3,TC3[1],TCC2[1],TCC1[3],,,,
PA16,0,,,S1.0,S3.1,TC2[0],TCC1[0],TCC0[4],,,,DATA0
PA17,1,,,S1.1,S3.0,TC2[1],TCC1[1],TCC0[5],,,,DATA1
PA18,2,,,S1.2,S3.2,TC3[0],TCC1[2],TCC0[6],,,,DATA2
PA19,3,,,S1.3,S3.3,TC3[1],TCC1[3],TCC0[7],,,,DATA3
PA20,4,,,S5.2,S3.2,TC7[0],TCC1[4],TCC0[0],,SDCMD,FS0,DATA4
PA21,5,,,S5.3,S3.3,TC7[1],TCC1[5],TCC0[1],,SDCK,SDO,DATA5
PA22,6,,,S3.0,S5.1,TC4[0],TCC1[6],TCC0[2],CAN0TX,,SDI,DATA6
PA23,7,,,S3.1,S5.0,TC4[1],TCC1[7],TCC0[3],CAN0RX,SOF 1KHZ,FS1,DATA7
PA24,8,,,S3.2,S5.2,TC5[0],TCC2[2],,CAN0TX,USB D-,,
PA25,9,,,S3.3,S5.1,TC5[1],,,CAN0RX,USB D+,,
PA27,11,,,,,,,,,,,
PA30,14,,,S7.2,S1.2,TC6[0],TCC2[0],,,SWCLK,,
PA31,15,,,S7.3,S1.3,TC6[1],TCC2[1],,,SWDIO,,
PB00,0,,A0[12],,S5.2,TC7[0],,,,,,
PB01,1,,A0[13],,S5.3,TC7[1],,,,,,
PB02,2,,A0[14],,S5.0,TC6[0],TCC2[2],,,,,
PB03,3,,A0[15],,S5.1,TC6[1],,,,,,
PB04,4,,A1[6],,,,,,,,,
PB05,5,,A1[7],,,,,,,,,
PB06,6,,A1[8],,,,,,,,,
PB07,7,,A1[9],,,,,,,,,
PB08,8,,A0[2]/A1[0],,S4.0,TC4[0],,,,,,
PB09,9,,A0[3]/A1[1],,S4.1,TC4[1],,,,,,
PB10,10,,,,S4.2,TC5[0],TCC0[4],TCC1[0],SCK,SDDAT3,SDI,
PB11,11,,,,S4.3,TC5[1],TCC0[5],TCC1[1],CS,SDCK,FS1,
PB12,12,,,S4.0,,TC4[0],TCC3[0],TCC0[0],CAN1TX,SDCD,SCK1,
PB13,13,,,S4.1,,TC4[1],TCC3[1],TCC0[1],CAN1RX,SDWP,MCK1,
PB14,14,,,S4.2,,TC5[0],TCC4[0],TCC0[2],CAN1TX,,,DATA8
PB15,15,,,S4.3,,TC5[1],TCC4[1],TCC0[3],CAN1RX,,,DATA9
PB16,0,,,S5.0,,TC6[0],TCC3[0],TCC0[4],,SDCD,SCK0,
PB17,1,,,S5.1,,TC6[1],TCC3[1],TCC0[5],,SDWP,MCK0,
PB18,2,,,S5.2,S7.2,,TCC1[0],,,SDDAT0,,
PB19,3,,,S5.3,S7.3,,TCC1[1],,,SDDAT1,,
PB20,4,,,S3.0,S7.1,,TCC1[2],,,SDDAT2,,
PB21,5,,,S3.1,S7.0,,TCC1[3],,,SDDAT3,,
PB22,6,,,S1.2,S5.2,TC7[0],,,,SOF 1KHZ,,
PB23,7,,,S1.2,S5.3,TC7[1],,,,,,
PB24,8,,,S0.0,S2.1,,,,,,,
PB25,9,,,S0.1,S2.0,,,,,,,
PB26,12,,,S2.0,S4.1,,TCC1[2],,,,,
PB27,13,,,S2.1,S4.0,,TCC1[3],,,,,
PB28,14,,,S2.2,S4.2,,TCC1[4],,,,SCK1,
PB29,15,,,S2.3,S4.3,,TCC1[5],,,,MCK1,
PB30,14,,,S7.0,S5.1,TC0[0],TCC4[0],TCC0[6],,SWDO,,
PB31,15,,,S7.1,S5.0,TC0[1],TCC4[1],TCC0[7],,,,
PC00,0,,A1[10],,,,,,,,,
PC01,1,,A1[11],,,,,,,,,
PC02,2,,A1[4],,,,,,,,,
PC03,3,,A1[5],,,,,,,,,
PC04,4,,,S6.0,,,TCC[0],,,,,
PC05,5,,,S6.1,,,,,,,,
PC06,6,,,S6.2,,,,,,SDCD,,
PC07,9,,,S6.3,,,,,,SDWP,,
PC10,10,,,S6.2,S7.2,,TCC0[0],TCC1[4],,,,
PC11,11,,,S6.3,S7.3,,TCC0[1],TCC1[5],,,,
PC12,12,,,S7.0,S6.1,,TCC0[2],TCC1[6],,,,DATA10
PC13,13,,,S7.1,S6.0,,TCC0[3],TCC1[7],,,,DATA11
PC14,14,,,S7.2,S6.2,,TCC0[4],TCC1[0],,,,DATA12
PC15,15,,,S7.3,S6.3,,TCC0[5],TCC1[1],,,,DATA13
PC16,0,,,S6.0,S0.1,,TCC0[0],,,,,
PC17,1,,,S6.1,S0.0,,TCC0[1],,,,,
PC18,2,,,S6.2,S0.2,,TCC0[2],,,,,
PC19,3,,,S6.3,S0.3,,TCC0[3],,,,,
PC20,4,,,,,,TCC0[4],,,SDCD,,
PC21,5,,,,,,TCC0[5],,,SDWP,,
PC22,6,,,S1.0,S3.1,,TCC0[6],,,,,
PC23,7,,,S1.1,S3.0,,TCC0[7],,,,,
PC24,8,,,S0.2,S2.2,,,,,,,
PC25,9,,,S0.3,S2.3,,,,,,,
PC26,10,,,,,,,,,,,
PC27,11,,,S1.0,,,,,,,,
PC28,12,,,S1.1,,,,,,,,
PC30,14,,A1[12],,,,,,,,,
PC31,15,,A1[13],,,,,,,,,
PD00,0,,A1[7],,,,,,,,,
PD01,1,,A1[15],,,,,,,,,
PD08,3,,,S7.0,S6.1,,TCC0[1],,,,,
PD09,4,,,S7.1,S6.0,,TCC0[2],,,,,
PD10,5,,,S7.2,S6.2,,TCC0[3],,,,,
PD11,6,,,S7.3,S6.3,,TCC0[4],,,,,
PD12,7,,,,,,TCC0[5],,,,,
PD20,10,,,S1.2,S3.2,,TCC1[0],,,SDCD,,
PD21,11,,,S1.3,S3.3,,TCC1[1],,,SDWP,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
,,,,,,,,,,,,
DESCRIPTION,"The Microchip (nee Atmel) SAMD51 is an ARM Cortex-M4F running at 120 MHz with 192 or 256kB on-chip SRAM, up to 1MB Flash memory and built in USB. All GPIO is 3.3V in/out max unless otherwise stated. SERCOMs can be used as UART (TX on SERCOM pad 0, RX on any pad), I2C (SDA on pad 0, SCL on pad 1), or SPI (SCK on pad 1, MOSI on pad 0 or 3, MISO on any pad remaining) ",,,,,,,,,,,
1 GPIO INT DAC/AREF ADC SERCOM SERCOM Alt Timer Timer Alt Timer Alt2 QSPI/CAN Special I2S PCC
2 PA00 0 S1.0 TC2[0]
3 PA01 1 S1.1 TC2[1]
4 PA02 2 VOUT0 A0[0]
5 PA03 3 VREFA A0[1]
6 PA04 4 VREFB A0[4] S0.0 TC0[0]
7 PA05 5 VOUT1 A0[5] S0.1 TC0[1]
8 PA06 6 VREFC A0[6] S0.2 TC1[0] SDCD
9 PA07 7 A0[7] S0.3 TC1[1] SDWP
10 PA08 NMI A0[8]/A1[2] S0.0 S2.1 TC0[0] TCC0[0] TCC1[4] DATA0 SDCMD MCK0
11 PA09 9 A0[0]/A1[3] S0.1 S2.0 TC0[1] TCC0[1] TCC1[5] DATA1 SDDAT0 FS0
12 PA10 10 A0[10] S0.2 S2.2 TC1[0] TCC0[2] TCC1[6] DATA2 SDDAT1 SCK0
13 PA11 11 A0[11] S0.3 S2.3 TC1[1] TCC0[3] TCC1[7] DATA3 SDDAT2 SDO
14 PA12 12 S2.0 S4.1 TC2[0] TCC0[6] TCC1[2] SDCD DEN1
15 PA13 13 S2.1 S4.0 TC2[1] TCC0[7] TCC1[3] SDWP DEN2
16 PA14 14 S2.2 S4.2 TC3[0] TCC2[0] TCC1[2] CLK
17 PA15 15 S2.3 S4.3 TC3[1] TCC2[1] TCC1[3]
18 PA16 0 S1.0 S3.1 TC2[0] TCC1[0] TCC0[4] DATA0
19 PA17 1 S1.1 S3.0 TC2[1] TCC1[1] TCC0[5] DATA1
20 PA18 2 S1.2 S3.2 TC3[0] TCC1[2] TCC0[6] DATA2
21 PA19 3 S1.3 S3.3 TC3[1] TCC1[3] TCC0[7] DATA3
22 PA20 4 S5.2 S3.2 TC7[0] TCC1[4] TCC0[0] SDCMD FS0 DATA4
23 PA21 5 S5.3 S3.3 TC7[1] TCC1[5] TCC0[1] SDCK SDO DATA5
24 PA22 6 S3.0 S5.1 TC4[0] TCC1[6] TCC0[2] CAN0TX SDI DATA6
25 PA23 7 S3.1 S5.0 TC4[1] TCC1[7] TCC0[3] CAN0RX SOF 1KHZ FS1 DATA7
26 PA24 8 S3.2 S5.2 TC5[0] TCC2[2] CAN0TX USB D-
27 PA25 9 S3.3 S5.1 TC5[1] CAN0RX USB D+
28 PA27 11
29 PA30 14 S7.2 S1.2 TC6[0] TCC2[0] SWCLK
30 PA31 15 S7.3 S1.3 TC6[1] TCC2[1] SWDIO
31 PB00 0 A0[12] S5.2 TC7[0]
32 PB01 1 A0[13] S5.3 TC7[1]
33 PB02 2 A0[14] S5.0 TC6[0] TCC2[2]
34 PB03 3 A0[15] S5.1 TC6[1]
35 PB04 4 A1[6]
36 PB05 5 A1[7]
37 PB06 6 A1[8]
38 PB07 7 A1[9]
39 PB08 8 A0[2]/A1[0] S4.0 TC4[0]
40 PB09 9 A0[3]/A1[1] S4.1 TC4[1]
41 PB10 10 S4.2 TC5[0] TCC0[4] TCC1[0] SCK SDDAT3 SDI
42 PB11 11 S4.3 TC5[1] TCC0[5] TCC1[1] CS SDCK FS1
43 PB12 12 S4.0 TC4[0] TCC3[0] TCC0[0] CAN1TX SDCD SCK1
44 PB13 13 S4.1 TC4[1] TCC3[1] TCC0[1] CAN1RX SDWP MCK1
45 PB14 14 S4.2 TC5[0] TCC4[0] TCC0[2] CAN1TX DATA8
46 PB15 15 S4.3 TC5[1] TCC4[1] TCC0[3] CAN1RX DATA9
47 PB16 0 S5.0 TC6[0] TCC3[0] TCC0[4] SDCD SCK0
48 PB17 1 S5.1 TC6[1] TCC3[1] TCC0[5] SDWP MCK0
49 PB18 2 S5.2 S7.2 TCC1[0] SDDAT0
50 PB19 3 S5.3 S7.3 TCC1[1] SDDAT1
51 PB20 4 S3.0 S7.1 TCC1[2] SDDAT2
52 PB21 5 S3.1 S7.0 TCC1[3] SDDAT3
53 PB22 6 S1.2 S5.2 TC7[0] SOF 1KHZ
54 PB23 7 S1.2 S5.3 TC7[1]
55 PB24 8 S0.0 S2.1
56 PB25 9 S0.1 S2.0
57 PB26 12 S2.0 S4.1 TCC1[2]
58 PB27 13 S2.1 S4.0 TCC1[3]
59 PB28 14 S2.2 S4.2 TCC1[4] SCK1
60 PB29 15 S2.3 S4.3 TCC1[5] MCK1
61 PB30 14 S7.0 S5.1 TC0[0] TCC4[0] TCC0[6] SWDO
62 PB31 15 S7.1 S5.0 TC0[1] TCC4[1] TCC0[7]
63 PC00 0 A1[10]
64 PC01 1 A1[11]
65 PC02 2 A1[4]
66 PC03 3 A1[5]
67 PC04 4 S6.0 TCC[0]
68 PC05 5 S6.1
69 PC06 6 S6.2 SDCD
70 PC07 9 S6.3 SDWP
71 PC10 10 S6.2 S7.2 TCC0[0] TCC1[4]
72 PC11 11 S6.3 S7.3 TCC0[1] TCC1[5]
73 PC12 12 S7.0 S6.1 TCC0[2] TCC1[6] DATA10
74 PC13 13 S7.1 S6.0 TCC0[3] TCC1[7] DATA11
75 PC14 14 S7.2 S6.2 TCC0[4] TCC1[0] DATA12
76 PC15 15 S7.3 S6.3 TCC0[5] TCC1[1] DATA13
77 PC16 0 S6.0 S0.1 TCC0[0]
78 PC17 1 S6.1 S0.0 TCC0[1]
79 PC18 2 S6.2 S0.2 TCC0[2]
80 PC19 3 S6.3 S0.3 TCC0[3]
81 PC20 4 TCC0[4] SDCD
82 PC21 5 TCC0[5] SDWP
83 PC22 6 S1.0 S3.1 TCC0[6]
84 PC23 7 S1.1 S3.0 TCC0[7]
85 PC24 8 S0.2 S2.2
86 PC25 9 S0.3 S2.3
87 PC26 10
88 PC27 11 S1.0
89 PC28 12 S1.1
90 PC30 14 A1[12]
91 PC31 15 A1[13]
92 PD00 0 A1[7]
93 PD01 1 A1[15]
94 PD08 3 S7.0 S6.1 TCC0[1]
95 PD09 4 S7.1 S6.0 TCC0[2]
96 PD10 5 S7.2 S6.2 TCC0[3]
97 PD11 6 S7.3 S6.3 TCC0[4]
98 PD12 7 TCC0[5]
99 PD20 10 S1.2 S3.2 TCC1[0] SDCD
100 PD21 11 S1.3 S3.3 TCC1[1] SDWP
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 DESCRIPTION The Microchip (nee Atmel) SAMD51 is an ARM Cortex-M4F running at 120 MHz with 192 or 256kB on-chip SRAM, up to 1MB Flash memory and built in USB. All GPIO is 3.3V in/out max unless otherwise stated. SERCOMs can be used as UART (TX on SERCOM pad 0, RX on any pad), I2C (SDA on pad 0, SCL on pad 1), or SPI (SCK on pad 1, MOSI on pad 0 or 3, MISO on any pad remaining)

Binary file not shown.