ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ehatrom: ΡΠ°Π±ΠΎΡΠ° Ρ EEPROM-ΠΎΠ±ΡΠ°Π·Π°ΠΌΠΈ Raspberry Pi HAT Π½Π° Rust
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅
ΠΡΠ»ΠΈ Π²Ρ ΡΠΎΠ·Π΄Π°ΡΡΠ΅ HAT (ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅) Π΄Π»Ρ Raspberry Pi, ΡΠΎ ΡΠΆΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ EEPROM-ΠΎΠ±ΡΠ°Π· Ρ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌΠΈ ΠΎ Π²Π°ΡΠ΅ΠΉ ΠΏΠ»Π°ΡΠ΅. ΠΡΠΎΡ Π±ΠΈΠ½Π°ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» ΡΠΈΡΠ°Π΅ΡΡΡ Π·Π°Π³ΡΡΠ·ΡΠΈΠΊΠΎΠΌ Raspberry Pi ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΡΡΠΎΠΉΡΡΠ²Π°: GPIO, IΒ²C, Π΄ΡΠ°ΠΉΠ²Π΅ΡΡ ΠΈ ΠΏΡΠΎΡΠ΅Π΅.
ΠΡ ΡΠ°Π΄Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ehatrom β Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π½Π° ΡΠ·ΡΠΊΠ΅ Rust, ΡΠΎΠ·Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° EEPROM-ΠΎΠ±ΡΠ°Π·ΠΎΠ² ΡΠΎΡΠΌΠ°ΡΠ° HAT.
Π§ΡΠΎ ΡΠ°ΠΊΠΎΠ΅ HAT EEPROM
Π‘ΠΎΠ³Π»Π°ΡΠ½ΠΎ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Raspberry Pi HAT EEPROM, EEPROM Π½Π° ΠΏΠ»Π°ΡΠ΅ HAT ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅, ΠΏΡΠΎΠ΄ΡΠΊΡΠ΅, Π²Π΅ΡΡΠΈΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΊΠ»ΡΡΠ°ΡΡ .dtbo-ΡΠ°ΠΉΠ»Ρ (Device Tree Overlay) ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅.
Π€ΠΎΡΠΌΠ°Ρ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π²ΠΊΠ»ΡΡΠ°Π΅Ρ:
- Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ (ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΈΡΠ»ΠΎ, Π²Π΅ΡΡΠΈΡ, CRC32),
- ΡΠ°Π±Π»ΠΈΡΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ (ΡΡΡΡΠΊΡΡΡΠ° TLV),
- ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ Π΄Π°Π½Π½ΡΠ΅.
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ EEPROM-ΡΠ°ΠΉΠ»Π° Π²ΡΡΡΠ½ΡΡ β Π·Π°Π΄Π°ΡΠ° Π½Π΅ ΠΈΠ· ΠΏΡΠΎΡΡΡΡ
. ehatrom ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ.
Π§ΡΠΎ ΡΠΌΠ΅Π΅Ρ ehatrom
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ:
β
Π§ΡΠ΅Π½ΠΈΠ΅ ΠΈ Π·Π°ΠΏΠΈΡΡ EEPROM-ΠΎΠ±ΡΠ°Π·ΠΎΠ² HAT
β
ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ Π²ΡΠ΅Ρ
ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ
TLV-ΠΏΠΎΠ»Π΅ΠΉ
β
ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ°ΡΡΡΡ CRC32
β
ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
Π΄Π°Π½Π½ΡΡ
β
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠ°Π±ΠΎΡΡ Π±Π΅Π· std (Π΄Π»Ρ embedded-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ)
β
ΠΡΠΎΡΡΠΎΠ΅ API ΠΈ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π² Vec<u8> ΠΈΠ»ΠΈ ΡΠ°ΠΉΠ»
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π² Π²Π°Ρ Cargo.toml:
[dependencies]
ehatrom = "0.1"
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
ΠΠΎΠΏΡΡΡΠΈΠΌ, Π²Ρ ΡΠΎΠ·Π΄Π°ΡΡΠ΅ ΠΏΠ»Π°ΡΡ β4STM4 Battery HATβ ΠΈ Ρ ΠΎΡΠΈΡΠ΅ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ EEPROM-ΡΠ°ΠΉΠ» Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ.
use ehatrom::{HatEeprom, TlvRecord, TlvType};
fn main() {
let mut eeprom = HatEeprom::new();
eeprom.add_record(TlvRecord::new(TlvType::Vendor, b"4STM4"));
eeprom.add_record(TlvRecord::new(TlvType::Product, b"Battery HAT"));
eeprom.add_record(TlvRecord::new(TlvType::ProductId, 0x0420u16.to_le_bytes().as_slice()));
eeprom.add_record(TlvRecord::new(TlvType::ProductVer, 0x0001u16.to_le_bytes().as_slice()));
eeprom.add_record(TlvRecord::new(TlvType::MacAddr, &[0xDE, 0xAD, 0xBE, 0xEF, 0x00, 0x01]));
eeprom.add_record(TlvRecord::new(TlvType::Uuid, &[
0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC, 0xDE, 0xF0,
0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
]));
// ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌ Π±ΠΈΠ½Π°ΡΠ½ΡΠ΅ Π΄Π°Π½Π½ΡΠ΅
let bin = eeprom.to_bytes().expect("failed to generate EEPROM");
// Π‘ΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ Π² ΡΠ°ΠΉΠ»
std::fs::write("eeprom.bin", &bin).expect("failed to write file");
}
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΡΠΈΡΡ ΡΠ°ΠΉΠ» eeprom.bin Π² ΠΌΠΈΠΊΡΠΎΡΡ
Π΅ΠΌΡ 24C32 ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ rpi-eeprom ΡΡΠΈΠ»ΠΈΡΡ Π½Π° Raspberry Pi.
ΠΠ»Ρ Π²ΡΡΡΠ°ΠΈΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²
ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ΅ΠΆΠΈΠΌ #![no_std], ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Ρ ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΠΎΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π² ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ°Ρ
. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°ΡΡ EEPROM-ΠΎΠ±ΡΠ°Π· ΠΏΡΡΠΌΠΎ Π½Π° STM32, RP2040 ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΈΡ
ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ
.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π±Π΅Π· std:
#![no_std]
use ehatrom::{HatEeprom, TlvRecord, TlvType};
fn generate_eeprom(buf: &mut [u8]) -> Result<usize, ehatrom::Error> {
let mut eeprom = HatEeprom::new();
eeprom.add_record(TlvRecord::new(TlvType::Vendor, b"4STM4"));
eeprom.add_record(TlvRecord::new(TlvType::Product, b"LoRa HAT"));
let result = eeprom.serialize_into(buf)?;
Ok(result)
}
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ehatrom β ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ HAT EEPROM-ΠΎΠ±ΡΠ°Π·Ρ Π½Π° ΡΠ·ΡΠΊΠ΅ Rust. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡ ΠΊΠ°ΠΊ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ HAT-ΠΏΠ»Π°Ρ, ΡΠ°ΠΊ ΠΈ Π°Π²ΡΠΎΡΠ°ΠΌ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΡ
ΠΏΡΠΎΡΠΈΠ²ΠΎΠΊ, Π³Π΄Π΅ Π²Π°ΠΆΠ½ΠΎ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΡΠΎΡΠΌΠ°ΡΡ Raspberry Pi.
Π‘ΡΡΠ»ΠΊΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡ: https://crates.io/crates/ehatrom ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ: https://docs.rs/ehatrom/latest/ehatrom/
ΠΡΠ»ΠΈ Π²Ρ ΡΠ°Π·ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΠ΅ ΡΠ²ΠΎΡ ΠΆΠ΅Π»Π΅Π·ΠΎ ΠΏΠΎΠ΄ Raspberry Pi β ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅!