Rockchip · AI & Linux Hub

Аппаратные интерфейсы

Руководство Rockchip FLEXBUS ADC/DAC: параллельные преобразователи, DMA и IIO

Руководство Rockchip FLEXBUS ADC/DAC: параллельные преобразователи, DMA и IIO с полными техническими разделами, кодом, параметрами и замечаниями к исходнику.

· ArmSoM Editorial · Rockchip source documentation · 12 мин чтения

Это полный технический материал на основе исходника, справочник по платформе для 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.

Другие статьи по теме → · Учебные маршруты →