Linux 加载Beaglebone Black内核4.4.17的设备树覆盖并加载PRU.bin

Linux 加载Beaglebone Black内核4.4.17的设备树覆盖并加载PRU.bin,linux,embedded-linux,beagleboneblack,device-tree,Linux,Embedded Linux,Beagleboneblack,Device Tree,我在BBB上加载设备树覆盖时遇到问题。我正在运行DebianLinux8(jessie),内核4.4.17-bone13 操作系统没有安装cape manager,所以我从这里得到了它。。。 我按照指示进行安装,一切似乎都很顺利。现在我已尝试加载我的设备树覆盖 root@beaglebone:~# cd /lib/firmware root@beaglebone:/lib/firmware# dtc -O dtb -I dts -o /lib/firmware/PRU-GPIO-EXAMP

我在BBB上加载设备树覆盖时遇到问题。我正在运行DebianLinux8(jessie),内核4.4.17-bone13

操作系统没有安装cape manager,所以我从这里得到了它。。。

我按照指示进行安装,一切似乎都很顺利。现在我已尝试加载我的设备树覆盖

root@beaglebone:~# cd /lib/firmware
root@beaglebone:/lib/firmware# dtc -O dtb -I dts -o /lib/firmware/PRU-GPIO-EXAMP                                                                                                                                                             LE-00A0.dtbo -b 0 -@ PRU-GPIO-EXAMPLE-00A0.dts
root@beaglebone:/lib/firmware# cat /sys/devices/platform/bone_capemgr/slots
 0: PF----  -1
 1: PF----  -1
 2: PF----  -1
 3: PF----  -1
root@beaglebone:/lib/firmware# sudo sh -c "echo 'PRU-GPIO-EXAMPLE-00A0' > /sys/devices/platform/bone_capemgr/slots"
root@beaglebone:/lib/firmware# cat /sys/devices/platform/bone_capemgr/slots
 0: PF----  -1
 1: PF----  -1
 2: PF----  -1
 3: PF----  -1
 4: P-O-L-   0 Override Board Name,00A0,Override Manuf,PRU-GPIO-EXAMPLE
到目前为止,它看起来不错,现在我尝试加载我的PRU程序

root@beaglebone:/usr# cd /usr/local/test
root@beaglebone:/usr/local/test# ls
Makefile  libprussdrv.a  pasm  pruss_intc_mapping.h  prussdrv.h  testPRU  testPRU.c  testPRU_Off.bin  testPRU_Off.p  testPRU_On.bin  testPRU_On.p
root@beaglebone:/usr/local/test# ./testPRU testPRU_On.bin
prussdrv_open() failed
我几乎让所有的东西都工作了,但是我得到了一个prussdrv_open()失败的错误,并且不知道为什么。所有东西的密码都在这里写出来了。。。


如果非要我猜的话,我一直遵循的例子已经过时,有些东西已经改变了。我已经知道加载树覆盖的方式已经改变。可能.dts文件格式已更改,或者我现在必须在调用prussdrv_open()之前再次调用prussdrv库。请告诉我您认为可能是什么原因造成的。

我的解决方案是回到旧版本,我尝试了4.1,但仍然存在问题。所以我回到了3.8版本,所有的东西都预装在操作系统上。一切都好了

对于在此处登录的任何人:如果使用内核>=4.1,请不要尝试使用slots文件动态加载设备树。无论如何,这肯定会给你带来悲伤。您应该使用u-boot覆盖,即在引导时加载覆盖

 // If this segfaults, make sure you're executing as root.  
  prussdrv_init();  
  if (prussdrv_open(PRU_EVTOUT_0) == -1) {  
   printf("prussdrv_open() failed\n");  
   return 1;  
  }