BBBCSIO

PRU PASM Assembler Source to Exchange Data with a Host C# Program

 

About Host and PRU Data Exchange PASM Code

The code below is designed to work in either PRU of the Beaglebone Black and is intended to interact with the PRUDataInOut example C# code. The comments in the code below and the discussion on the PRU Data In Out example page describe the usage, operation and output of this code.

/// +------------------------------------------------------------------------------------------------------------------------------+
/// |                                                   TERMS OF USE: MIT License                                                  |
/// +------------------------------------------------------------------------------------------------------------------------------|
/// |Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation    |
/// |files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,    |
/// |modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software|
/// |is furnished to do so, subject to the following conditions:                                                                   |
/// |                                                                                                                              |
/// |The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.|
/// |                                                                                                                              |
/// |THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE          |
/// |WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR         |
/// |COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,   |
/// |ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                         |
/// +------------------------------------------------------------------------------------------------------------------------------+

/// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
///  PRUDataInOut.p - a PASM assembly language program, intended to run in
///                   the Beaglebone Black PRU and which will accept an
///                   integer, double it, and then return it. It implements
///                   a simple semaphore system to coordinate actions with
///                   the user space program. 
///
///                   This code is intended to demonstrate the use of
///                   the PRU data RAM as a means of passing data
///                   between the PRU and a user space program and so
///                   this is probably not the most optimal or practical 
///                   bit of PASM assembly code you will ever see.
///
///                   Compile with the command
///                      pasm -b PRUDataInOut.p
/// 
///                   This code was written as part of the BBBCSIO library
///                   which is designed to provide C#/Mono access to the 
///                   OCP Devices and PRU on a Beaglebone Black. Since this
///                   code is in PASM assembler, it is not really related to
///                   C#/Mono and you could compile and then run it 
///                   using any language which can load a binary into the 
///                   Beaglebone Black PRU.
///
///               References to the PRM refer to the AM335x PRU-ICSS Reference Guide
///               References to the TRM refer to the AM335x SitaraTM Processors
///                   Technical Reference Manual
///            
///               History
///                   05 Jun 15  Cynic - Originally Written
///
///               Home Page
///                   http://www.ofitselfso.com/BBBCSIO/BBBCSIO.php
/// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

.origin 0
.entrypoint START

// this defines the data RAM memory location inside the PRUs address space. 
#define PRU_DATARAM 0    // yep, starts at address zero no matter which PRU you are using

        // this label is where the code execution starts
START:

        // Note we do NOT need to enable the OCP master port as was done in the
        // previous example PRUBlinkUSR3LED.p This is because this code does not write
        // directly out to the BBB's userspace memory. It writes to its own data
        // RAM and this is presented to userspace as a MemoryMapped file by the UIO driver.

M1:     MOV       R3, PRU_DATARAM           // put the address of our 8Kb DataRAM space in R3
        MOV       R0, 0                     // clear R0
        LBBO      R0.b3, R3, 4, 1           // our flag byte is at offset 4, we read in that 
        QBEQ      M1, R0, 0                 // if R0 = 0 no data is ready
                                           
        // the flag is not 0, the data is ready from the user space program                                     

        LBBO      r0, r3, 0, 4              // read in the 4 bytes at that address into R0
                                            //   these are the bytes of the integer carefully
                                            //   placed there by the user space program and they
                                            //   should be in the correct order to represent an 
                                            //   integer when read sequentially into the 4
                                            //   bytes of R0. Fortunately the storage order of
                                            //   the bytes of an integer in user space is the 
                                            //   same as the storage order used in the PRU  
        LSL       R0, R0, 1                 // multiply the value in R0 by two and put it back  
        SBBO      r0, r3, 0, 4              // store the newly multiplied integer in R0 back in
                                            //   the memory location pointed at by R3
        MOV       R0, 0                     // reset R0
        SBBO      r0.b3, r3, 4, 1           // store a 0 back in our flag to signal the 
                                            //   operation is complete


        JMP M1                              // loop again