Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Процессорные модули » SK-iMX6S/D-SODIMM
Проблема с UART на ядре 3.10.17_1.0.2.
DeD
Добавлено 12.11.2014 12:34
0
Сообщение: 1
DeD
0

Пункты: 393
Регистрация: 27.02.2012
При миграции на новое ядро столкнулся с трудностями в работе с интерфейсом uart.

Через интерфейс UART2 принимаются данные, пакетами по 20-40 байт, 3-5 пакетов в секудну. Корректность данных проверяется по контрольной сумме, предусмотренной в протоколе пакета.
Приложение принимающее данные написано с использование Qt, попытки чтения данных происходят с частотой 50 Гц в отдельном потоке с высоким приоритетом.
Настройки соединения: 8 бит данных, 1 стоповый бит. Приём данных тестировался на скоростях до 4000000 bps.
Всё это хорошо работало на ядре версии 3.0.35_4.1.0, которое было на виртуальной машине с ftp сервера starterkit.

Далее система мигрировала на ядро версии 3.10.17_1.0.2, которое шло в комплекте с buildroot-2014.08-sk, выложенное тут недавно. В этой версии ядра новый драйвер UART интерфейса "drivers/tty/serial/imx.c". И с этим драйвером следующая проблема:
На скоростях соединения больше 115200 bps периодически возникает ошибка: "imx-uart 21e8000.serial: Rx FIFO overrun". Это происходит в произвольный момент времени и через произвольное число принятых байт(раз в несколько секунд). При этом наблюдается потеря принимаемых данных. Если приём производить не через UART2 а через USB переходник(FT232 и, соответсвтенно, его драйвер), то передача данных происходит корректно на любых доступных скоростях( до 2000000 bps). В исходниках драйвера видно, что ошибка выводится при проверке флага USR2_OR/* Overrun error */. В старой версии драйвера этой проверки не было, но если и в новой версии убрать проверку, сообщения не выводятся, но проблема остаётся. Помимо флага USR2_OR, выставляется также флаг URXD_OVRRUN.

Вот файл конфигурации платы.

В общем виде открытие порта производится следующим образом:
fd = open("/dev/ttymxc%1", O_RDWR | O_NOCTTY | O_NDELAY);
tcgetattr(fd, &trm);
trm.c_iflag=0;
trm.c_oflag=0;
trm.c_cflag=cs|CREAD|CLOCAL;
trm.c_lflag=0;
trm.c_cc[VMIN]=1;
trm.c_cc[VTIME]=0;
cfsetspeed(&trm, B2000000);
fcntl(fd, F_SETFL, FNDELAY);
tcsetattr(fd, TCSANOW, &trm)

Общий вид работы потока чтения:
while(!stop_flag)
{
rec_bytes = read(fd, buf, 512);
msleep(20);
}

Если в качетве отладочной информации выводить число принятых байт(rec_bytes выше), то видно, что принимаются данные пакетами по 20-40 байт 3-5 пакетов в секудну, то есть с запасом хватает и буфера и частоты опроса. Но как работает драйвер мне совсем не очевидно, поэтому прошу помощи.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 12.11.2014 23:51 Редактировалось 13.11.2014 00:24 Сообщение: 2
sasamy
4.70

Пункты: 77214
Регистрация: 14.08.2009
Может и есть какие-то нюансы с короткими пакетами (в чем я сомневаюсь) но никаких проблем я у себя не заметил. Вот логи с двух плат Hola-PC соединенных двумя проводками

UPD Поспешил сообщить что все нормально - есть сообщения об ошибках в логе ядра - через SSH сообщения ядра в консоль не попадают - не заметил сразу

Цитата

imx-uart 21e8000.serial: Rx FIFO overrun
ppp0: PPP: VJ decompression error
ppp0: PPP: VJ decompression error
ppp0: PPP: VJ decompression error


не знаю совпадение или нет это - но на стороне процессора imx6 dual эта ошибка проскочила

i.mx6 Solo

Цитата

# uname -a
Linux buildroot 3.10.17 #1 SMP PREEMPT Wed Nov 12 15:54:52 MSK 2014 armv7l GNU/Linux
# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 10 (v7l)
BogoMIPS : 790.52
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part : 0xc09
CPU revision : 10

Hardware : Freescale i.MX6 Quad/DualLite (Device Tree)
Revision : 0000
Serial : 0000000000000000
# modprobe ppp_generic
# pppd -detach lock 192.168.2.100:192.168.2.200 /dev/ttymxc1 921600 &
# Using interface ppp0
Connect: ppp0 <--> /dev/ttymxc1
Deflate (15) compression enabled
local IP address 192.168.2.100
remote IP address 192.168.2.200

# stty -F /dev/ttymxc1
speed 921600 baud; line = 3;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
ignbrk -brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.2.100 P-t-P:192.168.2.200 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:62 (62.0 B) TX bytes:62 (62.0 B)

# ping 192.168.2.200
PING 192.168.2.200 (192.168.2.200): 56 data bytes
64 bytes from 192.168.2.200: seq=0 ttl=64 time=1.470 ms
64 bytes from 192.168.2.200: seq=1 ttl=64 time=1.175 ms
64 bytes from 192.168.2.200: seq=2 ttl=64 time=1.135 ms
64 bytes from 192.168.2.200: seq=3 ttl=64 time=1.161 ms
64 bytes from 192.168.2.200: seq=4 ttl=64 time=1.166 ms
64 bytes from 192.168.2.200: seq=5 ttl=64 time=1.134 ms
64 bytes from 192.168.2.200: seq=6 ttl=64 time=1.171 ms
64 bytes from 192.168.2.200: seq=7 ttl=64 time=1.145 ms
64 bytes from 192.168.2.200: seq=8 ttl=64 time=1.142 ms
64 bytes from 192.168.2.200: seq=9 ttl=64 time=1.212 ms
64 bytes from 192.168.2.200: seq=10 ttl=64 time=1.138 ms
64 bytes from 192.168.2.200: seq=11 ttl=64 time=1.131 ms
64 bytes from 192.168.2.200: seq=12 ttl=64 time=1.128 ms
64 bytes from 192.168.2.200: seq=13 ttl=64 time=1.133 ms
64 bytes from 192.168.2.200: seq=14 ttl=64 time=1.131 ms
64 bytes from 192.168.2.200: seq=15 ttl=64 time=1.129 ms
64 bytes from 192.168.2.200: seq=16 ttl=64 time=1.139 ms
64 bytes from 192.168.2.200: seq=17 ttl=64 time=1.145 ms
^C
--- 192.168.2.200 ping statistics ---
18 packets transmitted, 18 packets received, 0% packet loss
round-trip min/avg/max = 1.128/1.165/1.470 ms
# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 85.3 KByte (default)
------------------------------------------------------------
[ 4] local 192.168.2.100 port 5001 connected with 192.168.2.200 port 58304
[ ID] Interval Transfer Bandwidth
[ 4] 0.0-10.0 sec 44.9 MBytes 37.5 Mbits/sec

^C# ifconfig
eth0 Link encap:Ethernet HWaddr 00:1F:F2:00:00:00
inet addr:192.168.0.136 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::21f:f2ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:475 errors:0 dropped:0 overruns:0 frame:0
TX packets:316 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:46689 (45.5 KiB) TX bytes:39226 (38.3 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.2.100 P-t-P:192.168.2.200 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:32616 errors:0 dropped:0 overruns:0 frame:0
TX packets:16404 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:48751966 (46.4 MiB) TX bytes:854070 (834.0 KiB)



i.mx6 Dual

Цитата

# uname -a
Linux buildroot 3.10.17 #1 SMP PREEMPT Wed Nov 12 15:54:52 MSK 2014 armv7l GNU/Linux
# cat /proc/cpuinfo
processor : 0
model name : ARMv7 Processor rev 10 (v7l)
BogoMIPS : 790.52
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part : 0xc09
CPU revision : 10

processor : 1
model name : ARMv7 Processor rev 10 (v7l)
BogoMIPS : 790.52
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x2
CPU part : 0xc09
CPU revision : 10

Hardware : Freescale i.MX6 Quad/DualLite (Device Tree)
Revision : 0000
Serial : 0000000000000000
# modprobe ppp_generic
# pppd -detach lock 192.168.2.200:192.168.2.100 /dev/ttymxc1 921600 &
# Using interface ppp0
Connect: ppp0 <--> /dev/ttymxc1
Deflate (15) compression enabled
local IP address 192.168.2.200
remote IP address 192.168.2.100

# stty -F /dev/ttymxc1
speed 921600 baud; line = 3;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
ignbrk -brkint -icrnl -imaxbel
-opost -onlcr
-isig -icanon -iexten -echo -echoe -echok -echoctl -echoke
# ifconfig ppp0
ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.2.200 P-t-P:192.168.2.100 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:62 (62.0 B) TX bytes:62 (62.0 B)

# ping 192.168.2.100
PING 192.168.2.100 (192.168.2.100): 56 data bytes
64 bytes from 192.168.2.100: seq=0 ttl=64 time=1.902 ms
64 bytes from 192.168.2.100: seq=1 ttl=64 time=1.186 ms
64 bytes from 192.168.2.100: seq=2 ttl=64 time=1.105 ms
64 bytes from 192.168.2.100: seq=3 ttl=64 time=1.134 ms
64 bytes from 192.168.2.100: seq=4 ttl=64 time=1.128 ms
64 bytes from 192.168.2.100: seq=5 ttl=64 time=1.121 ms
64 bytes from 192.168.2.100: seq=6 ttl=64 time=1.111 ms
64 bytes from 192.168.2.100: seq=7 ttl=64 time=1.143 ms
64 bytes from 192.168.2.100: seq=8 ttl=64 time=1.175 ms
64 bytes from 192.168.2.100: seq=9 ttl=64 time=1.104 ms
64 bytes from 192.168.2.100: seq=10 ttl=64 time=1.117 ms
64 bytes from 192.168.2.100: seq=11 ttl=64 time=1.115 ms
64 bytes from 192.168.2.100: seq=12 ttl=64 time=1.102 ms
64 bytes from 192.168.2.100: seq=13 ttl=64 time=1.098 ms
64 bytes from 192.168.2.100: seq=14 ttl=64 time=1.092 ms
64 bytes from 192.168.2.100: seq=15 ttl=64 time=1.086 ms
64 bytes from 192.168.2.100: seq=16 ttl=64 time=1.103 ms
64 bytes from 192.168.2.100: seq=17 ttl=64 time=1.088 ms
64 bytes from 192.168.2.100: seq=18 ttl=64 time=1.122 ms
64 bytes from 192.168.2.100: seq=19 ttl=64 time=1.130 ms
64 bytes from 192.168.2.100: seq=20 ttl=64 time=1.095 ms
^C
--- 192.168.2.100 ping statistics ---
21 packets transmitted, 21 packets received, 0% packet loss
round-trip min/avg/max = 1.086/1.155/1.902 ms
# iperf -c 192.168.2.100
------------------------------------------------------------
Client connecting to 192.168.2.100, TCP port 5001
TCP window size: 20.7 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.2.200 port 58304 connected with 192.168.2.100 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 44.9 MBytes 37.6 Mbits/sec
# ifconfig
eth0 Link encap:Ethernet HWaddr 00:1F:F2:00:00:00
inet addr:192.168.1.200 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::21f:f2ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:407 errors:0 dropped:0 overruns:0 frame:0
TX packets:278 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:41023 (40.0 KiB) TX bytes:35718 (34.8 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

ppp0 Link encap:Point-to-Point Protocol
inet addr:192.168.2.200 P-t-P:192.168.2.100 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:16352 errors:52 dropped:0 overruns:0 frame:0
TX packets:32616 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:851170 (831.2 KiB) TX bytes:48751966 (46.4 MiB)
Спуститься к концу Подняться к началу
Персональная информация
DeD
Добавлено 13.11.2014 08:54 Сообщение: 3
DeD
0

Пункты: 393
Регистрация: 27.02.2012
Настораживает отсутсвие системности. Единственная, пока, выявленая зависимость - от скорости соединения, чем она выше тем чаще может проявляться ошибка. Особенно от 1000000.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 13.11.2014 10:19 Редактировалось 13.11.2014 10:23 Сообщение: 4
sasamy
4.70

Пункты: 77214
Регистрация: 14.08.2009
Пробовал драйвер из ванильного ядра с git - без изменений. У меня есть подозрение что есть какой-то косяк либо в микрокоде sdma или в приоритетах мастеров, потому что есть на текущий момент такой баг который воспроизводится 100% - звук на HDMI начинает хрипеть примерно через 40 мин воспроизведения любого видеофайла на всех ядрах фрискейла (включая следующий релиз 3.10.31) и линаро. В errata на процессор есть описание примерно такого случая и связано с переполнением буферов DMA но он был помоему еще на инженерных образцах - проверял в ядре через принт - ревизия HDMI уже новая, на 3.0.35 этого бага не было. В общем прямо сейчас думаю проблему с наскока не решить.
Спуститься к концу Подняться к началу
Персональная информация
John Smith
Добавлено 13.11.2014 17:34 Сообщение: 5
John Smith
0

Пункты: 2289
Регистрация: 18.02.2011
Читали ?
[url=https://community.freescale.com/message/356889#356889][/url]
Пристрастие запрещать прерывания на десятки мс у фрискейла пожизненное, нам гадило еще на imx25.
Есть смысл проверить работу uart с отключенным драйвером mmc / sd.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 13.11.2014 18:24 Редактировалось 13.11.2014 19:30 Сообщение: 6
sasamy
4.70

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

Читали ?


Прочитал - не впечатлило.

Цитата

And here is the problem:

The routine starts with 'spin_lock_irqsave'. This means I wont get any interrupts until the lock is released.


spin_lock_irqsave запрещает прерывания только на локальном ядре на котором выполняется текущий процесс

Цитата

нам гадило еще на imx25


там да - одно ядро, может нагадить. Но все рвно надо будет поэкспериментировать - попробовать вручную раскидать прервания по ядрам. Меня больше впечатлил ответ сотрудника фрискейл на такой выпрос

https://community.freescale.com/message/451200#451200
Спуститься к концу Подняться к началу
Персональная информация
DeD
Добавлено 14.11.2014 11:06 Сообщение: 7
DeD
0

Пункты: 393
Регистрация: 27.02.2012
Найдено решение: необходимо включить опцию ядра "Device Drivers/DMA Engine support/i.MX DMA support".
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.11.2014 11:30 Редактировалось 14.11.2014 11:43 Сообщение: 8
sasamy
4.70

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

Найдено решение: необходимо включить опцию ядра "Device Drivers/DMA Engine support/i.MX DMA support".


А это точно решение - всмысле именно это помогло? мне конечно не трудно по умолчанию включить в конфиге, просто если это и влияет на ситуацию то только косвенно и скорей всего есть какой-то баг

CONFIG_IMX_DMA:
Support the i.MX DMA engine. This engine is integrated into
Freescale i.MX1/21/27 chips.

на i.mx6 - SDMA и поддержка его включена по умолчанию

Цитата

CC kernel/configs.o
CC drivers/dma/imx-dma.o
LD kernel/built-in.o
drivers/dma/imx-dma.c: In function ‘imxdma_alloc_chan_resources’:
drivers/dma/imx-dma.c:738:30: error: ‘struct imx_dma_data’ has no member named ‘dma_request’
imxdmac->dma_request = data->dma_request;
^
make[3]: *** [drivers/dma/imx-dma.o] Error 1
Спуститься к концу Подняться к началу
Персональная информация
DeD
Добавлено 14.11.2014 13:27 Сообщение: 9
DeD
0

Пункты: 393
Регистрация: 27.02.2012
В конфигурации ядра, при котором исчезла ошибка с uart было только 2 новых изменеия: включении опции DMA и отключение touchscreen. А вот если опцию DMA отключить, то пересобрать ядро уже не получается:

drivers/dma/imx-dma.c: In function ‘imxdma_alloc_chan_resources’:
drivers/dma/imx-dma.c:738:30: error: ‘struct imx_dma_data’ has no member named ‘dma_request’
imxdmac->dma_request = data->dma_request;
^
scripts/Makefile.build:308: recipe for target 'drivers/dma/imx-dma.o' failed
make[3]: *** [drivers/dma/imx-dma.o] Error 1
scripts/Makefile.build:455: recipe for target 'drivers/dma' failed
make[2]: *** [drivers/dma] Error 2
make[2]: *** Waiting for unfinished jobs....
Makefile:795: recipe for target 'drivers' failed
make[1]: *** [drivers] Error 2
make[1]: *** Waiting for unfinished jobs....
make[1]: Leaving directory '/home/serg/buildroot/buildroot-2014.08-zl/output/build/linux-custom'
package/pkg-generic.mk:177: recipe for target '/home/serg/buildroot/buildroot-2014.08-zl/output/build/linux-custom/.stamp_built' failed
make: *** [/home/serg/buildroot/buildroot-2014.08-zl/output/build/linux-custom/.stamp_built] Error 2

Похоже, что опция определяет структуру 'struct imx_dma_data'. А отключение опции как будто не переопределяет структура назад? Я собрал билдрут из чистого архива. Опцию DMA не выставлял, UART работал с ошибками. Всю папку buidroot сохранил в архив. Затем добавил в ядре опцию DMA и пересобрал его. После сброки залил всё на плату, UART работал без проблем до 4000000bps. Затем я отключил опцию DMA и сброка ядра завершилась ошибкой(как выше со структурой). Тогда я извлёк из архива весь builfroot, в котором ядро успешно было собрано без опции DMA. И вот если ничего не меняя тут попробовать пересобрать ядро, то возникает ошибка:

In file included from arch/arm/boot/dts/imx6q.dtsi:12:0,
from arch/arm/boot/dts/imx6q-hola-aeeb.dts:10:
arch/arm/boot/dts/imx6qdl.dtsi:14:35: fatal error: dt-bindings/gpio/gpio.h: No such file or directory
#include <dt-bindings/gpio/gpio.h>
^
compilation terminated.
In file included from arch/arm/boot/dts/imx6q.dtsi:12:0,
from arch/arm/boot/dts/imx6q-hola.dts:10:
arch/arm/boot/dts/imx6qdl.dtsi:14:35: fatal error: dt-bindings/gpio/gpio.h: No such file or directory
#include <dt-bindings/gpio/gpio.h>

Непонятно, почему не пересобирается нетронутое ядро которое совсем недавно нормально собралось. Это при архивации что-то теряется или как-то повлияла сборка друго ядра из другого buildroot из другой папки?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 29.01.2015 13:15 Сообщение: 10
sasamy
4.70

Пункты: 77214
Регистрация: 14.08.2009
Похоже что решение проблемы тут

https://community.freescale.com/thread/340560
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Процессорные модули » SK-iMX6S/D-SODIMM