Tengo un BeagleBone Blue y, utilizando la PRU integrada, estoy intentando controlar el LED_RED a bordo. Para PRUSS, estoy usando UIO PRUSS y am335x_pru_package a través de enlaces PyPRUSS .
Estoy accediendo al led rojo a través del puerto OCP, y mi código de ensamblaje es el siguiente:
.origin 0
.entrypoint SETUP
#define GPIO2 0x481ac000
#define GPIO_CLEARDATAOUT 0x190
#define GPIO_SETDATAOUT 0x194
#define GPIO_DATAOUT 0x138
#define LED_RED (1<<2)
#define PAUSE_BTN (1<<5)
#define INS_PER_US 200
#define INS_PER_DELAY_LOOP 2
#define ON_TIME (200*1000*(INS_PER_US / INS_PER_DELAY_LOOP))
#define OFF_TIME (200*1000*(INS_PER_US / INS_PER_DELAY_LOOP))
#define PRU0_R31_VEC_VALID 32
#define PRU_EVTOUT_0 3
SETUP:
// Enable the OCP master port
LBCO r0, C4, 4, 4
CLR r0, r0, 4
SBCO r0, C4, 4, 4
TURN_LED_ON:
MOV r1, GPIO2 | GPIO_SETDATAOUT // for setting gpio bit
MOV r2, LED_RED
SBBO r2, r1, 0, 4 // sets led on
MOV r0, ON_TIME
LED_ON:
SUB r0, r0, 1
QBNE LED_ON, r0, 0
TURN_LED_OFF:
MOV r1, GPIO2 | GPIO_CLEARDATAOUT // for clearing gpio bit
MOV r2, LED_RED
SBBO r2, r1, 0, 4 // sets led off
MOV r0, OFF_TIME
LED_OFF:
SUB r0, r0, 1
QBNE LED_OFF, r0, 0
CHECK_BUTTON:
MOV r5, GPIO2 | GPIO_DATAOUT //for reading gpio bit
LBBO r6, r5, 0, 4
QBBS TURN_LED_ON, r6.t5
END:
MOV R31.b0, PRU0_R31_VEC_VALID | PRU_EVTOUT_0
HALT
Lo que hace el código es mantener parpadeando el led en un intervalo de tiempo configurable, hasta que Se presiona PAUSE_BUTTON , que si es así, el código sale.
Aquí está el script de python que se está utilizando:
import pypruss
pypruss.init() # Init the PRU
pypruss.open(3) # Open PRU event 0 which is PRU0_ARM_INTERRUPT
pypruss.pruintc_init(0) # Init the interrupt controller
pypruss.exec_program(0, "./blinkled.bin") # Load firmware "blinkled.bin" on PRU 0
pypruss.wait_for_event(3) # Wait for event 0 which is connected to PRU0_ARM_INTERRUPT
print("DONE!")
pypruss.clear_event(3) # 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.
El firmware no hace que el LED parpadee, ni sale del código enviando la interrupción para indicar el final del programa.