On Thursday, January 16, 2020 at 9:58:39 AM UTC-8, Jason Kridner wrote:
>
>
>
> On Thu, Jan 16, 2020 at 3:39 AM Andrew P. Lentvorski <[email protected] 
> <javascript:>> wrote:
> >
> > I've got to be missing something obvious, but I even after several 
> rounds of RTFM, I can't seem to figure out how to get the PRU to change the 
> direction of a pin or, at the very least, to let it go to a tri-state value.
> >
> > I would go out over the L3/L4 (although that kinda smashes the whole 
> "real-time" thing), but won't that bump into the fact that the processor 
> needs to be in supervisor mode?
>
> I see you got some other answers, but it might help you to qualify if you 
> are using a chip-level GPIO or PRU-level GPIO.
>
> As mentioned, you don't need a supervisor mode to get to the L3 bus needed 
> to configure the GPIO or pinmux. You do need to clear the STANDBY_INIT bit 
> in SYSCFG. Then, the PRU can poke all the SoC registers that the ARM can. 
> Below is an example that clears this bit, but doesn't need to do so, 
> because the PRU GPIO bits are INSIDE the PRUSS, so I'll likely remove those 
> lines from this example in the future.
>
>

I guess I'm still missing something because the following program doesn't 
work.  When I try to write to *u32_control_P9_27, nothing changes.  I *CAN* 
however read from it and config-pin can change it externally just fine.  
So, I got the actual *pointer address* as well as various clocks and 
enables correct since I can read it properly.

What did I get wrong?


#include <stdint.h>
#include <pru_cfg.h>
#include "resource_table_empty.h"

volatile register uint32_t __R30;   // 32 output gpios
volatile register uint32_t __R31;   // 32 input gpios

#define CONTROL_MODULE_START ((uint32_t)0x44E10000)
#define CONF_MCASP0_FSR_OFFSET 0x9A4
uint32_t volatile * const u32_control_P9_27 = (uint32_t volatile * 
const)(CONTROL_MODULE_START 
+ CONF_MCASP0_FSR_OFFSET);

#define PINMUX_PRU_OUT 0x5
#define PINMUX_PRU_IN  0x6

#define DELAY_CYCLES (50000000/2)
void main(void) {
    uint32_t const led = 0x00000028; // Use pru0_pru_r30_5 and 
pru0_pru_r32_3 as an output

    // You can now monitor P9_28 frequency as reflecting state of P9_27 
pinmux
    
    CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;

    unsigned int ui = 0;
    unsigned int ui_fast = 0;

    while (1) {
        *u32_control_P9_27 = PINMUX_PRU_IN;  // No effect on frequency 
while config-pin causes expected frequency shifts

        ++ui;

        if (((*u32_control_P9_27) & 0x07) == PINMUX_PRU_OUT) {  // This 
verifies that I actually got the correct address of the pinmux
            ui_fast = 1;
        } else {
            ui_fast = 0;
        }
            
        __R30 = led;                
        __delay_cycles(DELAY_CYCLES);
        if (ui_fast != 1) {
            __delay_cycles(DELAY_CYCLES);
        }
        
        __R30 = 0;                
        __delay_cycles(DELAY_CYCLES);
        if (ui_fast != 1) {
            __delay_cycles(DELAY_CYCLES);
        }
    }

    __halt();
}




-- 
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/437cd2db-6711-4dbe-ba19-0a781d0f31bd%40googlegroups.com.

Reply via email to