Rockchip · AI & Linux Hub

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

Rockchip UART FAQ: скорость, выводы, прерывания, DMA и диагностика загрузки

Rockchip UART FAQ: скорость, выводы, прерывания, DMA и диагностика загрузки

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

Полный перевод всех 13 глав китайского V1.1.0. Источник относится к Rockchip Linux, содержит kernel 3.10, 4.4, 4.19 и примеры регистров RK3568. Английского оригинала нет; английский, русский и немецкий полностью переведены с китайского.

Только платформенный справочник ArmSoM: сверяйте SoC платы, SDK/BSP, драйвер ядра, DTS, мультиплексирование, уровни и внешнюю схему. Поддержка всех плат не заявляется. Отдельных технических рисунков нет; код, журналы и конфигурации доступны для копирования. Испытания источника не являются измерениями ArmSoM. Команды регистров, прошивки и прочие аппаратные команды не выполнялись.

Прямой доступ к регистрам, изменение тактирования или отключение консоли могут нарушить связь, отладку и загрузку. Сверяйте конкретный TRM/BSP; адреса RK3568 нельзя переносить на другие чипы. В 2.1 граница кварц/PLL равна 115200, а в 2.2.3 — 1.5M; противоречие сохранено для проверки, это не универсальное правило драйвера. Указанная поддержка RS232 не означает допустимость напряжений RS232 на выводах SoC; проверьте уровни и трансивер.

ArmSoM Docs · Rockchip kernel

1. Использование

1.1 Связанные документы

Перед использованием FAQ прочитайте Rockchip_Developer_Guide_UART_CN (UART в Linux Kernel) и главу UART документа Rockchip_Developer_Guide_UBoot_Nextdev_CN (UART в U-Boot), чтобы понимать функции, применение и отладку. Одинаковые симптомы могут требовать разных решений в зависимости от аппаратуры, ПО и сценария. Источник сообщает, что базовые приём и передача UART в SDK Rockchip проверены. Для старого SDK получите актуальные исходники и сравните драйверы UART. При вопросах обращайтесь к FAE через Rockchip Redmine.

1.2 Журнал загрузки

Характерные сообщения этапов загрузки позволяют определить, где возникает проблема UART, и вести целевую диагностику. Ниже показаны обычный журнал и важные сообщения после включения или сброса платы Rockchip на примере RK356x.

DDR Version <version information>        # DDR阶段(TPL阶段)打印
...
U-Boot SPL board init                    # Miniloader阶段(SPL阶段)打印
U-Boot SPL <version information>
...
INFO:    Preloader serial: 2             # Trust阶段(BL31阶段)打印
NOTICE:  BL31: <version information>
NOTICE:  BL31: Built : <version information>
...
I/TC: Rockchip release version: 1.0      # OP-TEE阶段(BL32阶段)打印
I/TC: OP-TEE version: <version information>
...
U-Boot <version information>             # U-Boot阶段打印
Model: Rockchip RK3568 Evaluation Board
PreSerial: 2, raw, 0xfe660000
DRAM:  2 GiB
Sysmem: init
...
Starting kernel ...
[    0.000000] Booting Linux             # Linux Kernel earlycon打印
[    0.000000] Linux version <version information>
[    0.000000] Machine model: Rockchip RK3568 EVB2 LP4X V10 Board
[    0.000000] earlycon: uart8250 at MMIO32 0x00000000fe660000
[    0.000000] bootconsole [uart8250] enabled
...
[    0.193783] console [ttyFIQ0] enabled # 切换到fiq_debugger打印
[    0.194484] bootconsole [uart8250] disabled
...
[    0.411356] Serial: 8250/16550 driver # 普通UART初始化
[    0.412586] fe650000.serial: ttyS1 at MMIO 0xfe650000 (irq = 67, base_baud = 1500000) is a 16550A
[    0.413461] fe690000.serial: ttyS5 at MMIO 0xfe690000 (irq = 68, base_baud = 1500000) is a 16550A

1.3 Команда io

Платформы Rockchip обычно содержат io для прямого чтения и записи регистров; исходники находятся в external Android SDK. Ниже типовые операции отладки показаны для RK3568 UART5_M0. Для доступа к регистрам контроллера необходимо включить UART5 pclk. Можно настроить соответствующие регистры CRU по TRM либо выполнить следующую команду.

echo 1 > /sys/kernel/debug/clk/pclk_uart5/clk_enable_count

Чтение всех регистров контроллера UART5:

io -4 -l 0x100 0xFE690000

Включите UART5 sclk для нормальной работы UART5:

cat /sys/kernel/debug/clk/clk_summary | grep uart5    # UART5相关时钟
cat /sys/kernel/debug/clk/sclk_uart5/clk_rate         # UART5工作时钟频率
echo 24000000 > /sys/kernel/debug/clk/sclk_uart5/clk_rate
cat /sys/kernel/debug/clk/sclk_uart5/clk_enable_count # UART5工作时钟状态
echo 1 > /sys/kernel/debug/clk/sclk_uart5/clk_enable_count

Проверьте IOMUX UART5_M0, чтобы сигналы поступали на нужные выводы. Регистры указаны в главе GRF документа TRM:

io -4 0xFDC60310    # uart5_iomux_sel,选择iomux group 0 或 group 1
fdc60310:  00000000 # bit 0为0,说明UART5_M0配置正确
io -4 0xFDC60020    # gpio2a1_sel和gpio2a2_sel,rx和tx的GPIO function
fdc60020:  00001331 # bit 7:4和bit 11:8均为3,说明UART5_M0 RX和TX配置正确

Прямая настройка регистров UART5 для базовых передачи и приёма на 115200 бод:

io -4 0xFE690088 0x00000007 # SRR寄存器,对UART和FIFO进行reset
io -4 0xFE690010 0x00000010 # MCR寄存器,将UART配置成loopback模式
io -4 0xFE69000C 0x00000080 # LCR寄存器,div_lat_access置1
io -4 0xFE690000 0x0000000D # DLL寄存器,配置波特率分频系数
io -4 0xFE690004 0x00000000 # DLH寄存器,配置波特率分频系数
io -4 0xFE69000C 0x00000003 # LCR寄存器,div_lat_access清0和配置UART协议参数
io -4 0xFE690010 0x00000000 # MCR寄存器,将UART配置成一般模式
io -4 0xFE690004 0x00000001 # IER寄存器,打开接收中断
io -4 0xFE690008 0x00000041 # FCR寄存器,打开FIFO,FIFO触发阈值配置为1/4
io -4 0xFE69009C            # SRT寄存器,读写RX FIFO触发阈值
io -4 0xFE6900A0            # STET寄存器,读写TX FIFO触发阈值
io -4 0xFE690000 0x00000055 # THR寄存器,发送“U”,0x55
io -4 0xFE690000            # RBR寄存器,上位机发送“U”,读取到0x55

Перед настройкой DLL/DLH установите LCR bit 7 (div_lat_access) в 1. До этого установите MCR bit 4 (loopback) в 1 для режима петли. Иначе внешняя помеха на RX во время настройки DLL/DLH может перевести UART в busy, после чего LCR bit 7 не удастся вернуть в 0 и возникнет ошибка.

1.4 Отключение прочего вывода

Во время отладки отключите прочий вывод командой:

su
echo 0 > /proc/sysrq-trigger

2. Скорость передачи

Работа на выбранной скорости зависит главным образом от внутреннего делителя UART и стратегии CRU. Внутренний делитель задаётся DLL/DLH. Рабочий сигнал CRU обычно называется uart_sclk и должен быть в 16 раз выше скорости передачи. Для точности используйте стандартные 115200, 460800, 921600, 1.5M, 3M, 4M; нестандартные скорости Rockchip не гарантирует. Другие стандартные скорости смотрите в include/uapi/asm-generic/termbits.h. IP UART стабильно поддерживает до 4M; более высокие скорости не гарантированы и требуют изменения инфраструктуры драйвера. Ограничение sign_off для uart_sclk обычно 100MHz; даже в специальных сценариях не превышайте 6M бод. Для старого SDK обратитесь в Rockchip за обновлением исходников UART.

2.1 Деление тактовой частоты

Для Linux kernel 4.19 проверьте следующие файлы и функции:

drivers/tty/serial/8250/8250_dw.c    # dw8250_set_termios
drivers/clk/clk-fractional-divider.c # clk_fd_set_rate
drivers/clk/rockchip/clk.c           # rockchip_fractional_approximation

dw8250_set_termios в drivers/tty/serial/8250/8250_dw.c выбирает кварц 24M для скоростей до 115200 включительно, а выше — PLL под управлением CRU. Для специальных скоростей ошибка деления CRU может быть велика; помогает запрос удвоенной частоты: sclk_rate = baud_rate x 16 x 2. Для уменьшения jitter дробный делитель CRU имеет ограничение соотношения в 20 раз. Благодаря внутреннему делителю UART сигнал обычно удовлетворяет требованиям и после снятия ограничения. См. CLK_FRAC_DIVIDER_NO_LIMIT в rockchip_fractional_approximation файла drivers/clk/rockchip/clk.c. В старых SDK исправление может отсутствовать; запросите его у Rockchip FAE.

2.2 Примеры

2.2.1 Неверное измерение скорости

При диагностике измеряйте скорость осциллографом по реальной форме UART TX; логический анализатор или USB–UART могут дать ненадёжный результат. Сравните три значения: измеренную скорость TX, напечатанную рабочую частоту UART и теоретическую частоту согласно стратегии деления. Если рабочая частота верна, а скорость измерена неверно, проверьте процедуру измерения. Если расчётная и фактическая частоты входа контроллера различаются, измените стратегию деления либо скорость.

2.2.2 Ошибки в работе исчезают после перезапуска

Если ошибки передачи возникают после длительной работы, например при испытании на старение, проверьте выбранный источник тактирования. При PLL от CRU сравните его параметры до и после сбоя. Скорость UART зависит от рабочего такта: сон/пробуждение или изменение частоты могут изменить PLL и фактическую скорость передачи.

2.2.3 Сбой перехода с высокой скорости на низкую

Если переход с низкой скорости на высокую работает, а обратный — нет, проверьте переключение источника UART между CRU и кварцем. Обычно кварц Rockchip имеет 24MHz; при отношении 16:1 скорости до 1.5M используют кварц, выше 1.5M — PLL CRU. Сравните вывод частот UART до и после сбоя.

3. Мультиплексирование выводов

Сигналы UART обычно имеют несколько групп IOMUX. Настройте и при сбое проверьте через io обе группы регистров GRF: функция GPIO должна быть UART среди совмещённых модулей, а uart_iomux_sel — выбирать требуемую группу для контроллера целиком. Настройки обычно есть в GRF pinctrl, но добавляются вручную; Rockchip не гарантирует полноту и правильность всех групп. Проверяйте реальные значения регистров.

3.1 Примеры

3.1.1 TX работает в нескольких IOMUX, RX — нет

IOMUX повышает использование выводов; контроллер UART выбирает только одну группу. Правильность переключения проверяйте по RX. TX групп M0 и M1 не имеют переключателя выбора, поэтому оба могут выдавать данные, если функции выводов установлены в UART. Для RX переключатель существует, и два RX одновременно принимать не могут.

3.1.2 Сбой UART после включения другого модуля

Другие модули могут перенастроить общие IOMUX и нарушить UART. Частые конфликты: PWM подсветки, загрузочный SDMMC, JTAG (force jtag должен быть выключен). Особенно внимательно проверяйте модули, совмещённые с выводами консольного UART: конфликт портит вывод консоли. Для диагностики считайте регистры функций IOMUX нужных выводов.

4. Уровни выводов

Неверные уровни UART нарушают связь. Обычно RX/TX имеют внутреннюю подтяжку вверх; на старых платформах RX подтянут вверх, а TX сохраняет стандартную подтяжку. Проверьте настройки RX/TX в DTS ядра, I/O-домен (1v8 или 3v0) по datasheet и непосредственно измерьте высокий уровень и напряжение RX/TX. По аппаратным вопросам обращайтесь к инженерам Rockchip.

4.1 Примеры

4.1.1 Ошибки PCB

Если ПО настроено верно, проверьте PCB: перепутанные RX/TX или подключение к высокому/низкому уровню; включённое управление потоком при принудительно высоком CTS; несовпадающие уровни периферии, неверное напряжение, отсутствие защиты от утечек и другие дефекты.

4.1.2 Схема не соответствует варианту чипа

Семейства Rockchip содержат варианты с суффиксами в имени. Убедитесь, что руководство, использованное для аппаратной схемы, относится к реальному варианту чипа. При таких проблемах повторите испытание на Rockchip EVB и проверьте уровни выводов.

4.1.3 TX периферии не опускает RX контроллера

Если TX периферии не может опустить RX контроллера для начала передачи, проверьте, может ли он опустить другие GPIO. Далее проверьте преобразователь уровней между устройствами и достаточность нагрузочной способности периферийного вывода.

5. Прерывания

Прерывания UART включают TX/RX; поскольку контроллер обычно использует FIFO, анализируйте их совместно с настройками FIFO. Основные регистры: IER включает прерывания. 0x80 PTIME (Programmable THRE Interrupt Mode Enable) повышает эффективность передачи, заранее вызывая THRI на пороге TX FIFO для подготовки следующей порции. 0x08 MSI (Modem Status Interrupt) имеет четвёртый приоритет, вызывается модемом UART, связан с MCR/MSR. 0x04 RLSI (Receive Line Status Interrupt) имеет высший приоритет: overrun/parity/framing errors, break interrupt, address received interrupt; связан с LCR/LSR. 0x02 THRI (Transmitter Holding Register Interrupt), третий приоритет: при выключенном PTIME вызывается пустым TX FIFO, при включённом — достижением порога или снижением ниже него. 0x01 RDI (Receive Data Interrupt), второй приоритет: достижение/превышение порога RX либо timeout, если FIFO содержит данные, но новые не поступали четыре времени символа. IIR определяет вызвавшее прерывание. Помимо четырёх типов IER содержит пятый, низкоприоритетный Busy Detect Indication.

FCR — регистр управления FIFO, включая пороги RX/TX и другие настройки.

5.1 Примеры

5.1.1 Порог прерывания приёма

Порог RX FIFO Trigger Level в FCR критичен. FIFO обычно 64 или 32 Bytes и поддерживает: 2’b00 — 1 символ; 2’b01 — заполнение 1/4; 2’b10 — 1/2; 2’b11 — на 2 меньше полного. Низкий порог ускоряет обработку, но повышает нагрузку CPU прерываниями. Обычно установлен 1/2. Измените UART_FCR_R_TRIG_10 в serial8250_do_set_termios() файла drivers/tty/serial/8250/8250_port.c. При ошибках попробуйте 2’b00: прерывание после каждого символа.

6. DMA

Обычно Rockchip использует DMA PL330, некоторые чипы — DW; проверьте TRM. Если не оговорено иное, раздел относится к PL330. Переменная длина UART требует особой стратегии. По умолчанию DMA работает в burst, но burst length равен 1: каждый байт вызывает запрос, что связано со свойствами PL330. Стандартный порог UART в режиме прерываний 2’b10 (половина FIFO) не соответствует DMA, поэтому FCR должен быть изменён на 2’b00 (один байт), см. раздел прерываний. Для эффективности обе стороны могут строго выравнивать данные по burst length, дополняя последнюю порцию; длина burst должна совпадать с порогом FIFO. Если при DMA-приёме длина и порог превышают байт, а последняя порция не дополнена, она принимается CPU по timeout-прерыванию. Возникает конкуренция CPU/DMA с риском потери данных. У DW такой проблемы нет, но для унификации применяется та же схема. Проверяйте начало и конец каждой передачи DMA и состояние включения контроллера перед следующей передачей.

6.1 Примеры

6.1.1 Различия DMA между версиями ядра

При обновлении системы перенос прежних DMA-настроек DTS без проверки различий ядра может вызвать ошибки. Например, burst в kernel 4.4 задаётся peripherals-req-type-burst, а в 4.19 — arm,pl330-periph-burst.

6.1.2 Периодические потери DMA на высокой скорости

При высокой скорости кольцевой RX-буфер DMA может перезаписать непрочитанные данные, если слишком мал, вызывая периодические потери. Попробуйте увеличить rx_size в serial8250_request_dma файла drivers/tty/serial/8250/8250_dma.c; PAGE_SIZE равен 4k.

7. Аппаратное управление потоком

При 1.5M бод и выше либо больших объёмах используйте аппаратное управление потоком, четырёхпроводный UART. RTS/CTS повышают надёжность относительно одного DMA. Не используйте программное управление потоком на UART Rockchip.

7.1 Примеры

7.1.1 Нет передачи после включения управления потоком

Обычно причина аппаратная. Проверьте, не удерживает ли CTS высоким ошибка PCB/неисправность и может ли RTS другой стороны переключаться: он может постоянно поднимать локальный CTS.

8. Ошибки приёма

Ошибки приёма — отсутствие или искажение данных. Аппаратура: проверьте внутреннюю подтяжку RX, напряжение/ток внешней схемы, уровни выводов; попробуйте более качественный USB–UART кабель/адаптер. Драйвер: через io выключите IER-прерывания, запустите приём и проверьте наличие данных в RFL; проверьте порог RX в FCR. Приложение: забирает ли данные FIFO, нет ли другого пользователя UART, соответствует ли обработка порогу RX, достаточно ли буфера.

Для старого SDK запросите обновлённые исходники у Rockchip FAE. Изучите остальные разделы и методы Rockchip_Developer_Guide_UART_CN совместно.

8.1 Примеры

8.1.1 Ошибки передачи другой стороны

Определите, ошибается ли локальный приёмник или передатчик другой стороны, осциллографом либо USB–UART. Если проверки показывают правильный локальный приём, тщательно проверьте данные другой стороны.

8.1.2 Большой приём разбивается на части

Используйте режим прерываний и проверьте порог FIFO в FCR. Приём читает ID IIR и раздельно обрабатывает/передаёт приложению 4’b0100 (порог RX) и 4’b1100 (таймаут). Проверьте соответствие логики требованиям приложения и max_count числу итераций приёма символов: kernel 3.10 — receive_chars в drivers/tty/serial/rk_serial.c; 4.4/4.19 — serial8250_rx_chars в drivers/tty/serial/8250/8250_port.c.

8.1.3 Задержка чтения приложения

Linux Kernel не является системой реального времени. UART передаёт данные приложениям через Work Queue; блокировка очереди задерживает чтение. В kernel 3.10 доступна передача из прерывания для улучшения отклика, с патчем:

diff --git a/drivers/tty/serial/rk_serial.c b/drivers/tty/serial/rk_serial.c
index 9870873c1200..ff81be78a53a 100644
--- a/drivers/tty/serial/rk_serial.c
+++ b/drivers/tty/serial/rk_serial.c
@@ -2074,6 +2074,9 @@ static int serial_rk_probe(struct platform_device *pdev)
        up->port.uartclk = 24000000;
 #endif

+       /* update recv data quickly instead of workqueue */
+       up->port.flags |= UPF_LOW_LATENCY;

В kernel 4.4 и 4.19 инфраструктура UART передаёт данные только через Work Queue. Для строгого реального времени используйте RTOS.

9. Периферия и другие контроллеры

Для Bluetooth, WIFI, NFC и других контроллеров определите сторону сбоя. Анализатором протокола либо двумя USB–UART на RX/TX контроллера захватите обмен. Если ошибается контроллер, ищите причину локально; иначе работайте с поставщиком устройства. Анализируйте положение, количество и значения ошибочных байтов. Лишние байты может отправлять другой процесс в особых условиях, особенно ранний загрузочный вывод после преобразования консольного UART в обычный. При потерях проверьте, не забрал ли данные другой модуль/процесс, и правильность настроек UART. Для DMA следуйте соответствующему разделу.

9.1 Примеры

9.1.1 Ошибки Bluetooth

Для Bluetooth от 1.5M бод и больших объёмов выбирайте четыре линии с аппаратным управлением потоком. Источник сообщает, что длительные испытания двухпроводного Bluetooth выявили паузы воспроизведения в наушниках/колонках даже при DMA. Ограничение обычно в модуле Bluetooth, и оптимизация контроллера не помогает. Сначала проверьте прошивку поставщика, обновляя её вместе с ОС. Локальную диагностику ведите по разделам уровней и IOMUX. В четырёхпроводном Bluetooth RTS pinctrl переключается в узле Bluetooth, CTS — в UART: это определяется стратегией сна/пробуждения и повышает стабильность приёма при выходе из сна. Двухпроводный DMA Bluetooth может предупреждать об отсутствии кольцевого буфера; настройте DMA-буфер по сценарию.

9.1.2 Ошибки RS485

Источник указывает, что UART Rockchip не поддерживает RS485 непосредственно, только RS232. Для RS485 требуется внешний преобразователь. При сбоях проверьте схему и уровни сигналов.

10. Вывод консоли

Консоль Rockchip использует fiq_debugger. FIQ отключает глобальные прерывания, поэтому вывод выполняется потоком: сначала данные записываются в память. Включается CONFIG_RK_CONSOLE_THREAD=y. Код/настройки см. Rockchip_Developer_Guide_UART_CN; для старого SDK запросите обновление fiq_debugger у FAE. Все этапы должны иметь одну скорость — см. раздел отключения/переноса вывода. Для большого вывода увеличьте FIFO_SIZE в драйвере, расширяя буфер потока.

10.1 Примеры

10.1.1 Shell зависает при множестве тестовых команд

Обычно при автоматизированном стресс-тесте с множеством консольных команд зависает Android shell. Рекомендуется shell на базе BusyBox либо bash.

10.1.2 Возврат каретки и перевод строки

Консоль обычно особо обрабатывает возврат каретки \r (0x0D) и перевод строки \n (0x0A). Перед отправкой перевода строки в терминал UART обычно добавляет возврат каретки. При проверке ASCII-обмена внимательно учитывайте 0x0D и 0x0A.

11. Сон, пробуждение и энергопотребление

Сон/пробуждение UART Rockchip реализованы в trust. В ядре добавляется wakeup source, чтобы UART продолжал работать во сне. Проблемы проверяйте одновременно в trust и ядре. Обновите trust до актуальной версии SDK; при сохранении проблемы обратитесь к инженеру Rockchip Trust. При строгих требованиях к потреблению используйте кварц для рабочего такта UART-пробуждения, исключая потребление дробного делителя CRU.

12. Отключение всего вывода или перенос на другой UART

Вывод UART обычно включает DDR, Miniloader, TF-A (Trusted Firmware-A), OP-TEE, U-Boot и Kernel. Метки этапов см. в разделе журнала. Есть два способа выключить весь вывод либо перенести его на другой UART:

Специальная прошивка каждого этапа отключает или перенаправляет вывод; ранние платформы обычно поддерживают только этот метод, запросите прошивки у Rockchip. Второй способ — передача параметров: изменение UART-параметров DDR Loader действует во всех ранних этапах, а ядро изменяется отдельно. Сейчас это основной способ. В старом SDK отдельный этап может не поддерживать передачу параметров; обратитесь в Rockchip.

12.1 Изменения DDR Loader

Для отключения или переноса вывода DDR Loader измените UART-параметры rkbin/tools/ddrbin_param.txt:

uart id=         # UART控制器id,配置为0xf为关闭打印
uart iomux=      # 复用的IOMUX引脚
uart baudrate=   # 115200 or 1500000

Подробности см. ddrbin_tool_user_guide.txt. После изменения создайте ddr.bin следующей командой, подставив реальное имя прошивки SDK.

./ddrbin_tool ddrbin_param.txt path/to/ddr.bin

12.2 Изменения U-Boot

Для отключения вывода U-Boot включите CONFIG_DISABLE_CONSOLE в menuconfig и сохраните .config.

console  --->
    disable console in&out

Перенаправление U-Boot задаётся передачей параметров без дополнительных изменений. Разбор выполняет board_init_f_init_serial() в arch/arm/mach-rockchip/board.c.

12.3 Изменения ядра

12.3.1 Отключение вывода ядра

Отключите CONFIG_SERIAL_8250_CONSOLE в menuconfig.

Device Drivers  --->
    Character devices  --->
        Serial drivers  --->
            [ ] Console on 8250/16550 and compatible serial port

Найдите аналогичные настройки DTS и удалите базовый адрес UART и параметры console.

chosen: chosen {
    bootargs = "earlycon=uart8250,mmio";
}

В fiq-debugger установите serial-id в 0xffffffff и уберите настройки мультиплексирования UART. Сам узел оставьте включённым: процесс fiq-debugger нужен для нормальной загрузки.

fiq-debugger {
    compatible = "rockchip,fiq-debugger";
    rockchip,serial-id = <0xffffffff>;
    rockchip,wake-irq = <0>;
    /* If enable uart uses irq instead of fiq */
    rockchip,irq-mode-enable = <1>;
    rockchip,baudrate = <1500000>;  /* Only 115200 and 1500000 */
    interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_LOW>;
    status = "okay";
    };

12.3.2 Перенос вывода ядра

Например, для переноса вывода ядра с UART2 на UART3 замените базовый адрес UART2 на UART3 в подобных настройках DTS.

chosen: chosen {
    bootargs = "earlycon=uart8250,mmio32,0xfe670000 console=ttyFIQ0";
}

Установите serial-id fiq-debugger в 3 и настройте мультиплексирование UART3. Одновременно отключите обычный узел UART3, теперь используемый консолью.

fiq-debugger {
    compatible = "rockchip,fiq-debugger";
    rockchip,serial-id = <3>;
    rockchip,wake-irq = <0>;
    /* If enable uart uses irq instead of fiq */
    rockchip,irq-mode-enable = <1>;
    rockchip,baudrate = <1500000>;  /* Only 115200 and 1500000 */
    interrupts = <GIC_SPI 252 IRQ_TYPE_LEVEL_LOW>;
    pinctrl-names = "default";
    pinctrl-0 = <&uart3m0_xfer>;
    status = "okay";
    };

12.3.3 Обычный UART вместо консоли

После отключения/переноса консоли снова включите UART как обычный. В DTS сначала отключите/перенесите консоль, освободив UART, затем включайте его обычный узел.

12.4 Изменения Android

В Android recovery отключите использование console, иначе сброс к заводским настройкам зависнет. Закомментируйте console в android/device/rockchip/common/recovery/etc/init.rc.

service recovery /sbin/recovery
    #console
    seclabel u:r:recovery:s0

12.5 Примеры

12.5.1 Проблемы после преобразования консоли в UART

При сбоях бывшего консольного UART повторите тест на другом. Если другой работает, запросите у Rockchip специальную прошивку с отключением UART-вывода прямо в исходниках и продолжите диагностику. Особые ранние операции, например изменение частоты DDR, могут добавлять/терять данные на бывшем консольном UART.

13. Другие вопросы

13.1 Примеры

13.1.1 Ядро не загружается с некоторыми программами ПК

Некоторые программы ПК, например MobaXterm или Putty, по умолчанию включают Xon/Xoff. Во время загрузки, например смены частоты DDR, большой вывод может переполнить буфер ПК. Тогда программа постоянно отправляет Xoff (Control+S) на UART RX. В загрузке Rockchip Control+S включает U-Boot Debug и мешает старту. Источник считает такую настройку неподходящей: программное управление потоком ненадёжно и не используется на платформах Rockchip. Проверьте настройки программы ПК.

13.1.2 Смена номеров UART

Для смены номеров UART, например обмена ttyS3 и ttyS4, измените DTS:

aliases {
    serial3 = &uart4;
    serial4 = &uart3;
}

Для обмена номерами консольного и обычного UART измените непосредственно tty_line_name() в drivers/tty/tty_io.c, добавив проверку нужных номеров.

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