UART4 stopped working: did not get pins for uart4 error: -19

Hi,
On my BBB I have a Serial RS-232 BeagleBone Cape (BB_BONE_SERL-03 Rev A1) that I have jumpered for UART4. It works under Angstrom and was recently working under Ubuntu 12.04 LTS. Now it is not working under Ubuntu. There seems to be pin error which may be preventing it from loading. I don’t know if this was caused by some configuration changes or not. I haven’t been able to figure out what is causing the conflict.

How can I find and fix this problem?

Thanks for your help.

Phil

Add to your bootargs:
capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN

Thanks Robert,

I forgot to mention the specifics of my attempts to disable HDMI. I modified /boot/uboot/uEnv.txt to disable HDMI by changing the optargs line:

ubuntu@ubuntu-armhf:~$ cat /boot/uboot/uEnv.txt

optargs=fixrtc capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN

loadfdt=ext4load mmc ${mmcdev}:2 ${fdtaddr} /boot/dtbs/${fdtfile}

loaduimage=mw.l 4804c134 fe1fffff; if ext4load mmc 0:2 ${loadaddr} /boot/zImage; then mw.l 4804c194 01200000; echo Booting from external microSD…; setenv mmcdev 0; else setenv mmcdev 1; if test $mmc0 = 1; then setenv mmcroot /dev/mmcblk1p2 rw; fi; ext4load mmc 1:2 ${loadaddr} /boot/zImage && mw.l 4804c194 00c00000; echo Booting from internal eMMC…; fi

mmcboot=run mmcargs; bootz ${loadaddr} - ${fdtaddr}

uenvcmd=i2c mw 0x24 1 0x3e; run findfdt; if test $board_name = A335BNLT; then setenv mmcdev 1; mmc dev ${mmcdev}; if mmc rescan; then setenv mmc1 1; else setenv mmc1 0; fi; fi; setenv mmcdev 0; mmc dev ${mmcdev}; if mmc rescan; then setenv mmc0 1; else setenv mmc0 0; fi; run loaduimage && run loadfdt && run mmcboot

ubuntu@ubuntu-armhf:~$ cat /sys/devices/bone_capemgr*/slots

1: 55:PF—

2: 56:PF—

3: 57:PF—

4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G

5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI

UART4 still doesn’t work and the ‘slots’ still show an HDMI entry. Is this what you are suggesting or did I miss something? Any ideas why it doesn’t work?

Phil

Hi,
On my BBB I have a Serial RS-232 BeagleBone Cape (BB_BONE_SERL-03 Rev A1) that I have jumpered for UART4. It works under Angstrom and was recently working under Ubuntu 12.04 LTS. Now it is not working under Ubuntu. There seems to be pin error which may be preventing it from loading. I don’t know if this was caused by some configuration changes or not. I haven’t been able to figure out what is causing the conflict.

How can I find and fix this problem?

Thanks for your help.

Phil

Background Information:

  1. This is not a hardware problem. I have tested the same cape board under Angstrom and it works (a remote putty serial session receives the transmission); however, nothing is received from Ubuntu:

root@ubuntu-armhf:/home/ubuntu# echo hello > /dev/ttyO4

Note: I also tested UART4 using another micro-cape board that was working earlier - it also failed.

  1. Some time ago I replaced /boot/dtbs/am335x-boneblack.dtb (decompiled, modified, recompiled .dts) to enable UART4 (/dev/ttyO4):


serial@481a8000 {
compatible = “ti,omap3-uart”;
ti,hwmods = “uart5”;
clock-frequency = <0x2dc6c00>;
reg = <0x481a8000 0x2000>;
interrupts = <0x2d>;
status = “okay”;
linux,phandle = <0x1b>;
phandle = <0x1b>;
};

This was working under Angstrom and Ubuntu.

  1. I tried restoring the original /boot/dtbs/am335x-boneblack.dtb and used a .dtbo overlay for UART 4 - it still didn’t work.

  2. I scanned dmesg for config errors:

ubuntu@ubuntu-armhf:~$ dmesg | grep -iE “uart|tty|error:”

[ 0.000000] Kernel command line: console=ttyO0,115200n8 fixrtc root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait

[ 0.507160] omap_uart 44e09000.serial: did not get pins for uart0 error: -19

[ 0.507505] 44e09000.serial: ttyO0 at MMIO 0x44e09000 (irq = 88) is a OMAP UART0

[ 1.218231] console [ttyO0] enabled

[ 1.222660] omap_uart 481a8000.serial: did not get pins for uart4 error: -19

[ 1.230408] 481a8000.serial: ttyO4 at MMIO 0x481a8000 (irq = 61) is a OMAP UART4

ubuntu@ubuntu-armhf:~$ dmesg | grep capemgr

[ 1.314500] bone-capemgr bone_capemgr.9: Baseboard: ‘A335BNLT,0A5C,2513BBBK0965’

[ 1.322289] bone-capemgr bone_capemgr.9: compatible-baseboard=ti,beaglebone-black

[ 1.354316] bone-capemgr bone_capemgr.9: slot #0: ‘BeagleBone RS232 CAPE,00A1,Beagleboardtoys,BB-BONE-SERL-03’

[ 1.392362] bone-capemgr bone_capemgr.9: slot #1: No cape found

[ 1.429467] bone-capemgr bone_capemgr.9: slot #2: No cape found

[ 1.466577] bone-capemgr bone_capemgr.9: slot #3: No cape found

[ 1.472829] bone-capemgr bone_capemgr.9: slot #4: specific override

[ 1.479431] bone-capemgr bone_capemgr.9: bone: Using override eeprom data at slot 4

[ 1.487466] bone-capemgr bone_capemgr.9: slot #4: ‘Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G’

[ 1.497595] bone-capemgr bone_capemgr.9: slot #5: specific override

[ 1.504197] bone-capemgr bone_capemgr.9: bone: Using override eeprom data at slot 5

[ 1.512234] bone-capemgr bone_capemgr.9: slot #5: ‘Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI’

[ 1.522697] bone-capemgr bone_capemgr.9: loader: before slot-0 BB-BONE-SERL-03:00A1 (prio 0)

[ 1.531582] bone-capemgr bone_capemgr.9: loader: check slot-0 BB-BONE-SERL-03:00A1 (prio 0)

[ 1.540465] bone-capemgr bone_capemgr.9: loader: before slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)

[ 1.549338] bone-capemgr bone_capemgr.9: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)

[ 1.558137] bone-capemgr bone_capemgr.9: initialized OK.

[ 1.563745] bone-capemgr bone_capemgr.9: loader: before slot-5 BB-BONELT-HDMI:00A0 (prio 1)

[ 1.572511] bone-capemgr bone_capemgr.9: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)

[ 1.594787] bone-capemgr bone_capemgr.9: loader: after slot-0 BB-BONE-SERL-03:00A1 (prio 0)

[ 1.603587] bone-capemgr bone_capemgr.9: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)

[ 1.618764] bone-capemgr bone_capemgr.9: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)

[ 1.633551] bone-capemgr bone_capemgr.9: slot #0: Requesting part number/version based 'BB-BONE-SERL-03-00A1.dtbo

[ 1.650222] bone-capemgr bone_capemgr.9: slot #0: Requesting firmware ‘BB-BONE-SERL-03-00A1.dtbo’ for board-name ‘BeagleBone RS232 CAPE’, version ‘00A1’

[ 61.751962] bone-capemgr bone_capemgr.9: failed to load firmware ‘BB-BONE-SERL-03-00A1.dtbo’

[ 61.760833] bone-capemgr bone_capemgr.9: loader: failed to load slot-0 BB-BONE-SERL-03:00A1 (prio 0)

[ 61.772418] bone-capemgr bone_capemgr.9: loader: check slot-5 BB-BONELT-HDMI:00A0 (prio 1)

[ 61.772447] bone-capemgr bone_capemgr.9: loader: after slot-5 BB-BONELT-HDMI:00A0 (prio 1)

[ 61.772475] bone-capemgr bone_capemgr.9: slot #5: Requesting firmware ‘cape-boneblack-hdmi-00A0.dtbo’ for board-name ‘Bone-Black-HDMI’, version ‘00A0’

[ 61.772500] bone-capemgr bone_capemgr.9: slot #5: dtbo ‘cape-boneblack-hdmi-00A0.dtbo’ loaded; converting to live tree

[ 61.772829] bone-capemgr bone_capemgr.9: slot #5: #4 overlays

[ 61.773958] bone-capemgr bone_capemgr.9: loader: check slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)

[ 61.773982] bone-capemgr bone_capemgr.9: loader: after slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)

[ 61.774012] bone-capemgr bone_capemgr.9: slot #4: Requesting firmware ‘cape-bone-2g-emmc1.dtbo’ for board-name ‘Bone-LT-eMMC-2G’, version ‘00A0’

[ 61.774028] bone-capemgr bone_capemgr.9: slot #4: dtbo ‘cape-bone-2g-emmc1.dtbo’ loaded; converting to live tree

[ 61.774534] bone-capemgr bone_capemgr.9: slot #4: #2 overlays

[ 61.774704] bone-capemgr bone_capemgr.9: slot #4: Applied #2 overlays.

[ 61.774719] bone-capemgr bone_capemgr.9: loader: done slot-4 BB-BONE-EMMC-2G:00A0 (prio 1)

[ 61.964834] bone-capemgr bone_capemgr.9: slot #5: Applied #4 overlays.

[ 61.964861] bone-capemgr bone_capemgr.9: loader: done slot-5 BB-BONELT-HDMI:00A0 (prio 1)

  1. I checked the /dev/ttyO4 settings and made sure they matched the remote putty settings.

ubuntu@ubuntu-armhf:~$ stty -F /dev/ttyO4

speed 9600 baud; line = 0;

-brkint -imaxbel

  1. I checked the current capemgr slots:

ubuntu@ubuntu-armhf:~$ cat /sys/devices/bone_capemgr.*/slots

1: 55:PF—

2: 56:PF—

3: 57:PF—

4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G

5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI

  1. I checked for any running processes that might be locking the device - none were seen:

ubuntu@ubuntu-armhf:~$ ps waux | grep tty

root 484 0.0 0.1 3364 708 tty4 Ss+ 19:07 0:00 /sbin/getty -8 38400 tty4

root 486 0.0 0.1 3364 708 tty5 Ss+ 19:07 0:00 /sbin/getty -8 38400 tty5

root 491 0.0 0.1 3364 708 tty2 Ss+ 19:07 0:00 /sbin/getty -8 38400 tty2

root 494 0.0 0.1 3364 708 tty3 Ss+ 19:07 0:00 /sbin/getty -8 38400 tty3

root 497 0.0 0.1 3364 708 tty6 Ss+ 19:07 0:00 /sbin/getty -8 38400 tty6

root 573 0.0 0.1 3364 708 tty1 Ss+ 19:07 0:00 /sbin/getty -8 38400 tty1

root 574 0.0 0.1 1612 636 ttyO0 Ss+ 19:07 0:00 /sbin/getty 115200 ttyO0

ubuntu 772 0.0 0.1 3116 712 pts/0 S+ 19:24 0:00 grep --color=auto tty

  1. I tried to disable the HDMI interface but couldn’t find a way that would work. I tried disabling the HDMI port by changing the optargs line in /boot/uboot/uEnv.txt to use capemgr.disable_partno as follows:

ubuntu@ubuntu-armhf:~$ cat /boot/uboot/uEnv.txt
optargs=fixrtc capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
loadfdt=ext4load mmc ${mmcdev}:2 ${fdtaddr} /boot/dtbs/${fdtfile}
loaduimage=mw.l 4804c134 fe1fffff; if ext4load mmc 0:2 ${loadaddr} /boot/zImage; then mw.l 4804c194 01200000; echo Booting from external microSD…; setenv mmcdev 0; else setenv mmcdev 1; if test $mmc0 = 1; then setenv mmcroot /dev/mmcblk1p2 rw; fi; ext4load mmc 1:2 ${loadaddr} /boot/zImage && mw.l 4804c194 00c00000; echo Booting from internal eMMC…; fi
mmcboot=run mmcargs; bootz ${loadaddr} - ${fdtaddr}
uenvcmd=i2c mw 0x24 1 0x3e; run findfdt; if test $board_name = A335BNLT; then setenv mmcdev 1; mmc dev ${mmcdev}; if mmc rescan; then setenv mmc1 1; else setenv mmc1 0; fi; fi; setenv mmcdev 0; mmc dev ${mmcdev}; if mmc rescan; then setenv mmc0 1; else setenv mmc0 0; fi; run loaduimage && run loadfdt && run mmcboot

After re-booting the HDMI entry still appeared in the capemgr slots:

ubuntu@ubuntu-armhf:~$ cat /sys/devices/bone_capemgr*/slots

1: 55:PF—

2: 56:PF—

3: 57:PF—

4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G

5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI

So this doesn’t appear to work.

ubuntu@ubuntu-armhf:~$ cat /boot/uboot/uEnv.txt
optargs=fixrtc capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
loadfdt=ext4load mmc ${mmcdev}:2 ${fdtaddr} /boot/dtbs/${fdtfile}
loaduimage=mw.l 4804c134 fe1fffff; if ext4load mmc 0:2 ${loadaddr}
/boot/zImage; then mw.l 4804c194 01200000; echo Booting from external
microSD...; setenv mmcdev 0; else setenv mmcdev 1; if test $mmc0 = 1; then
setenv mmcroot /dev/mmcblk1p2 rw; fi; ext4load mmc 1:2 ${loadaddr}
/boot/zImage && mw.l 4804c194 00c00000; echo Booting from internal eMMC...;
fi
mmcboot=run mmcargs; bootz ${loadaddr} - ${fdtaddr}
uenvcmd=i2c mw 0x24 1 0x3e; run findfdt; if test $board_name = A335BNLT;
then setenv mmcdev 1; mmc dev ${mmcdev}; if mmc rescan; then setenv mmc1 1;
else setenv mmc1 0; fi; fi; setenv mmcdev 0; mmc dev ${mmcdev}; if mmc
rescan; then setenv mmc0 1; else setenv mmc0 0; fi; run loaduimage && run
loadfdt && run mmcboot

   After re-booting the HDMI entry still appeared in the capemgr slots:

ubuntu@ubuntu-armhf:~$ cat /sys/devices/bone_capemgr*/slots
1: 55:PF---
2: 56:PF---
3: 57:PF---
4: ff:P-O-L Bone-LT-eMMC-2G,00A0,Texas Instrument,BB-BONE-EMMC-2G
5: ff:P-O-- Bone-Black-HDMI,00A0,Texas Instrument,BB-BONELT-HDMI

   So this doesn't appear to work.

Is it correctly passed to the kernel? verify with:

cat /proc/cmdline

Regards

Robert,

Yes, it is correctly passed to the kernel:

ubuntu@ubuntu-armhf:~$ cat /proc/cmdline

console=ttyO0,115200n8 fixrtc capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN root=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait

Best regards,
Phil

Hi again,
I decided to look through the /proc/iomem pseudo-file to see if the mapping looked reasonable. I believe the kernel may be corrupted since there is garbage in the map for the usb:

ubuntu@arm-hf:~$ cat /proc/iomem

44e07000-44e07fff : /ocp/gpio@44e07000

44e07000-44e07fff : 44e07000.gpio

44e09000-44e0afff : /ocp/serial@44e09000

44e09000-44e0afff : omap_uart

44e0b000-44e0bfff : /ocp/i2c@44e0b000

44e0b000-44e0bfff : /ocp/i2c@44e0b000

??@??F?e10623 : @

44e10628-44e1062b : /ocp/usb@47400000

44e10800-44e10a37 : /pinmux@44e10800

44e10800-44e10a37 : pinctrl-single

On Angstrom (where everything is working) I see:

root@beaglebone:/proc# more iomem

44e07000-44e07fff : /ocp/gpio@44e07000

44e07000-44e07fff : 44e07000.gpio

44e09000-44e0afff : /ocp/serial@44e09000

44e09000-44e0afff : omap_uart

44e0b000-44e0bfff : /ocp/i2c@44e0b000

44e0b000-44e0bfff : /ocp/i2c@44e0b000

44e10620-44e10623 : 47400000.usb

44e10628-44e1062b : /ocp/usb@47400000

44e10800-44e10a37 : /pinmux@44e10800

44e10800-44e10a37 : pinctrl-single

Do you have any suggestions for how to clean up the kernel in this case?

Thanks,
Phil

To resolve the issue, I have added the proper pinctrl signals for the uart, I did this for uart0 & uart1

uart1_pins: pinmux_uart1_pins {
pinctrl-single,pins = <
0x170 0x30 /* (E15) uart0_rxd.uart0_rxd, PIN_INPUT | MUX_MODE0 /
0x174 0x00 /
(E16) uart0_txd.uart0_txd, PIN_OUTPUT | MUX_MODE0 */

;
};

uart2_pins: pinmux_uart2_pins {
pinctrl-single,pins = <
0x180 0x30 /* (D16) uart1_rxd.uart1_rxd, PIN_INPUT | MUX_MODE0 /
0x184 0x00 /
(D15) uart1_txd.uart1_txd, PIN_OUTPUT | MUX_MODE0 */

;
};

This worked for me

uart1: serial@44e09000 {
status = “okay”;
pinctrl-names = “default”;
pinctrl-0 = <&uart1_pins>;
};

uart2: serial@48022000 {
status = “okay”;
pinctrl-names = “default”;
pinctrl-0 = <&uart2_pins>;
};