Hello,

Since I'm new to this forum, I will introduce myself.  I'm C/C++ software 
engineer and have experience with, among other things, Atmel AVR and SAM 
(Cortex) .  Recently I started playing with embedded Linux (Raspberry Pi 
and Beaglebone Black) as a hobby project.  My goal is to develop a DCC 
<https://www.nmra.org/index-nmra-standards-and-recommended-practices>Central 
using the Beaglebone Black platform.

I'm using Code Composer Studio V7 (on Windows) to write, compile and debug 
code on the BBB (for the pru using a Blackhawk USB100v2 JTAG emulator).  On 
the BBB I flashed the latest IoT release :

debian@beaglebone:~$ uname -a
Linux beaglebone 4.4.84-ti-r120 #1 SMP Sun Aug 27 03:11:07 UTC 2017 armv7l 
GNU/Linux
debian@beaglebone:~$ cat /etc/dogtag
BeagleBoard.org Debian Image 2017-08-24
debian@beaglebone:~$

The BBB is plugged in a Newhaven 7" LCD cape (functional in character 
mode), but I cannot see the cape loaded :

debian@beaglebone:~$ cat /sys/devices/platform/bone_capemgr/slots
 0: ---l--  -1
 1: ------  -1
 2: ---l--  -1
 3: ---l--  -1
debian@beaglebone:~$

Since I can compile C code in CCS and debug PRU code on the device, I *think 
*the pru's are operational :

debian@beaglebone:~$ lsmod | grep pru
pru_rproc              15879  2
pruss_intc              9009  1 pru_rproc
pruss                  12346  1 pru_rproc
debian@beaglebone:~$

Now I'm looking into ways to write a linux app that can communicate with 
the PRU firmware.  Am I correct in assuming that rpmsg is the way to go ?  
After google-ing a lot and reading about the subject, I try to run this 
code :

int main(void)
{
    struct pru_rpmsg_transport transport;
    uint16_t src, dst, len;
    volatile uint8_t *status;

    /* Allow OCP master port access by the PRU so the PRU can read external 
memories */
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

    /* Clear the status of the PRU-ICSS system event that the ARM will use 
to 'kick' us */
    CT_INTC.SICR_bit.STS_CLR_IDX = FROM_ARM_HOST;

    /* Make sure the Linux drivers are ready for RPMsg communication */
    status = &resourceTable.rpmsg_vdev.status;
    while (!(*status & VIRTIO_CONFIG_S_DRIVER_OK));

    /* Initialize the RPMsg transport structure */
    pru_rpmsg_init(&transport, &resourceTable.rpmsg_vring0, &resourceTable.
rpmsg_vring1, TO_ARM_HOST, FROM_ARM_HOST);

    /* Create the RPMsg channel between the PRU and ARM user space using 
the transport structure. */
    while (pru_rpmsg_channel(RPMSG_NS_CREATE, &transport, CHAN_NAME, 
CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS);

    while(1)
    {
        /* Check bit 30 of register R31 to see if the ARM has kicked us */
        if (__R31 & HOST_INT)
        {
            /* Clear the event status */
            CT_INTC.SICR_bit.STS_CLR_IDX = FROM_ARM_HOST;
            /* Receive all available messages, multiple messages can be 
sent per kick */
            while (pru_rpmsg_receive(&transport, &src, &dst, payload, &len) 
== PRU_RPMSG_SUCCESS)
            {
                // Process payload here

                /* Echo the message back to the same address from which we 
just received */
                pru_rpmsg_send(&transport, dst, src, payload, len);
            }
        }
    }
}

However, this sequence loops at  while (!(*status & 
VIRTIO_CONFIG_S_DRIVER_OK)); 

I suppose there is some driver missing or not running, but have no idea 
which one...

Any help is appreciated !!

Thanks in advance,

Paul


-- 
For more options, visit http://beagleboard.org/discuss
--- 
You received this message because you are subscribed to the Google Groups 
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beagleboard/fcee700f-6b77-43c2-9d54-6713ab5fece9%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to