0

我正在使用此处的说明在我的 beaglebone black(Angstrom 发行版)上启用 spi。

我现在需要添加 BB-SPI1-01/sys/devices/bone_capemgr.*/slots来启用驱动程序。

发出命令,echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots或者echo BB-SPI1-01 >> /sys/devices/bone_capemgr.*/slots,但是,产生错误echo: Write error: file exists

尝试使用 nano 进行编辑也失败了。我可以打开文件并编辑它,但是当我保存它时Error writing slots: no such file or directory

我已将文件的权限设置为 777。

有人知道为什么我不能编辑文件吗?如果不可能,是否有解决方法?

4

5 回答 5

2

在尝试将 ILI9340C 显示内容移植到 Beaglebone Black 时,我也曾与这种困境作斗争。工作方式/dev/devices/bone_capemgr.*是任何你回显到其slots目录的东西,它都会搜索该设备的设备树覆盖,这是 Linux Kernel 3.0 及更高版本中的新事物。对于任何不知道的人(我花了很长时间才找到这个)设备树基本上是一个告诉 Linux 如何处理设备的驱动程序,但它们不包含任何代码,它们本身只是一个配置文件,告诉 Linux 将什么放在哪里以便与设备通信,以及期望得到什么回报。话虽这么说,BB-SPIx-01是一个编译的设备树文件,一个指向 SPI 设备的 .dts /lib/firmware/,并告诉spidev如何处理它。

BB-SPI1-01碰巧已经连接到 HDMI 端口用于某些音频(我认为),因此,除非您完全禁用 HDMI,否则SPI1始终被 HDMI 成帧器捆绑。这解释了为什么写入BB-SPI1-01失败/sys/devices/bone_capemgr.*/slots。这是一个特殊文件,当您写入它时,内核进程会读取您的输入并继续尝试在其他地方创建一个“设备”文件,并且由于BB-SPI1-01已经启用,该文件已经存在,因此处理的内核进程这些东西会返回一个错误并通过任何启动它的进程来传递它,在这种情况下,你,用户,输入echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots.

从好的方面来说,SPI0没有使用。因此,为了使用它,您所要做的就是在用户空间中启用它。要做到这一点,(你已经知道了,但对于其他人来说)echo BB-SPI0-01 > /sys/devices/bone_capemgr.*/slots在命令行中键入,然后只是为了确保 spidev 正在运行,modprobe spidev以 root 身份键入。现在,要验证,键入ls /dev | grep spi并查看出现了什么。/dev/spidevX.Y是你的 SPI 总线,对我来说是/dev/spidev1.0

很抱歉,这真的很啰嗦,但我将迄今为止的研究结束于一个地方,希望它能对某人有所帮助。

如果您有任何问题,请随时提问!

于 2014-01-09T02:56:07.450 回答
1

对于那些好奇的人,虽然我还没有找到确切的答案,但我确实找到了更多信息。

beaglebone black 上的 SPI1 接口无法启用,除非 hdmi 接口已关闭,我没有这样做。我现在改为使用 SPI0 接口。有趣的是,如果BB-SPI0-01使用相同的命令而不是BB-SPI1-01. 因此,有问题的错误可能不是来自基本命令,而是系统响应命令(由于与 hdmi 冲突而无法分配请求的资源)。

虽然我没有在关闭 hdmi 的情况下测试 SPI1,但我只能假设我的错误会消失。

于 2013-08-20T18:01:46.773 回答
0

可能是因为您尝试使用 一次访问多个文件echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots

尝试选择slots文件的单个路径,看看是否有效

于 2013-07-18T03:20:06.227 回答
0

正如Mixaz在评论中提到的,真正的错误在dmesg输出中发现;“没有这样的文件或目录”是一条红鲱鱼,甚至strace没有提供任何关于真正问题的线索。就我而言,我发现:

[26858.517893] bone_capemgr bone_capemgr: slot #5: override
[26858.517937] bone_capemgr bone_capemgr: Using override eeprom data at slot 5 
[26858.517986] bone_capemgr bone_capemgr: slot #5: 'Override Board Name,00A0,Override Manuf,jc_gpio_test'
[26924.230357] bone_capemgr bone_capemgr: part_number 'jc_gpio_test', version 'N/A'

从那我猜它不喜欢“0000”作为版本号,改为“00A0”并重新编译,然后它工作了。

这是我为帮助自动化过程而编写的 Makefile,以防万一。

%.install: %-00A0.dtbo
    cp -f $< /lib/firmware
    echo $* > /sys/devices/platform/bone_capemgr/slots
%-00A0.dtbo: %.dts
    dtc -O dtb -o $@ -b 0 -@ $<

将其用作:make jc_gpio_test.install,假设您的.dts文件名为jc_gpio_test.dts.


事实证明,我的猜测可能是错误的。更可能修复它的更改是将-00A0零件添加到dtbo文件中。显然,插槽加载程序需要“dash-versionnumber”。

于 2017-07-12T01:44:49.490 回答
0

根据 PyroAVR 的回答,这里是具体的解决方案。您需要禁用 HDMI,这可以通过编辑以下文件轻松完成:/boot/uEnv.txt

您可以通过以 root 身份运行以下命令来取消注释导致 HDMI 被禁用的行:

sed -i.bck '/cape_disable=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN$/ s/^#//' /boot/uEnv.txt
于 2015-09-23T13:27:57.697 回答