我正在使用说明here.
在我的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。
有人知道为什么我无法编辑文件吗?如果不可能,是否有解决方法?
答案 0 :(得分:2)
在试图将ILI9340C显示器移植到Beaglebone Black时,我也遇到了这种困境。 /dev/devices/bone_capemgr.*
的工作方式是,您回显到其slots
目录的任何内容,并搜索该设备的设备树覆盖,这是Linux Kernel 3.0及更高版本中的新功能。对于任何不知道的人(我花了很长时间才发现这一点)Device Trees基本上是一个告诉Linux如何处理设备的驱动程序,但它不是包含任何代码,而是一个配置文件,本身就是告诉Linux将什么放在哪里以便与设备通信,以及期待什么作为回报。话虽这么说,BB-SPIx-01
是一个已编译的设备树文件,/lib/firmware/
中的.dts指向SPI设备,并告诉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
未使用。因此,为了使用它,您所要做的就是在userland中启用它。要做到这一点,(并且你已经想到了这一点,但对于其他人)在命令行输入echo BB-SPI0-01 > /sys/devices/bone_capemgr.*/slots
,然后为了确保spidev正在运行,请以root身份键入modprobe spidev
。现在,要验证,请键入ls /dev | grep spi
并查看出现的情况。 /dev/spidevX.Y
是您的SPI总线,对我来说是/dev/spidev1.0
。
对不起,我真的很啰嗦,但到目前为止,我的研究结果已经达到了一个位置,希望能帮助别人。
如果您有任何疑问,请随时询问!
答案 1 :(得分:1)
对于那些好奇的人,虽然我还没有找到确切的答案,但我确实找到了更多信息。
除非hdmi接口已关闭,否则无法启用beaglebone black上的SPI1接口,我还没有这样做。我现在改用SPI0接口。有趣的是,如果使用BB-SPI0-01
而不是BB-SPI1-01
,则相同的命令有效。因此,有问题的错误可能不是来自基本命令,而是系统响应命令(由于与hdmi冲突而无法分配所请求的资源)。
虽然我没有关闭hdmi来测试SPI1,但我只能假设我的错误会消失。
答案 2 :(得分:0)
可能是因为您尝试使用echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots
一次访问多个文件?
尝试选择slots
文件的单一路径,看看是否有效
答案 3 :(得分: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
答案 4 :(得分: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”。