Error using UART in Torizon: Operation not permitted

Hi

I am trying to use UART ports inside a container, on a Colibri iMX8X running TorizonCore 5.3.0+build.7. When I try to use them inside a container, I get the error “Operation not permitted”

Useful information:

This is uname -a output:

imx8x:~$ uname -a
Linux imx8x 5.4.115-5.3.0+git.dbdbcabf0f98 #1-TorizonCore SMP PREEMPT Tue Jul 6 08:47:10 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

Writing to ports inside a container:

imx8x:~$ docker exec -it --user=root mapeador_arm64v8-qt5-vivante-no-ssh_bullseye_debug_f15fce5c-ed89-4b4c-a7f7-16bcaff06cc9_latest_instance /bin/bash
root@imx8x:/mapeador# ls
mapeador
root@imx8x:/mapeador# echo "test" > /dev/ttyLP0
bash: /dev/ttyLP0: Operation not permitted
root@imx8x:/mapeador# echo "test" > /dev/ttyLP2
bash: /dev/ttyLP2: Operation not permitted
root@imx8x:/mapeador# echo "test" > /dev/ttyLP3
bash: /dev/ttyLP3: Operation not permitted

Writing to ports in host, outside of any container:

imx8x:~$ echo "test" > /dev/ttyLP0
imx8x:~$ echo "test" > /dev/ttyLP2
imx8x:~$ echo "test" > /dev/ttyLP3
-sh: /dev/ttyLP3: Permission denied

Only the access to /dev/ttyLP3 is denied, which I think is because its used for serial console.

Output of ls -l /dev/tty* inside of container:

root@imx8x:/mapeador# ls -l /dev/tty*
crw-rw-rw- 1 root tty       5,  0 Nov 17 14:37 /dev/tty
crw--w---- 1 root tty       4,  0 Nov 17 14:37 /dev/tty0
crw--w---- 1 root tty       4,  1 Nov 17 14:38 /dev/tty1
crw--w---- 1 root tty       4, 10 Nov 17 14:37 /dev/tty10
crw--w---- 1 root tty       4, 11 Nov 17 14:37 /dev/tty11
crw--w---- 1 root tty       4, 12 Nov 17 14:37 /dev/tty12
crw--w---- 1 root tty       4, 13 Nov 17 14:37 /dev/tty13
crw--w---- 1 root tty       4, 14 Nov 17 14:37 /dev/tty14
crw--w---- 1 root tty       4, 15 Nov 17 14:37 /dev/tty15
crw--w---- 1 root tty       4, 16 Nov 17 14:37 /dev/tty16
crw--w---- 1 root tty       4, 17 Nov 17 14:37 /dev/tty17
crw--w---- 1 root tty       4, 18 Nov 17 14:37 /dev/tty18
crw--w---- 1 root tty       4, 19 Nov 17 14:37 /dev/tty19
crw--w---- 1 root tty       4,  2 Nov 17 14:37 /dev/tty2
crw--w---- 1 root tty       4, 20 Nov 17 14:37 /dev/tty20
crw--w---- 1 root tty       4, 21 Nov 17 14:37 /dev/tty21
crw--w---- 1 root tty       4, 22 Nov 17 14:37 /dev/tty22
crw--w---- 1 root tty       4, 23 Nov 17 14:37 /dev/tty23
crw--w---- 1 root tty       4, 24 Nov 17 14:37 /dev/tty24
crw--w---- 1 root tty       4, 25 Nov 17 14:37 /dev/tty25
crw--w---- 1 root tty       4, 26 Nov 17 14:37 /dev/tty26
crw--w---- 1 root tty       4, 27 Nov 17 14:37 /dev/tty27
crw--w---- 1 root tty       4, 28 Nov 17 14:37 /dev/tty28
crw--w---- 1 root tty       4, 29 Nov 17 14:37 /dev/tty29
crw--w---- 1 root tty       4,  3 Nov 17 14:37 /dev/tty3
crw--w---- 1 root tty       4, 30 Nov 17 14:37 /dev/tty30
crw--w---- 1 root tty       4, 31 Nov 17 14:37 /dev/tty31
crw--w---- 1 root tty       4, 32 Nov 17 14:37 /dev/tty32
crw--w---- 1 root tty       4, 33 Nov 17 14:37 /dev/tty33
crw--w---- 1 root tty       4, 34 Nov 17 14:37 /dev/tty34
crw--w---- 1 root tty       4, 35 Nov 17 14:37 /dev/tty35
crw--w---- 1 root tty       4, 36 Nov 17 14:37 /dev/tty36
crw--w---- 1 root tty       4, 37 Nov 17 14:37 /dev/tty37
crw--w---- 1 root tty       4, 38 Nov 17 14:37 /dev/tty38
crw--w---- 1 root tty       4, 39 Nov 17 14:37 /dev/tty39
crw--w---- 1 root tty       4,  4 Nov 17 14:37 /dev/tty4
crw--w---- 1 root tty       4, 40 Nov 17 14:37 /dev/tty40
crw--w---- 1 root tty       4, 41 Nov 17 14:37 /dev/tty41
crw--w---- 1 root tty       4, 42 Nov 17 14:37 /dev/tty42
crw--w---- 1 root tty       4, 43 Nov 17 14:37 /dev/tty43
crw--w---- 1 root tty       4, 44 Nov 17 14:37 /dev/tty44
crw--w---- 1 root tty       4, 45 Nov 17 14:37 /dev/tty45
crw--w---- 1 root tty       4, 46 Nov 17 14:37 /dev/tty46
crw--w---- 1 root tty       4, 47 Nov 17 14:37 /dev/tty47
crw--w---- 1 root tty       4, 48 Nov 17 14:37 /dev/tty48
crw--w---- 1 root tty       4, 49 Nov 17 14:37 /dev/tty49
crw--w---- 1 root tty       4,  5 Nov 17 14:37 /dev/tty5
crw--w---- 1 root tty       4, 50 Nov 17 14:37 /dev/tty50
crw--w---- 1 root tty       4, 51 Nov 17 14:37 /dev/tty51
crw--w---- 1 root tty       4, 52 Nov 17 14:37 /dev/tty52
crw--w---- 1 root tty       4, 53 Nov 17 14:37 /dev/tty53
crw--w---- 1 root tty       4, 54 Nov 17 14:37 /dev/tty54
crw--w---- 1 root tty       4, 55 Nov 17 14:37 /dev/tty55
crw--w---- 1 root tty       4, 56 Nov 17 14:37 /dev/tty56
crw--w---- 1 root tty       4, 57 Nov 17 14:37 /dev/tty57
crw--w---- 1 root tty       4, 58 Nov 17 14:37 /dev/tty58
crw--w---- 1 root tty       4, 59 Nov 17 14:37 /dev/tty59
crw--w---- 1 root tty       4,  6 Nov 17 14:37 /dev/tty6
crw--w---- 1 root tty       4, 60 Nov 17 14:37 /dev/tty60
crw--w---- 1 root tty       4, 61 Nov 17 14:37 /dev/tty61
crw--w---- 1 root tty       4, 62 Nov 17 14:37 /dev/tty62
crw--w---- 1 root tty       4, 63 Nov 17 14:37 /dev/tty63
crw--w---- 1 root root      4,  7 Nov 17 14:42 /dev/tty7
crw--w---- 1 root tty       4,  8 Nov 17 14:37 /dev/tty8
crw--w---- 1 root tty       4,  9 Nov 17 14:37 /dev/tty9
crw-rw---- 1 root dialout 245,  0 Nov 17 14:50 /dev/ttyLP0
crw-rw---- 1 root dialout 245,  2 Nov 17 14:50 /dev/ttyLP2
crw--w---- 1 root tty     245,  3 Nov 17 14:38 /dev/ttyLP3
crw-rw---- 1 root dialout   4, 64 Nov 17 14:37 /dev/ttyS0
crw-rw---- 1 root dialout   4, 65 Nov 17 14:37 /dev/ttyS1
crw-rw---- 1 root dialout   4, 66 Nov 17 14:37 /dev/ttyS2
crw-rw---- 1 root dialout   4, 67 Nov 17 14:37 /dev/ttyS3
crw------- 1 root root      3,  0 Nov 17 14:37 /dev/ttyp0
crw------- 1 root root      3,  1 Nov 17 14:37 /dev/ttyp1
crw------- 1 root root      3,  2 Nov 17 14:37 /dev/ttyp2
crw------- 1 root root      3,  3 Nov 17 14:37 /dev/ttyp3
crw------- 1 root root      3,  4 Nov 17 14:37 /dev/ttyp4
crw------- 1 root root      3,  5 Nov 17 14:37 /dev/ttyp5
crw------- 1 root root      3,  6 Nov 17 14:37 /dev/ttyp6
crw------- 1 root root      3,  7 Nov 17 14:37 /dev/ttyp7
crw------- 1 root root      3,  8 Nov 17 14:37 /dev/ttyp8
crw------- 1 root root      3,  9 Nov 17 14:37 /dev/ttyp9
crw------- 1 root root      3, 10 Nov 17 14:37 /dev/ttypa
crw------- 1 root root      3, 11 Nov 17 14:37 /dev/ttypb
crw------- 1 root root      3, 12 Nov 17 14:37 /dev/ttypc
crw------- 1 root root      3, 13 Nov 17 14:37 /dev/ttypd
crw------- 1 root root      3, 14 Nov 17 14:37 /dev/ttype
crw------- 1 root root      3, 15 Nov 17 14:37 /dev/ttypf

Output of groups torizon:

root@imx8x:/mapeador# groups torizon
torizon : torizon dialout audio video gpio i2cdev spidev pwm input kvm render

Trying the same as root inside the container results in the same error. I already read the UART article posted in developer.toradex.com. What could I be missing?

Thank you

Greetings @tomas.ayi,

It appears the container you created was generated via our VSCode extension is that correct?

If yes then how did you configure this project?

It looks like you added the UART devices via the devices configuration and you also added the torizon user to the dialout group. This should be all that is needed.

I just did a quick test where I created a dummy python project. I added /dev/ttyLP0, dev/ttyLP2, and /dev/ttyLP3 to the devices configuration. Then I added RUN usermod -a -G dialout torizon to the buildcommands configuration. In the container that resulted I was able to echo to all of the UARTs with no issue:

colibri-imx8x-06750825:~$ docker exec -it 4 bash
torizon@473b706621a6:/$ echo test > /dev/ttyLP0
torizon@473b706621a6:/$ echo test > /dev/ttyLP2
torizon@473b706621a6:/$ echo test > /dev/ttyLP3

The only way I was able to reproduce your error was by using the volumes configuration to pass the UART devices into the container instead of the devices configuration. Perhaps this is what you did?

Also on a side-note:

Only the access to /dev/ttyLP3 is denied, which I think is because its used for serial console.

You are correct about this part.

Best Regards,
Jeremias

Hi Jeremias,

It appears the container you created was generated via our VSCode extension is that correct?

It’s correct. Sorry for not clarifying at the beginning.

If yes then how did you configure this project?

I just used the default configuration for arm64v8 devices. Maybe I added /dev:/dev in volumes to use all devices during development.

I tried adding /dev/ttyLP0, /dev/ttyLP2 and /dev/ttyLP3 to the devices configuration and now it works

Thank you for your time and your help.

Regards,
Tomás

Glad I was able to help!

Yeah there’s a difference with adding a device via a bind-mount versus the devices option. The devices grants the container certain permissions which allows it to use the device more easily. Otherwise you would need to add the privileged flag to the container.

Best Regards,
Jeremias

1 Like