Это полный технический материал на основе исходника, справочник по платформе для ArmSoM. Область исходника: RK3576, Linux kernel 6.1. Перед применением проверьте плату, SoC, ветку SDK/BSP, выводы и периферию. Аппаратная проверка не проводилась; поддержка всеми платами ArmSoM не подразумевается. Вывод и числовые результаты — примеры исходника, а не испытания ArmSoM.
Китайская статья следует китайскому исходнику, английская — английскому; русская полностью переводит английский технический текст. Код, комментарии и вывод команд сохраняют язык источника. В технической части исходника нет отдельных технических рисунков или таблиц; вымышленные иллюстрации не добавлялись.
Оба исходника имеют версию V1.0.0.
Осторожно: резервирование памяти, DMA, мультиплексирование выводов и запись в устройства влияют на оборудование. Команды приведены для изучения; аппаратные операции не выполнялись. Проверьте схему, питание, тайминги и устройство. xxx и многоточия в DTS — заполнители исходника, а не готовая конфигурация.
Сомнительные места исходника: английский §2.3.1 указывает iio:device1, хотя команда и китайское пояснение используют iio:device2. В обоих исходниках §2.3.2 переходит в device0, но следующее приглашение относится к device2. Исходные значения сохранены. Перед записью определите DAC по файлу name; не копируйте номера устройств без проверки.
Источники и исправления: EDITORIAL-NOTES。Официальные материалы: ArmSoM, Rockchip Linux.
Таблица версий продукта из исходника (PDF p.2; область исходника, не результат проверки платы):
| SoC | Версия ядра |
|---|---|
| RK3576 | 6.1 |
1. Режим FLEXBUS ADC
1.1 Обзор
В режиме FLEXBUS ADC блок FLEXBUS1 подключается к высокоскоростным параллельным ADC, например TI ADS6144 (https://www.ti.com/product/ADS6144) и ADI LTC2207 (https://www.analog.com/en/products/ltc2207.html). ADC с интерфейсами SPI, I2C и подобными не поддерживаются.
Тактовая частота до 100MHz
Разрешение до 16-Bit
1.2 Настройка
1.2.1 Аппаратная настройка
Младший бит ADC необходимо подключать к FLEXBUS1_D0: например, 10-Bit ADC — к FLEXBUS1_D[9:0], 16-Bit ADC — к FLEXBUS1_D[15:0].
В режиме slave устройство подаёт CLK на FLEXBUS1; в режиме master FLEXBUS1 подаёт CLK на устройство.
1.2.2 Настройка ядра
Режим FLEXBUS ADC использует подсистему iio/adc.
Device Drivers -> Multifunction device drivers -> Rockchip Flexbus
Device Drivers -> Industrial I/O support -> Analog to digital converters -> Rockchip Flexbus ADC opmode driver
1.2.3 Настройка dtsi
Пример для платформы RK3576 и платы RK3576 TEST1 с ADC, подключённым к FLEXBUS1.
В rk3576.dtsi:
flexbus: flexbus@2a2f0000 {
......
flexbus_adc: adc {
compatible = "rockchip,flexbus-adc";
#io-channel-cells = <0>;
rockchip,slave-mode; // Configuring this is the slave mode, not configuring this is the master mode
rockchip,free-sclk; // Configuring this is clock keeps output, not configuring this is clock follows data
rockchip,auto-pad; // Default configuration
rockchip,cpol; // Configuring this is CPOL = 1, not configuring this is 0
rockchip,cpha; // Configuring this is CPHA = 1, not configuring this is 0
rockchip,dfs = <16>; // data frames
status = "disabled";
};
flexbus_dac: dac {
......
};
};
rockchip,slave-mode: при наличии свойства используется режим slave — устройство подаёт CLK на FLEXBUS1. Без свойства используется master — FLEXBUS1 подаёт CLK на устройство.
rockchip,free-sclk: при наличии свойства тактовый сигнал выдаётся непрерывно; без него — только во время передачи данных. Настройка действует только в режиме master.
rockchip,cpol, rockchip,cpha: имеют тот же смысл, что в протоколе SPI; настраиваются по временной диаграмме из документации устройства.
rockchip,dfs: ширина кадра данных; допустимы только 4, 8, 16. Если разрешение устройства отличается, выберите ближайшее большее допустимое значение. Например, для ADC с разрешением 14-Bit задайте rockchip,dfs = 16, а при приёме программно оставляйте только 14bit данных.
В arch/arm64/boot/dts/rockchip/rk3576-test1.dtsi:
&flexbus {
rockchip,flexbus0-opmode = <ROCKCHIP_FLEXBUS0_OPMODE_xxx>;
rockchip,flexbus1-opmode = <ROCKCHIP_FLEXBUS1_OPMODE_ADC>; // FLEXBUS1 selects ADC mode
status = "okay"; // Enable FLEXBUS
};
&flexbus_adc {
pinctrl-names = "default";
pinctrl-0 = <&flexbus1m4_csn &flexbus1_clk
&flexbus1_d0 &flexbus1_d1 &flexbus1_d2 &flexbus1_d3
&flexbus1_d4 &flexbus1_d5 &flexbus1_d6 &flexbus1_d7
&flexbus1_d8 &flexbus1_d9 &flexbus1_d10 &flexbus1_d11
&flexbus1m1_d12 &flexbus1m1_d13 &flexbus1m1_d14 &flexbus1m1_d15>;
// Configure IOMUX for FLEXBUS1 ADC mode
status = "okay"; // Enable ADC mode
};
1.2.4 Файл драйвера
Файл драйвера — drivers/iio/adc/rockchip-flexbus-adc.c.
Функция rockchip_flexbus_adc_read_block() читает данные ADC. Основные операции:
(1) rockchip_flexbus_writel(rkfb, FLEXBUS_RX_NUM, num_of_dfs);
Настроить объём RX в единицах dfs (rockchip,dfs в dtsi).
(2) rockchip_flexbus_writel(rkfb, FLEXBUS_DMA_DST_ADDR0, (ulong)dst_phys >> 2);
Задать физический адрес буфера назначения dst.
(3) rockchip_flexbus_writel(rkfb, FLEXBUS_DMA_DST_LEN0, dst_len);
Задать длину буфера назначения dst.
(4) rockchip_flexbus_writel(rkfb, FLEXBUS_ENR, FLEXBUS_RX_ENR);
Включить передачу RX.
(5) wait_for_completion_timeout(&rkfb_adc->completion, FLEXBUS_ADC_TIMEOUT)
Ожидать завершения RX и возникновения прерывания; обработчик — rockchip_flexbus_adc_isr().
(6) rockchip_flexbus_writel(rkfb, FLEXBUS_ENR, FLEXBUS_RX_DIS);
Отключить передачу RX.
1.3 Основные интерфейсы
1.3.1 Определение устройства FLEXBUS ADC
Например:
root@rk3576-buildroot:/# cat /sys/bus/iio/devices/iio\:device0/name
2a2f0000.flexbus:adc
FLEXBUS ADC соответствует iio:device0.
1.3.2 Получение значения ADC
root@rk3576-buildroot:/# cd /sys/bus/iio/devices/iio\:device0
root@rk3576-buildroot:/sys/bus/iio/devices/iio:device0# cat in_voltage_raw
33004
1.3.3 Чтение и изменение тактовой частоты
Прочитать тактовую частоту:
root@rk3576-buildroot:/# cd /sys/bus/iio/devices/iio\:device0
root@rk3576-buildroot:/sys/bus/iio/devices/iio:device0# cat in_voltage_sampling_frequency
99000000
Текущая тактовая частота — 99MHz.
Изменить тактовую частоту:
root@rk3576-buildroot:/sys/bus/iio/devices/iio:device0# echo 25000000 > in_voltage_sampling_frequency
Тактовая частота изменяется на 25MHz.
Примечание:
Чтение и изменение тактовой частоты поддерживаются только в режиме master. В режиме slave CLK поступает от ADC.
Максимальная тактовая частота — 100MHz.
2. Режим FLEXBUS DAC
2.1 Обзор
В режиме FLEXBUS DAC блок FLEXBUS0 подключается к высокоскоростным параллельным DAC, например ADI MAX5885 (https://www.analog.com/en/products/max5885.html) и ADI AD9744 (https://www.analog.com/en/products/ad9744.html). DAC с интерфейсами SPI, I2C и подобными не поддерживаются.
Тактовая частота до 100MHz
Разрешение до 16-Bit
2.2 Настройка
2.2.1 Аппаратная настройка
Младший бит DAC необходимо подключать к FLEXBUS0_D0: например, 10-Bit DAC — к FLEXBUS0_D[9:0], 16-Bit DAC — к FLEXBUS0_D[15:0].
2.2.2 Настройка ядра
Режим FLEXBUS DAC использует подсистему iio/dac.
Device Drivers -> Multifunction device drivers -> Rockchip Flexbus
Device Drivers -> Industrial I/O support -> Digital to analog converters -> Rockchip Flexbus DAC opmode driver
2.2.3 Настройка dtsi
Пример для платформы RK3576 и платы RK3576 TEST1 с DAC, подключённым к FLEXBUS0.
В rk3576.dtsi:
flexbus: flexbus@2a2f0000 {
......
flexbus_adc: adc {
......
};
flexbus_dac: dac {
compatible = "rockchip,flexbus-dac";
#io-channel-cells = <0>;
rockchip,free-sclk; // Configuring this is clock keeps output, not configuring this is clock follows data
rockchip,cpol; // Configuring this is CPOL = 1, not configuring this is 0
rockchip,cpha; // Configuring this is CPHA = 1, not configuring this is 0
rockchip,dfs = <16>; // data frames
status = "disabled";
};
};
rockchip,free-sclk: при наличии свойства тактовый сигнал выдаётся непрерывно; без него — только во время передачи данных.
rockchip,cpol, rockchip,cpha: имеют тот же смысл, что в протоколе SPI; настраиваются по временной диаграмме из документации устройства.
rockchip,dfs: ширина кадра данных; допустимы только 4, 8, 16. Если разрешение устройства отличается, выберите ближайшее большее допустимое значение. Например, для DAC с разрешением 14-Bit задайте rockchip,dfs = 16 и заполните нулями bit15 и bit14 передаваемых данных.
В arch/arm64/boot/dts/rockchip/rk3576-test1.dtsi:
&flexbus {
rockchip,flexbus0-opmode = <ROCKCHIP_FLEXBUS0_OPMODE_DAC>; // FLEXBUS0 selects DAC mode
rockchip,flexbus1-opmode = <ROCKCHIP_FLEXBUS1_OPMODE_xxx>;
status = "okay"; // Enable FLEXBUS
};
&flexbus_dac {
pinctrl-names = "default";
pinctrl-0 = <&flexbus0m4_csn &flexbus0_clk
&flexbus0_d0 &flexbus0_d1 &flexbus0_d2 &flexbus0_d3
&flexbus0_d4 &flexbus0_d5 &flexbus0_d6 &flexbus0_d7
&flexbus0_d8 &flexbus0_d9 &flexbus0_d10 &flexbus0_d11
&flexbus0_d12 &flexbus0m0_d13 &flexbus0m0_d14 &flexbus0m0_d15>;
// Configure IOMUX for FLEXBUS0 DAC mode
status = "okay"; // Enable DAC mode
};
2.2.4 Файл драйвера
Файл драйвера — drivers/iio/dac/rockchip-flexbus-dac.c.
Функция rockchip_flexbus_dac_write_block() передаёт данные DAC. Основные операции:
(1) rockchip_flexbus_writel(rkfb, FLEXBUS_TX_NUM, num_of_dfs);
Настроить объём TX в единицах dfs (rockchip,dfs в dtsi).
(2) rockchip_flexbus_writel(rkfb, FLEXBUS_TXWAT_START, val);
Настроить порог заполнения.
(3) rockchip_flexbus_writel(rkfb, FLEXBUS_DMA_SRC_ADDR0, (ulong)src_phys >> 2);
Задать физический адрес исходного буфера src.
(4) rockchip_flexbus_writel(rkfb, FLEXBUS_DMA_SRC_LEN0, src_len);
Задать длину исходного буфера src.
(5) rockchip_flexbus_writel(rkfb, FLEXBUS_ENR, FLEXBUS_TX_ENR);
Включить передачу TX.
(6) wait_for_completion_timeout(&rkfb_dac->completion, FLEXBUS_DAC_TIMEOUT)
Ожидать завершения TX и возникновения прерывания; обработчик — rockchip_flexbus_dac_isr().
(7) rockchip_flexbus_writel(rkfb, FLEXBUS_ENR, FLEXBUS_TX_DIS);
Отключить передачу TX.
2.3 Основные интерфейсы
2.3.1 Определение устройства FLEXBUS DAC
Например:
root@rk3576-buildroot:/# cat /sys/bus/iio/devices/iio\:device2/name
2a2f0000.flexbus:dac
В исходном английском пояснении FLEXBUS DAC соответствует iio:device1; это противоречит iio:device2 в приведённой команде и в китайском пояснении. Значение не заменено без проверки.
2.3.2 Передача данных DAC
root@rk3576-buildroot:/# cd /sys/bus/iio/devices/iio\:device0
root@rk3576-buildroot:/sys/bus/iio/devices/iio:device2# echo 16383 > out_voltage_raw
2.3.3 Чтение и изменение тактовой частоты
Прочитать тактовую частоту:
root@rk3576-buildroot:/# cd /sys/bus/iio/devices/iio\:device2
root@rk3576-buildroot:/sys/bus/iio/devices/iio:device2# cat out_voltage_sampling_frequency
99000000
Текущая тактовая частота — 99MHz.
Изменить тактовую частоту:
root@rk3576-buildroot:/sys/bus/iio/devices/iio:device2# echo 25000000 > out_voltage_sampling_frequency
Тактовая частота изменяется на 25MHz.
Примечание:
Максимальная тактовая частота — 100MHz.
