Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:0
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
как настроить скорость UART
baikoff
Добавлено 03.06.2025 13:42 Редактировалось 03.06.2025 13:42
0
Сообщение: 1
baikoff
0

Пункты: 2128
Регистрация: 25.04.2025
Здравствуйте.

Подскажите пожалуйста, можно ли нижеприведенной командой выставить необходимую мне скорость порта, например 1382400 ? ( или может каким другими способами? )

stty -F /dev/ttyS3 1500000

Команда позволяет выставить 460800, 921600, 1000000, 1500000, а вот на значения между 1000000 - 1500000: выдает ошибку

stty: invalid argument ‘1382400’

У меня подозрение, что моя связка по UART SK-T507-SODIMM + Микроконтроллер почему-то нестабильно работает на максимальной скорости 1500000, хотелось бы немного снизить.

При этом связка по UART ПК на Windows + Микроконтроллер на скорости 1500000 - работает без сбоев.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 03.06.2025 14:09 Сообщение: 2
sasamy
4.71

Пункты: 88696
Регистрация: 14.08.2009
Цитата

У меня подозрение, что моя связка по UART SK-T507-SODIMM + Микроконтроллер почему-то нестабильно работает на максимальной скорости 1500000, хотелось бы немного снизить.


скорей всего не снижать надо а менять источник тактирования UART, штатно 115200 максимум по крайней мере на t113 и a40i
Спуститься к концу Подняться к началу
Персональная информация
baikoff
Добавлено 03.06.2025 14:17 Сообщение: 3
baikoff
0

Пункты: 2128
Регистрация: 25.04.2025
модуль SK-T507-SODIMM

а вот вывод dmesg :

dmesg | grep tty
[ 0.000000] Kernel command line: root=/dev/mmcblk0p2 rootwait rootfstype=ext4 splash plymouth.ignore-serial-consoles console=ttyS0,115200 console=tty1 consoleblank=0 loglevel=7 ubootpart=b5f9600e-01
[ 0.000615] printk: legacy console [tty1] enabled
[ 0.286017] printk: legacy console [ttyS0] disabled
[ 0.286365] 5000000.serial: ttyS0 at MMIO 0x5000000 (irq = 305, base_baud = 1500000) is a AW_16550A
[ 0.286443] printk: legacy console [ttyS0] enabled
[ 0.311499] 5000400.serial: ttyS1 at MMIO 0x5000400 (irq = 306, base_baud = 1500000) is a AW_16550A
[ 1.551926] 5000800.serial: ttyS2 at MMIO 0x5000800 (irq = 307, base_baud = 1500000) is a AW_16550A
[ 1.562076] 5001400.serial: ttyS3 at MMIO 0x5001400 (irq = 308, base_baud = 1500000) is a AW_16550A
[ 5.460595] systemd[1]: Created slice system-serial\x2dgetty.slice.



а вот содержание файла /sys/class/tty/ttyS3/uartclk

24000000

вроде должно все работать на 1500000, или я не прав?
тогда подскажите как менять источник тактирования UART
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 03.06.2025 14:46 Сообщение: 4
sasamy
4.71

Пункты: 88696
Регистрация: 14.08.2009
Цитата

а вот содержание файла /sys/class/tty/ttyS3/uartclk

24000000

вроде должно все работать на 1500000, или я не прав?
тогда подскажите как менять источник тактирования UART


Надо менять, при такой опорной частоте он работает но погрешность получается слишком большая на скорости выше 115200
Спуститься к концу Подняться к началу
Персональная информация
baikoff
Добавлено 03.06.2025 14:52 Сообщение: 5
baikoff
0

Пункты: 2128
Регистрация: 25.04.2025
Можете, пожалуйста, объяснить, каким образом настраивать опорную частоту?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 03.06.2025 17:10 Сообщение: 6
sasamy
4.71

Пункты: 88696
Регистрация: 14.08.2009
Цитата
Можете, пожалуйста, объяснить, каким образом настраивать опорную частоту?


Посмотрим все клоки

mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/clk/clk_summary

видно что uart-ы на apb2 а он в свою очередь на osc24M с частотой 24 МГц

Смотрим linux-custom/drivers/clk/sunxi-ng/ccu-sun50i-h616.c

UART-ы гвоздями прибиты к apb2

static SUNXI_CCU_GATE(bus_uart0_clk, "bus-uart0", "apb2", 0x90c, BIT(0), 0);

так что надо менять частоту apb2, там и делитель дробный есть

static SUNXI_CCU_MP_WITH_MUX(apb2_clk, "apb2", ahb3_apb1_apb2_parents, 0x524,
0, 2, /* M */
8, 2, /* P */
24, 2, /* mux */
0);

и источники тактирования на выбор

static const char * const ahb3_apb1_apb2_parents[] = { "osc24M", "osc32k",
"psi-ahb1-ahb2",
"pll-periph0" };

есть возможности для подстраивания. Теоретически надо высчитать подхоящую частоту
но можно попробовать методом тыка, например 80000000

надо дописать в своем dts, например linux-custom/arch/arm64/boot/dts/allwinner/sun50i-t507-sodimm-lvds-800-480-sk.dts

....

#define CLK_APB2 27

&ccu {
assigned-clocks = <&ccu CLK_APB2>;
assigned-clock-rates = <80000000>;
};


&codec {
....

Чтобы изменения скомпилировать

make linux-menuconfig

make

на плате достаточно заменить после этого только dtb

scp output/target/boot/allwinner/sun50i-t507-sk.dtb root@192.168.0.136:/boot/allwinner/sun50i-t507-sk.dtb

После перезагрузки посмотреть клоки

mount -t debugfs none /sys/kernel/debug
cat /sys/kernel/debug/clk/clk_summary

apb2 переключился на другой источник pll-periph0 но частоту выставил не 80 а 75 МГц

pll-periph0 5 5 0 600000000 0 0 50000 Y deviceless no_connection_id
spi1 0 0 0 25000000 0 0 50000 N 5011000.spi mod
deviceless no_connection_id
apb2 1 1 0 75000000 0 0 50000 Y deviceless no_connection_id

так что вычислять особого смысла нет - надо просто подогнать, возможно и так будет нормально, потому что у самого уарта есть еще свои внутренние делители и он в драйвере подстраивается под частоту от которой тактируется сам, чем выше частота источника тем ему проще подстроиться.
Спуститься к концу Подняться к началу
Персональная информация
baikoff
Добавлено 04.06.2025 11:22 Редактировалось 04.06.2025 11:34 Сообщение: 7
baikoff
0

Пункты: 2128
Регистрация: 25.04.2025
Спасибо.

Все сработало. Надеюсь теперь смогу подобрать работающую частоту.

Для отладки и подбора нужных значений я использовал способ менять файл DTB прямо на целевой ОС, без необходимости компилировать изменения в файле DTS на другом ПК.

Для этого на целевой ОС:

- установить device-tree-compiler

apt-get install device-tree-compiler

- извлечь файл DTS (дерева устройств) из файла .DTB (blob-файл дерева устройств)

dtc --sort -I dtb -O dts sun50i-t507-sodimm-lvds-640-480-sk.dtb > device_tree.dts

- внести необходимые изменения в файле device_tree.dts (примечание: все числовые значения там в HEX)

- перекомпилировать файл DTS обратно в DTB

dtc -I dts -O dtb -o sun50i-t507-sodimm-lvds-640-480-sk.dtb device_tree.dts

- скопировать полученный файл DTB в исходное его расположение и перезагрузить целевую ОС

Этот способ при конвертациях вываливает кучу warning-ов, поэтому после окончания тестирования лучше пересобрать новый DTB файл стандартным способом

make linux-menuconfig
make
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 04.06.2025 12:56 Сообщение: 8
sasamy
4.71

Пункты: 88696
Регистрация: 14.08.2009
Цитата

Все сработало. Надеюсь теперь смогу подобрать работающую частоту.


вы не первый кто хочет использовать UART на высокой скорости, и как у всех скорей всего возникнут проблемы с потерей данных, поэтому на всякий случай добавил описание как пропатчить ядро для работы в реалтайме для t507

http://starterkit.ru/html/index.php?name=forum&op=view&id=32175
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux