Jump to: navigation, search

PyPRUSS on BeagleBone

PyPRUSS is a Python library for programming the PRUs on BeagleBone (Black). The library is open source (of course) and the source code is available from this bitbucket repository: https://bitbucket.org/intelligentagent/pypruss

Installation

PyPRUSS is available as a an OPKG from the thing-printer feed. This is the preferred way to install the software for Angstrom.

I'm assuming you are starting with Angstrom v2013.06:

 root@thing2:~# lsb_release -a
 Distributor ID: Angstrom
 Description:    Angstrom GNU/Linux v2013.06 (Core edition)
 Release:        v2013.06
 Codename:       Core edition

If you do not have this distro, have a look at this page: http://wiki.thing-printer.com/index.php?title=Installing_angstrom

Add the thing-printer feeds:

 echo 'src/gz replicape-base http://feeds.thing-printer.com/feeds/v2013.06/ipk/eglibc/armv7ahf-vfp-neon/machine/beaglebone' > /etc/opkg/replicape-base.conf

Update the feed:

 opkg update

Install the PyPRUSS packages. All necessary dependencies should be installed as well:

 opkg install pypruss

In order to compile PSU assembler files, you also need pasm:

 opkg install pasm

The PyPRUSS package has a dependency on libprussdrv which is then also installed. There is a bug in the libprussdrv package, so you need to manually make a soft link from /usr/lib/libprussdrv.so.1 to /usr/lib/libprussdrv.so:

 cd /usr/lib
 ln -s libprussdrv.so.1 libprussdrv.so

Testing

After you have installed the package, try running this example on your BBB:

 nano blinkled.py

Paste this Python code:

''' blinkled.py - test script for the PyPRUSS library
It blinks the user leds ten times'''

import pypruss

pypruss.modprobe()                              # This only has to be called once pr boot
pypruss.init()                                  # Init the PRU
pypruss.open(0)                                 # Open PRU event 0 which is PRU0_ARM_INTERRUPT
pypruss.pruintc_init()                          # Init the interrupt controller
pypruss.exec_program(0, "./blinkled.bin")	# Load firmware "blinkled.bin" on PRU 0
pypruss.wait_for_event(0)                       # Wait for event 0 which is connected to PRU0_ARM_INTERRUPT
pypruss.clear_event(0)                          # Clear the event
pypruss.pru_disable(0)                          # Disable PRU 0, this is already done by the firmware
pypruss.exit()                                  # Exit, don't know what this does.

Then start nano again:

 nano blinkled.p

and copy-paste this PRU Assembler code:

.origin 0
.entrypoint START

#define PRU0_ARM_INTERRUPT 19

#define GPIO1 				0x4804c000		// The adress of the GPIO1 
#define GPIO_CLEARDATAOUT 	0x190
#define GPIO_SETDATAOUT 	0x194

START:
    LBCO r0, C4, 4, 4					// Load Bytes Constant Offset (?)
    CLR  r0, r0, 4						// Clear bit 4 in reg 0
    SBCO r0, C4, 4, 4					// Store Bytes Constant Offset

    MOV r1, 10
BLINK:
    MOV r2, 7<<22
    MOV r3, GPIO1 | GPIO_SETDATAOUT
    SBBO r2, r3, 0, 4

    MOV r0, 0x00a00000
DELAY:
    SUB r0, r0, 1
    QBNE DELAY, r0, 0

    MOV r2, 7<<22
    MOV r3, GPIO1 | GPIO_CLEARDATAOUT
    SBBO r2, r3, 0, 4

    MOV r0, 0x00a00000
DELAY2:
    SUB r0, r0, 1
    QBNE DELAY2, r0, 0
    SUB r1, r1, 1
    QBNE BLINK, r1, 0

    MOV R31.b0, PRU0_ARM_INTERRUPT+16   // Send notification to Host for program completion
HALT

You need to compile the assembler code:

 pasm -b blinkled.p 

Then you can run the Python script:

 python blinkled.py

You should see the four user LEDs on the BeagleBone flash 10 times with about a second interval.