UART0 auf GPIO 32 und GPIO 33

  • Hallo Zusammen,

    ich habe ein Compute Module V3 lite am laufen und Probleme mit den UART-Schnittstellen.:helpnew:

    Als Betriebssystem verwende ich das aktuelle Raspbian Stretch with desktop mit dem Release date: 2018-10-09

    Linux raspberrypi 4.14.78-v7+ #1156 SMP Tue Oct 23 14:34:39 BST 2018 armv7l

    Die UART0 würde ich gerne auf GPIO 32 und GPIO 33 legen. Dafür habe ich in der /boot/config.txt folgendes eingefügt:

    Code
    dtoverlay=uart0,txd0_pin=32,rxd0_pin=33

    in der /boot/cmdline.txt habe ich den Teil gelöscht damit die Console mir die UART nicht besetzt:

    Code
    console=ttyAMA0,115200

    Trotz des dtoverlays wird die UART0 weiterhin auf GPIO14 und GPIO15 ausgegeben.:conf:

    Die Seite: The Raspberry Pi UARTs ist mir bekannt und ich habe auch schon mit den folgenden Befehlszeilen herumexperimentiert:

    Code
    enable_uart=1
    pi3-disable-bt
    pi3-miniuart-bt
    core_freq=250

    Jegliche Versuche mit unterschiedlichen Konstellationen sind leider fehlgeschlagen.:wallbash:

    Mit der UART1 funktioniert jede mögliche Variante::denker:

    Code
    dtoverlay=uart1,txd1_pin=14,rxd1_pin=15
    oder
    dtoverlay=uart1,txd1_pin=32,rxd1_pin=33
    oder
    dtoverlay=uart1,txd1_pin=40,rxd1_pin=41

    Sowohl:

    Code
    sudo apt-get update
    und
    sudo apt-get upgrade
    und
    sudo rpi-update

    haben keine Änderung gebracht.

    Habt Ihr eine Idee wo der Fehler liegen könnte oder könnt selbiges Verhalten rekonstruieren?

    Vielen Dank für Eure Hilfe!:danke_ATDE:

    Gruß Dominik

    Edited once, last by wudo94 (November 5, 2018 at 11:04 AM).

  • Ich klaue das mal und poste es hier, falls deutschsprachige User auch danach suchen.:daumendreh2:

    1.) Datei mit Namen uart0-overlay.dts erstellen und wie folgt befüllen:

    2.) Kompilieren und kopieren:

    Code
    dtc -@ -I dts -O dtb -o uart0.dtbo uart0-overlay.dts
    sudo cp uart0.dtbo /boot/overlays

    3.) /boot/config.txt bearbeiten:

    Code
    dtoverlay=uart0,txd0_pin=32,rxd0_pin=33,pin_func=7 # alt3

    oder

    Code
    dtoverlay=uart0,txd0_pin=36,rxd0_pin=37,pin_func=6 # alt2
  • Hofei , vielen Dank für den Link, diesen Beitrag hatte ich noch nicht gefunden.

    Den dtoverlay der von PhilE beschrieben wird erstellt bis auf RTS und CTS den gleichen overlay der bereits unter /boot/overlays/uart0.dtbo zu finden ist.

    Was ich bis jetzt nicht wusste ist das bei folgendem Befehlt auch pin_func=7 angegeben werden muss:

    Code
    dtoverlay=uart0,txd0_pin=32,rxd0_pin=33,pin_func=7 # alt3

    Ich dachte bis jetzt es sei eine alternative:

    Code
    dtoverlay=uart0,txd0_pin=32,rxd0_pin=33
    oder
    dtoverlay=uart0,pin_func=7

    was aber auch nicht funktionierte.

    Mit dem oberen Befehl funktioniert die UART0 Ausgabe auf GPIO32 und GPIO33.

    Weiterhin wird aber der UART0 auch auf GPIO 14 und GPIO 15 ausgegeben, was ich gerne noch unterbinden möchte.

    Schonmal vielen Dank für die sehr schnelle Hilfe bis jetzt! :danke_ATDE:

    Danke auch an fred0815, die Zusammenfassung hilft bestimmt einigen weiter die auch an dem Problem kämpfen.

    Hier sind die verfügbaren dtoverlays zu finden: kompilierte overlays und die quell overlays

    Dies hat mir schon sehr oft weitergeholfen.

    Anmerkung:

    In dem verlinkten Thread wird der Workaround verwendet dass GPIO 14 und GPIO 15 einfach von Hand als Input gesetzt werden. So wird eine Doppelbelegung der GPIO´s verhindert und nur noch auf den gewünschten GPIO´s 32 und 33 UART0 ausgegeben.

    Code
    raspi-gpio set 14 ip
    raspi-gpio set 15 ip

    Edited 3 times, last by wudo94 (November 5, 2018 at 3:41 PM).

  • Quote

    Da war noch was mit systemd, aber da kenne ich mich nicht aus, ob und was es bewirkt.

    Code
    sudo systemctl disable hciuart

    Stimmt, das hatte ich auch noch versucht, hat aber leider auch nicht geholfen.

    Dieser Workaround ist bis jetzt das Einzige was mir geholfen hat:

    Quote

    Anmerkung:

    In dem verlinkten Thread wird der Workaround verwendet dass GPIO 14 und GPIO 15 einfach von Hand als Input gesetzt werden. So wird eine Doppelbelegung der GPIO´s verhindert und nur noch auf den gewünschten GPIO´s 32 und 33 UART0 ausgegeben.

    Code
    raspi-gpio set 14 ip
    raspi-gpio set 15 ip

    Ist nicht schön, funktionniert aber.

    Falls dafür noch jmd. eine Lösung hat wäre es perfekt.8)


    Anmerkung:

    PhilE schrieb:

    Den Overlay der PhilE geschrieben hat funktioniert. Vielleicht löst sich das Problem von alleine wenn Er den Overlay in den Kernel noch integriert^^

    Edited once, last by wudo94 (November 6, 2018 at 9:00 AM).

  • Lösung und Threadabschluss:

    Dank PhilE ist nun ein Patch für die UART0-Schnittstelle in den folgenden Versionen des Kernels enthalten.

    Mit dem Patch kann durch einfügen von folgendem in die /boot/config.txt die UART0-Schnittstelle umgestellt werden:

    Code
    dtoverlay=uart0,txd0_pin=32,rxd0_pin=33,pin_func=7 # alt3

    oder

    Code
    dtoverlay=uart0,txd0_pin=36,rxd0_pin=37,pin_func=6 # alt2
    Quote
    Do you push this patch into the kernel?

    No I hadn't, but I have now.

    Can you post the patched uart0-overlay.dts here?

    Better yet, you can get it here: https://github.com/raspberrypi/linux/bl ... verlay.dts

    And why do we have to write pin_func=7 on UART0... and not on UART1... ?

    Because UART1 is always on Alt5 (pin function 2) in all three sets of GPIOs, whereas UART0 is on either Alt0+Alt3 (GPIO14-17), Alt3 (GPIOs 30-33) or Alt2 (GPIOs 36-39).

    Quelle: https://www.raspberrypi.org/forums/viewtop…388713#p1389305

    Vielen Dank für die schnelle und erfolgreiche Hilfe von allen Seiten!:danke_ATDE:

    Gruß Dominik

    Edited 3 times, last by wudo94 (November 8, 2018 at 10:25 AM).

  • Mit dem Patch kann durch einfügen von folgendem in die /boot/config.txt die UART0-Schnittstelle umgestellt werden:

    Heisst das, man kann damit auch den Uart0 auf beliebige andere normale GPIOs (nicht von I2C, SPI belegt) umleiten? Kann man so auch mehrere Uarts bereitstellen?

  • Leider nein. In diesem Fall kann UART 0 nur von GPIO 14/15 auf entweder GPIO 32/33 oder GPIO 36/37 umgestellt werden. So ist es in den Alternate Functions des Compute-Modules hinterlegt: 9.1.1 GPIO Alternate Functions

    Das Compute-Module besitzt hardwaremäßig nur 2 UART-Schnittstellen: UART0 (miniUART) und UART1 die auch nur an den GPIOs ausgegeben werden können, die in den Alternate Functions beschrieben sind.

    Man kann bestimmt Softwareseitig UART-Schnittstellen umsetzen die an beliebigen GPIOs ausgegeben werden können, jedoch weiß ich nicht sicher wie es mit den Laufzeiten hinhaut, wobei UART auch keine hochgeschwindigkeits-Schnittstelle ist und es somit schon funktionieren sollte.

    Alternativ könnte man USB zu Seriell-Wandler verwenden, um mehr UART-Schnittstellen zur Verfügung zu haben.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!