rsiot/components/cmp_linux_spi_master/
config.rs

1use linux_embedded_hal::spidev::SpiModeFlags;
2
3use crate::{
4    components_config::{
5        master_device::DeviceTrait,
6        spi_master::{self, ConfigDeviceSpiMode},
7    },
8    message::MsgDataBound,
9};
10
11/// Конфигурация cmp_linux_spi_master
12pub struct Config<TMsg>
13where
14    TMsg: MsgDataBound,
15{
16    /// Массив настроек коммуникации с устройствами
17    ///
18    /// Порядок элементов в этом массиве должен соответствовать порядку устройств в массиве devices
19    pub devices_comm_settings: Vec<ConfigDevicesCommSettings>,
20
21    /// Драйвера устройств
22    pub devices:
23        Vec<Box<dyn DeviceTrait<TMsg, spi_master::FieldbusRequest, spi_master::FieldbusResponse>>>,
24}
25
26/// Настройки коммуникации с устройствами
27pub struct ConfigDevicesCommSettings {
28    /// Конфигурация устройства Linux
29    pub linux_device: LinuxDevice,
30
31    /// Частота тактов
32    pub baudrate: u32,
33
34    /// Режим работы SPI
35    pub spi_mode: ConfigDeviceSpiMode,
36}
37
38/// Конфигурация устройства Linux
39pub enum LinuxDevice {
40    /// Только SPI
41    Spi {
42        /// Устройство SPI, например "/dev/spidev0.0"
43        dev_spi: String,
44    },
45    /// SPI + chip select, который управляется через GPIO
46    SpiWithCs {
47        /// Устройство SPI, например "/dev/spidev0.0"
48        dev_spi: String,
49        /// Устройство SPI, например  "/dev/gpiochip0"
50        dev_gpio: String,
51        /// Номер линии GPIO. 0 .. 31
52        gpio_line: u8,
53    },
54}
55
56impl From<ConfigDeviceSpiMode> for SpiModeFlags {
57    fn from(value: ConfigDeviceSpiMode) -> Self {
58        match value {
59            ConfigDeviceSpiMode::Mode0 => SpiModeFlags::SPI_MODE_0,
60            ConfigDeviceSpiMode::Mode1 => SpiModeFlags::SPI_MODE_1,
61            ConfigDeviceSpiMode::Mode2 => SpiModeFlags::SPI_MODE_2,
62            ConfigDeviceSpiMode::Mode3 => SpiModeFlags::SPI_MODE_3,
63        }
64    }
65}