Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° 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 β€” ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅!