Beaglebone Linux:向文件追加一行的问题

时间:2013-07-17 18:55:29

标签: linux spi angstrom-linux

我正在使用说明here.

在我的beaglebone black(Angstrom发行版)上启用spi

我正处于需要将BB-SPI1-01添加到/sys/devices/bone_capemgr.*/slots以启用驱动程序的位置。

发出命令echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slotsecho BB-SPI1-01 >> /sys/devices/bone_capemgr.*/slots会产生错误echo: Write error: file exists

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

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

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

5 个答案:

答案 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”。