简短的一般性问题
我在内核为 4.9 的 Beaglebone Black 上运行 Debian 9 (Stretch)。我尝试按照网上找到的说明进行操作,但到目前为止似乎无法配置其 UART 设备。如何配置我的设备?如何调试/排除我的配置问题?如何验证我的配置是否正确?
又长又详细的问题
总的来说,我对嵌入式 Linux,尤其是 Beaglebone 非常陌生。我按照此处给出的说明进行操作:
我下载了最新的“Stretch IoT(无图形桌面)用于 BeagleBone 和 PocketBeagle 通过 microSD 卡”图像(具体来说骨-debian-9.3-iot-armhf-2018-03-05-4gb.img) 来自最新图片页面并从 SD 卡刷新 Beagleboard。安装后,我可以通过串行转 USB 电缆从 Linux 桌面访问 Beaglebone - 方式类似于以下文章中描述的方式:
我能够screen
成功使用以下命令:
screen /dev/ttyUSB0 115200
我还可以使用 Micro-USB 转 USB 电缆通过 SSH 连接:
ssh [email protected]
连接到 Beaglebone 后,我验证了我的内核版本是Linux beaglebone 4.9.82-ti-r102
.然后我阅读了几篇有关 Beaglebone UART 配置的文章,包括以下内容:
我的结论是(一般来说)有几个不同的配置文件需要检查,具体取决于操作系统和内核版本。其中包括以下内容:
/boot/uEnv.txt
/boot/uboot/uEnv.txt
/etc/default/capemgr
/media/BEAGLEBONE/uEnv.txt
还提到了几个设备文件,例如:
- /sys/devices/bone_capemgr.*/slots
我尝试将以下每一行添加到每个不同的uEnv.txt
文件中:
cape_enable=capemgr.enable_partno=BB-UART1,BB-UART2,BB-UART4,BB-UART5
optargs=capemgr.enable_partno=BB-UART1,BB-UART2,BB-UART3,BB-UART5
我还尝试将以下行添加到/etc/default/capemgr
:
CAPE=BB-SPI-01,BB-UART1,BB-UART2,BB-UART4
重新启动后,我使用以下命令检查 UART 设备是否出现:
ls -l /dev/ttyO*
不幸的是我得到了以下结果(意想不到的结果):
debian@beaglebone:~$ ls -l /dev/ttyO*
lrwxrwxrwx 1 root root 5 Jan 1 00:00 /dev/ttyO0 -> ttyS0
注意:我不关心ttyO0
,而是关心ttyO1, ..., ttyO5
。
我还尝试了其他一些事情,但是(为了节省时间和空间)除非有要求,否则我不会描述每一次尝试。
我在这里做错了什么?启用 UART 设备的正确方法是什么?
答案1
以下适用于内核 4.14 的 Debian 9.9(也适用于 Debian 8.3,不适用于 Debian 9.3)。
启动后,您将看到 /dev/ttyO1,O2,O4 文件,但只有将引脚设置为正确的 pinmux 后,它们才会工作:
#ttyO1:
config-pin P9_24 uart
config-pin P9_26 uart
#ttyO2:
config-pin P9_21 uart
config-pin P9_22 uart
#ttyO4:
config-pin P9_11 uart
config-pin P9_13 uart
每次重新启动时都必须执行该步骤。它属于某种启动脚本。
您可以通过简单的环回测试来确认 UART 是否正常工作,例如 UART4:
在 P9_11 和 P9_13 之间放置一根电线
屏幕 /dev/ttyO4
您在窗口中输入的文本应该会显示,断开电线,进一步的输入将不会显示。 UART 工作。
答案2
我可以使用以下方法为 Debian 10 提供担保:
我能够在启动时自动启用所有 4.5 UART。与 Debian 9 及更早版本不同,它uEnv.txt
存在于/boot/
.
备份此文件。
使用权限编辑此文件
sudo
:
$ sudo nano uEnv.txt
启用所有 4.5 UART 的最终版本应如下所示:
#Docs: http://elinux.org/Beagleboard:U-boot_partitioning_layout_2.0
uname_r=4.19.94-ti-r42
#uuid=
#dtb=
###U-Boot Overlays###
###Documentation: http://elinux.org/Beagleboard:BeagleBoneBlack_Debian#U-Boot_Overlays
###Master Enable
enable_uboot_overlays=1
# UART 1
uboot_overlay_addr0=/lib/firmware/BB-UART1-00A0.dtbo
# UART 2
uboot_overlay_addr1=/lib/firmware/BB-UART2-00A0.dtbo
# UART 4
uboot_overlay_addr2=/lib/firmware/BB-UART4-00A0.dtbo
# UART 5
uboot_overlay_addr3=/lib/firmware/BB-UART5-00A0.dtbo
# UART 3 (only TX). Note that in "uboot_overlay_addrX", the X need not be = UART id
uboot_overlay_addr4=/lib/firmware/BB-UART3-00A0.dtbo
###
###Overide capes with eeprom
#uboot_overlay_addr0=/lib/firmware/<file0>.dtbo
#uboot_overlay_addr1=/lib/firmware/<file1>.dtbo
#uboot_overlay_addr2=/lib/firmware/<file2>.dtbo
#uboot_overlay_addr3=/lib/firmware/<file3>.dtbo
###
###Additional custom capes
#uboot_overlay_addr4=/lib/firmware/<file4>.dtbo
#uboot_overlay_addr5=/lib/firmware/<file5>.dtbo
#uboot_overlay_addr6=/lib/firmware/<file6>.dtbo
#uboot_overlay_addr7=/lib/firmware/<file7>.dtbo
###
###Custom Cape
#dtb_overlay=/lib/firmware/<file8>.dtbo
###
###Disable auto loading of virtual capes (emmc/video/wireless/adc)
#disable_uboot_overlay_emmc=1
#disable_uboot_overlay_video=1
#disable_uboot_overlay_audio=1
#disable_uboot_overlay_wireless=1
#disable_uboot_overlay_adc=1
###
###PRUSS OPTIONS
###pru_rproc (4.14.x-ti kernel)
#uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-14-TI-00A0.dtbo
###pru_rproc (4.19.x-ti kernel)
uboot_overlay_pru=/lib/firmware/AM335X-PRU-RPROC-4-19-TI-00A0.dtbo
###pru_uio (4.14.x-ti, 4.19.x-ti & mainline/bone kernel)
#uboot_overlay_pru=/lib/firmware/AM335X-PRU-UIO-00A0.dtbo
###
###Cape Universal Enable
enable_uboot_cape_universal=1
###
###Debug: disable uboot autoload of Cape
#disable_uboot_overlay_addr0=1
#disable_uboot_overlay_addr1=1
#disable_uboot_overlay_addr2=1
#disable_uboot_overlay_addr3=1
###
###U-Boot fdt tweaks... (60000 = 384KB)
#uboot_fdt_buffer=0x60000
###U-Boot Overlays###
cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet
#In the event of edid real failures, uncomment this next line:
#cmdline=coherent_pool=1M net.ifnames=0 lpj=1990656 rng_core.default_quality=100 quiet video=HDMI-A-1:1024x768@60e
##enable Generic eMMC Flasher:
##make sure, these tools are installed: dosfstools rsync
#cmdline=init=/opt/scripts/tools/eMMC/init-eMMC-flasher-v3.sh
#cape_enable=capemgr.enable_partno=BB-UART1,BB-UART2,BB-UART4,BB-UART5
- 保存并重新启动。享受 !
答案3
在尝试了“长而详细的问题”中列出的所有内容后,我仍然无法初始化我的 UART 端口。我的问题最终是,当我在外部 SD 卡上运行 Debian 9 映像时,我的 BeagleBone Black (BBB) 预装了 Debian 8。我不是启动过程或 BeagleBones 方面的专家,但根据我的发现,BeagleBone 优先从其内部 eMMMC 启动,而不是从 SD 卡启动。所以我假设我的问题是我的 BBB 是从预烧的 Debian 8 映像启动的,所以我的 UART 通道都没有被初始化。初始化后,它会切换到 SD 卡映像。我认为它切换只是因为我会通过调试端口检查它的版本,它会说 Debian 9 并且我也能够通过调试端口运行我的 SD 卡 python 脚本。
我通过删除 eMMC 分区的第一个兆字节(有效删除 Debian 8)解决了这个问题,这样引导加载程序将跳过 eMMC 并直接从 SD 卡引导。这使得所有通道初始化都可以在正确的 Debian 9 映像上进行。