mirror of
https://github.com/adrcs/ip400.git
synced 2025-04-21 19:13:44 +03:00
103 lines
3.9 KiB
Markdown
103 lines
3.9 KiB
Markdown
![]() |
# B+ HAT ID EEPROM FORMAT SPECIFICATION
|
||
|
|
||
|
**CURRENTLY THIS SPEC IS PRELIMINARY AND THEREFORE STILL LIKELEY TO CHANGE**
|
||
|
|
||
|
Note that there are [software tools](./eepromutils) for creation of EEPROM images and for flashing / dumping images from attached HATs.
|
||
|
|
||
|
## EEPROM Structure
|
||
|
|
||
|
```
|
||
|
HEADER <- EEPROM header (Required)
|
||
|
ATOM1 <- Vendor info atom (Required)
|
||
|
ATOM2 <- GPIO map atom (Required)
|
||
|
ATOM3 <- DT blob atom (Required for compliance with the HAT specification)
|
||
|
...
|
||
|
ATOMn
|
||
|
```
|
||
|
|
||
|
## EEPROM Header Structure
|
||
|
|
||
|
```
|
||
|
Bytes Field
|
||
|
4 signature signature: 0x52, 0x2D, 0x50, 0x69 ("R-Pi" in ASCII)
|
||
|
1 version EEPROM data format version (0x00 reserved, 0x01 = first version)
|
||
|
1 reserved set to 0
|
||
|
2 numatoms total atoms in EEPROM
|
||
|
4 eeplen total length in bytes of all eeprom data (including this header)
|
||
|
```
|
||
|
|
||
|
## Atom Structure
|
||
|
```
|
||
|
Bytes Field
|
||
|
2 type atom type
|
||
|
2 count incrementing atom count
|
||
|
4 dlen length in bytes of data+CRC
|
||
|
N data N bytes, N = dlen-2
|
||
|
2 crc16 CRC-16-CCITT of entire atom (type, count, dlen, data)
|
||
|
```
|
||
|
|
||
|
## Atom Types
|
||
|
|
||
|
```
|
||
|
0x0000 = invalid
|
||
|
0x0001 = vendor info
|
||
|
0x0002 = GPIO map
|
||
|
0x0003 = Linux device tree blob
|
||
|
0x0004 = manufacturer custom data
|
||
|
0x0005-0xfffe = reserved for future use
|
||
|
0xffff = invalid
|
||
|
```
|
||
|
|
||
|
### Vendor info atom data (type=0x0001):
|
||
|
|
||
|
Note that the UUID is mandatory and must be filled in correctly according to RFC 4122
|
||
|
(every HAT can then be uniquely identified). It protects against the case where a user
|
||
|
accidentally stacks 2 identical HATs on top of each other - this error case is only
|
||
|
detectable if the EEPROM data in each is different. The UUID is also useful for
|
||
|
manufacturers as a per-board 'serial number'.
|
||
|
|
||
|
```
|
||
|
Bytes Field
|
||
|
16 uuid UUID (unique for every single board ever made)
|
||
|
2 pid product ID
|
||
|
2 pver product version
|
||
|
1 vslen vendor string length (bytes)
|
||
|
1 pslen product string length (bytes)
|
||
|
X vstr ASCII vendor string e.g. "ACME Technology Company"
|
||
|
Y pstr ASCII product string e.g. "Special Sensor Board"
|
||
|
```
|
||
|
|
||
|
### GPIO map atom data (type=0x0002):
|
||
|
|
||
|
GPIO map for bank 0 GPIO on 40W B+ header.
|
||
|
|
||
|
**NOTE** GPIO number refers to BCM2835 GPIO number and **NOT** J8 pin number!
|
||
|
|
||
|
```
|
||
|
Bytes Field
|
||
|
1 bank_drive bank drive strength/slew/hysteresis, BCM2835 can only set per bank, not per IO
|
||
|
Bits in byte:
|
||
|
[3:0] drive 0=leave at default, 1-8=drive*2mA, 9-15=reserved
|
||
|
[5:4] slew 0=leave at default, 1=slew rate limiting, 2=no slew limiting, 3=reserved
|
||
|
[7:6] hysteresis 0=leave at default, 1=hysteresis disabled, 2=hysteresis enabled, 3=reserved
|
||
|
1 power
|
||
|
[1:0] back_power 0=board does not back power Pi
|
||
|
1=board back powers and can supply up to 1.3A to the Pi
|
||
|
2=board back powers and can supply up to 2A to the Pi
|
||
|
3=reserved
|
||
|
If back_power=2 high current USB mode is automatically enabled.
|
||
|
[7:2] reserved set to 0
|
||
|
28 1 byte per IO pin
|
||
|
Bits in each byte:
|
||
|
[2:0] func_sel GPIO function as per FSEL GPIO register field in BCM2835 datasheet
|
||
|
[4:3] reserved set to 0
|
||
|
[6:5] pulltype 0=leave at default setting, 1=pullup, 2=pulldown, 3=no pull
|
||
|
[ 7] is_used 1=board uses this pin, 0=not connected and therefore not used
|
||
|
```
|
||
|
|
||
|
### Device Tree atom data (type=0x0003):
|
||
|
|
||
|
Binary data (the name or contents of a `.dtbo` overlay, for board hardware).
|
||
|
|
||
|
For more information on the Device Tree atom contents, see the [Device Tree Guide](devicetree-guide.md).
|