I am not having success in running the ADC from the PRU, and wondering if anyone can offer some guidance. I suspect my device tree overlay, but I am also uncertain about my PRU code. The overlay compiles and installs without error. The PRU code hangs on the loop that is waiting for FIFO0COUNT to be nonzero.
Both my PRU code and the device tree overlay are shown below. I am running kernel 4.4.19-bone-rt-r13. Thanks, Phil *(BTW, this message is cross-posted here <https://groups.google.com/forum/#!category-topic/beaglebone/beagleboardorg-beaglebone-black/_NWi3J4uNxE>. It is not clear to me which forum is the right place for this. Hopefully this won't irritate anyone too badly.)* *PRU Code* // Interrupt strobe bit #define PRU0_R31_VEC_VALID (1<<5) // Interrupt signal number // SIGNUM corresponds to pr1_pru_mst_intr[3]_intr_req // which is named PRU0_ARM_INTERRUPT (19) in pruss_intc_mapping.h // This interrupt is in turn mapped to PRU Interrupt channel 2, // and then mapped to host interrupt 2 as well. #define SIGNUM 3 #define ADC_BASE 0x44e0d000 // ADC registers, offset from ADC_BASE #define CTRL 0x0040 #define ADCSTAT 0x0044 #define ADC_CLKDIV 0x004c #define STEPENABLE 0x0054 #define STEPCONFIG1 0x0064 #define STEPDELAY1 0x0068 #define STEPCONFIG2 0x006C #define STEPDELAY2 0x0070 #define STEPCONFIG3 0x0074 #define STEPDELAY3 0x0078 #define STEPCONFIG4 0x007C #define STEPDELAY4 0x0080 #define STEPCONFIG5 0x0084 #define STEPDELAY5 0x0088 #define STEPCONFIG6 0x008C #define STEPDELAY6 0x0090 #define STEPCONFIG7 0x0094 #define STEPDELAY7 0x0098 #define STEPCONFIG8 0x009C #define STEPDELAY8 0x00A0 #define STEPCONFIG9 0x00A4 #define STEPDELAY9 0x00A8 #define STEPCONFIG10 0x00AC #define STEPDELAY10 0x00B0 #define STEPCONFIG11 0x00B4 #define STEPDELAY11 0x00B8 #define STEPCONFIG12 0x00BC #define STEPDELAY12 0x00C0 #define STEPCONFIG13 0x00C4 #define STEPDELAY13 0x00C8 #define STEPCONFIG14 0x00CC #define STEPDELAY14 0x00D0 #define STEPCONFIG15 0x00D4 #define STEPDELAY15 0x00D8 #define STEPCONFIG16 0x00DC #define STEPDELAY16 0x00E0 #define FIFO0COUNT 0x00e4 #define FIFO0DATA 0x0100 #define FIFO1COUNT 0x00f0 #define FIFO1DATA 0x0200 // Register Group base addresses/pointers #define PRU0_CTRL_addr 0x00022000 #define PRU1_CTRL_addr 0x00024000 #define PRU_CFG_ptr c4 // PRUx_Ctrl Registers: Register offsets #define PRUx_CTRL_CTRL 0x00 #define PRUx_CTRL_STS 0x04 #define PRUx_CTRL_WAKEUP_EN 0x08 #define PRUx_CTRL_CYCLE 0x0c #define PRUx_CTRL_STALL 0x10 #define PRUx_Ctrl_CTBIR0 0x20 #define PRUx_Ctrl_CTBIR1 0x24 #define PRUx_Ctrl_CTPPR0 0x28 #define PRUx_Ctrl_CTPPR1 0x2c // Register allocations // Registers r0-r3 are to be used for general purpose operations #define adc_base r4 #define fifo0data r5 #define local c24 #define remote c25 #define shared c28 #define PRU0_CTRL_ptr r22 .origin 0 .entrypoint INIT INIT: // constant table offsets // This sets the following: // c24 = 0x00000000 local PRU RAM // c25 = 0x00002000 remote PRU RAM // c28 = 0x00010000 shared RAM mov PRU0_CTRL_ptr, PRU0_CTRL_addr mov r0, 0 sbbo r0, PRU0_CTRL_ptr, PRUx_Ctrl_CTBIR0, 4 mov r0, 0x00000100 sbbo r0, PRU0_CTRL_ptr, PRUx_Ctrl_CTPPR0, 4 // local constants mov adc_base, ADC_BASE mov fifo0data, FIFO0DATA // Enable OCP lbco r0, PRU_CFG_ptr, 4, 4 clr r0, 4 sbco r0, PRU_CFG_ptr, 4, 4 // Disable ADC lbbo r0, adc_base, CTRL, 4 and r0.b0, r0.b0, 0xff sbbo r0, adc_base, CTRL, 4 // Run ADC at full speed mov r0, 0 sbbo r0, adc_base, ADC_CLKDIV, 4 // Configure STEPCONFIGx registers for channels 2-6 // no averaging, SW-enabled, one-shot mov r0, 0 mov r0.b2, 0x10 // channel 2 sbbo r0, adc_base, STEPCONFIG1, 4 mov r0.b2, 0x18 // channel 3 sbbo r0, adc_base, STEPCONFIG2, 4 mov r0.b2, 0x20 // channel 4 sbbo r0, adc_base, STEPCONFIG3, 4 mov r0.b2, 0x28 // channel 5 sbbo r0, adc_base, STEPCONFIG4, 4 mov r0.b2, 0x30 // chennal 6 sbbo r0, adc_base, STEPCONFIG5, 4 // Configure STEPDELAYx registers for channels 2-6 mov r0, 0 sbbo r0, adc_base, STEPDELAY1, 4 sbbo r0, adc_base, STEPDELAY2, 4 sbbo r0, adc_base, STEPDELAY3, 4 sbbo r0, adc_base, STEPDELAY4, 4 sbbo r0, adc_base, STEPDELAY5, 4 // enable steps 1-5 mov r0, 0x0000003E sbbo r0, adc_base, STEPENABLE, 4 // Set STEPCONFIG registers protected, use tags mov r0, 0x00000001 sbbo r0, adc_base, CTRL, 4 MAIN: // enable the ADC mov r0, 0x00000003 sbbo r0, adc_base, CTRL, 4 // wait for conversions complete WAIT_FOR_FIFO0: lbbo r0, adc_base, FIFO0COUNT, 4 qbne WAIT_FOR_FIFO0, r0, 5 // GETTING STUCK HERE // signal C code MOV R31.b0, PRU0_R31_VEC_VALID | SIGNUM //qba MAIN halt *Device Tree Overlay* /dts-v1/; /plugin/; /{ compatible = "ti,beaglebone", "ti,beaglebone-black"; part-number = "pruss_enable"; version = "00A0"; /* This overlay uses the following resources */ exclusive-use = "pru0", "pru1", "tscadc", "P9.29", // GPIO3[15] fet_off "P9.30", // GPIO3[16] fet_on "P9.31", // GPIO3[14] triac "P9.37", // AIN2 TC_REF "P9.38", // AIN3 TC "P9.33", // AIN4 VL_SENSE "P9.36", // AIN5 VH_SENSE "P9.35"; // AIN6 IH_SENSE fragment@0 { target = <&am33xx_pinmux>; __overlay__ { pru_pins: pinmux_pru_pins { pinctrl-single,pins = < 0x190 0x05 // P9_31 $PINS=100 pr1_pru0_pru_r30_0 mode 5 output pulldown 0x194 0x05 // P9_29 $PINS=101 pr1_pru0_pru_r30_1 mode 5 output pulldown 0x198 0x05 // P9_30 $PINS=102 pr1_pru0_pru_r30_2 mode 5 output pulldown >; }; }; }; // fragment@1 { // target = <&tsadc>; // __overlay__ { // status = "okay"; // adc { // ti,adc-channels = <2 3 4 5 6>; // }; // }; // }; fragment@2 { // Enable the PRUSS target = <&pruss>; __overlay__ { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pru_pins>; dig_pru_pins { pin-names = "FET_OFF","FET_ON","TRIAC" ; gpios = <&gpio3 14 0 // P9.31 &gpio3 15 0 // P9.29 &gpio3 16 0>; // P9.30 }; }; }; }; -- 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 beagleboard+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/beagleboard/eb9582b5-ee7e-49bc-84f2-dde3e768180c%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.