Thanks a lot for this, friend. Can I ask where you sourced this 
information? The TRM is a little sparse on the topic of using the PRU as an 
ethernet controller, and I can't seem to find any other good sources.

On Friday, July 25, 2014 at 12:57:06 AM UTC-4, [email protected] wrote:
>
> Full code at:  https://github.com/jstampfl/PruIEP_Int
>
> Also for example of using PRU IEP see:
>
>
> https://github.com/cdsteinkuehler/linuxcnc/blob/MachineKit-ubc/configs/ARM/PRU-Debugger/pruexample.p
>
> Here is the p code:
>
> //iepx.p   -  set up IEP interrupt on CMP0 hitting compare value.
> //            toggles pin p9.31 -  attached to r30.t0 - mode 5 output
> //
> //            Depends on call linux program to initialize the INTC 
> //
> .setcallreg r2.w0  //  Going to use r30
> .origin 0
> .entrypoint TB
> TB:
>        set r30,r30, 0         //turn on 
>        jmp ISET                //this is the routine to setup
>
> TB1:
>        ldi r17,0             // init loop counter
>        call RSET             // routine to clear & enable interrupts
>
> TB2:
>        qbbc TB2,r31.t30     // spin here for interrupt
>        xor r30,r30,1        //toggle
>        call RSET            // clear, enable
>        add r17,r17,1        //loop counter
>        qblt TB9,r17,50      //loop 50 times
>        jmp TB2
>
>
> TB9:    //  exit point 
>        mov r31,35          //trigger host interrupt for Linux
>        HALT
>
> ISET: //  This section is to initialize the interrupts
>
> //    INITIALIZE IEP INTERRUPTS
>
>        mov r14,0xFFFFFF           //For CMP0, compare trigger
>        sbco r14,c26,0x48,4
>        mov r14,0x3                // enable CMP0, and enable
>        sbco r14,c26,0x40,4        // counter reset on event
>        mov r14,0x1
>        sbco r14,c26,0x44,4        // clear status for CMP0
>        lbco r14,c26,0x4,4
>        sbco r14,c26,0x4,4         // clear GLOBAL status, overflow
>        mov r14,0x111              // enable IEP counter, inc 1
>        sbco r14,c26,0,4
>
> //    DONE WITH IEP SETUP
>
> //    SETUP CHANNEL MAP
> //            map SysEvent to Channel 0, leave 16 - 23 alone set by Linux
>        mov r15,0x400            //set up Channel map
>        mov r14,0x09090909       // first map all unused events to
>        sbco r14,c0,r15,4        //  Channel 9
>        mov r15,0x408
>        sbco r14,c0,r15,4
>        mov r15,0x40C            // skiping offsets 410 & 414, they
>        sbco r14,c0,r15,4        // were set by the C program via prussdrv
>        mov r18,0x43C            // end for loop
>        mov r15,0x414            // start -4 for loop
> TB43:
>        add r15,r15,4
>        sbco r14,c0,r15,4
>        qbgt TB43,r15,r18
>        mov r14,0x00090909       // map SysEvt 7 to channel 0
>        mov r15,0x404            // now do 404, which has the
>        sbco r14,c0,r15,4        // entries for 4,5,6,7
>
> //   Done with Channel Map, Host Interrupt Map now
>            // Host Interrupt 0 - 3 were setup by Linux   
>
>        mov r14,0x09090909       // map channels 4,5,6,7 to Host Int 9 
>        mov r15,0x804
>        sbco r14,c0,r15,4
>        mov r14,0x00000909       // map channel 8 & 9 to Host Int 9
>        mov r15,0x808
>        sbco r14,c0,r15,4
>
>        ldi r15, 0x24             //clear all events
>        call ALLEVT
>
>
>        ldi r15,0x28              // enable all events
>        call ALLEVT
>        jmp TB1
>
> RSET:  // Routine to clear & enable system events, also host interrupts
>        mov r24,r2           // Save return address
>                             // so can call ALLEVT
>        lbco r14,c26,0x4,4   // clear GLOBAL_STATUS
>        sbco r14,c26,0x4,4
>        lbco r14,c26,0x44,4  // clear CMP_STATUS
>        sbco r14,c26,0x44,4
>        lbco r14,c26,0x44,4
>        mov r15,0x24         //  to clear system event
>        call ALLEVT
>        mov r15,0x28         //  to enable system event
>        call ALLEVT
>
>        mov r2,r24            // restore return address
>        ret
>        
> ALLEVT:  //Insert the system envent in the proper INTC register
>          // register r15 must have the register offset
>          // will only work with registers that take the event number
>          // if you want to handle multiple events, just add 
>          //   ldi r14,"sys event no."
>          //   sbco r14, c0 ,r15,4
>
>        ldi r14,0x7
>        sbco r14, c0 ,r15,4
>        ret
>
>

-- 
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/8fa31a7b-9d57-4caf-925a-877c1d059fe0%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to