Hi Rodrigo, Can you send me your code? otherwise it is impossible for me to answer all your questions.
Regards, Antonio On Sat, Aug 16, 2014 at 12:19 AM, Rodrigo Caropreso <rcaropr...@gmail.com> wrote: > Hello, > > Sorry for the delay on answering the mails group, but on the beginning of > the week I do not have much time available to work on the BeagleBone issues. > > I've downloaded the most recent Angstrom image (on the site) and I've just > updated the BeagleBone Black now. > > Regarding the segmentation fault: I was following the instructions on this > page: > http://boxysean.com/blog/2012/08/12/first-steps-with-the-beaglebone-pru/ > > The seg fault has happened in the execution of the sample: > ./PRU_memAccessPRUDataRam > > The info was something like: > > AM33XX INFO: Initializing example. INFO: Executing example. > Segmentation fault. > > (The remaining messages were not showed). > > Since is is a sample code, I was thinking that this code would be reliable > enough to confirm iif my BBB's PRU is correctly configured and running. > > In fact I'm trying to read analog data (ADC) using PRU (because the usual > way, using the file system is not fast enough for what I need - but I > accept any suggestions to get data from ADC in a 10KHz sample rate ). > > I was planning to use the libpruio Library (my assembly is a little bit > rusty and this library should help me to achieve this task) but last week > I've got stuck into this seg fault issue. > > Now, with an updated OS, I'll try to follow these path again (perhaps I'll > be more lucky this time). > > Is it possible to use the libpruio (and PRUSSDRV) on Angstrom or should I > install Ubuntu or Debian instead? > > Thanks for all your information and best regards, > > Rodrigo. > > > > > > > > Em terça-feira, 8 de abril de 2014 07h15min31s UTC-3, Youngtae Jo escreveu: >> >> I've tried to find some example of ADC reading by PRU for my project, but >> I couldn't find it. >> And I made that of source code and attach here for some people who have >> the same problem with me. >> I hope it will be helpful. >> >> [ AM335x ARM-CORE PRU ADC Example ] >> - Sequence of example >> 1. Install compiling environment of PRU >> 2. Enable PRU >> 3. Enable ADC >> 4. Example source >> - This example source collects ADC data from AIN0 pin with 16khz >> sampling rate. >> - The collected data are saved into "Results.txt" file. >> - The example source are "Makefile", "ADCCollector.c", "ADCCollector.p", >> "ADCCollector.hp" >> >> [ Install compile environment ] >> 1. Get a copy of the am335x_pru_package -> https://github.com/ >> beagleboard/am335x_pru_package >> You also can download the am335x_pru_package here -> >> https://github.com/beagleboard/am335x_pru_package/archive/master.zip >> 2. If you downloaded the archive, unpack it somewhere under your home >> directory. >> 3. Make a new directory /usr/include/pruss/ and copy the files >> prussdrv.h >> and pruss_intc_mapping.h into it (from am335x_pru_package-master/pru_ >> sw/app_loader/include). >> Check the permissions; if you used the .zip file, these headers will >> likely have the execute bits on. >> It doesn't really hurt anything, but is certainly not what you want. >> 4. Change directory to am335x_pru_package-master/pru_ >> sw/app_loader/interface >> then run: CROSS_COMPILE= make (note the space between the = and the >> command). >> 5. The previous step should have created four files in >> am335x_pru_package-master/pru_sw/app_loader/lib: libprussdrv.a, >> libprussdrvd.a, libprussdrvd.so and libprussdrv.so. >> Copy these all to /usr/lib then run ldconfig. >> 6. Change directory to am335x_pru_package-master/pru_ >> sw/utils/pasm_source >> then run source linuxbuild to create a pasm executable one directory >> level up. >> - If linuxbuild doesn't have permission to execution, give the >> permission by run this >> : chmod +x linuxbuild >> Copy it to /usr/bin and make sure you can run it. >> If you invoke it with no arguments, you should get a usage statement. >> >> [ Enable PRU ] >> Before using PRU, we need to enable the PRU core, you can do it as shown >> below >> # echo BB-BONE-PRU-01 > /sys/devices/bone_capemgr.8/slots >> >> [ Enable ADC ] >> Before using ADC, we also need to enable ADC, you can do it as shown >> below >> # echo cape-bone-iio > /sys/devices/bone_capemgr.*/slots >> >> [ ADC Example - Makefile] >> CFLAGS+=-Wall -Werror >> LDLIBS+= -lpthread -lprussdrv >> >> all: ADCCollector.bin ADCCollector >> >> clean: >> rm -f ADCCollector *.o *.bin >> >> ADCCollector.bin: ADCCollector.p >> pasm -b $^ >> >> ADCCollector: ADCCollector.o >> >> [ ADC Example - ADCCollector.p] >> // Developed by Youngtae Jo in Kangwon National University (April-2014) >> >> // This program collects ADC from AIN0 with certain sampling rate. >> // The collected data are stored into PRU shared memory(buffer) first. >> // The host program(ADCCollector.c) will read the stored ADC data >> // This program uses double buffering technique. >> // The host program can recognize the buffer status by buffer status >> variable >> // 0 means empty, 1 means first buffer is ready, 2 means second buffer is >> ready. >> // When each buffer is ready, host program read ADC data from the buffer. >> >> >> .origin 0 // offset of the start of the code in PRU memory >> .entrypoint START // program entry point, used by debugger only >> >> #include "ADCCollector.hp" >> >> #define BUFF_SIZE 0x00000FA0 //Total buff size: 4kbyte(Each buffer has >> 2kbyte: 500 piece of data) >> #define HALF_SIZE BUFF_SIZE / 2 >> >> #define SAMPLING_RATE 16000 //Sampling rate(16khz) >> #define DELAY_MICRO_SECONDS (1000000 / SAMPLING_RATE) //Delay by sampling >> rate >> #define CLOCK 200000000 // PRU is always clocked at 200MHz >> #define CLOCKS_PER_LOOP 2 // loop contains two instructions, one clock >> each >> #define DELAYCOUNT DELAY_MICRO_SECONDS * CLOCK / CLOCKS_PER_LOOP / 1000 / >> 1000 * 3 >> >> .macro DELAY >> MOV r10, DELAYCOUNT >> DELAY: >> SUB r10, r10, 1 >> QBNE DELAY, r10, 0 >> .endm >> >> .macro READADC >> //Initialize buffer status (0: empty, 1: first buffer is ready, 2: >> second buffer is ready) >> MOV r2, 0 >> SBCO r2, CONST_PRUSHAREDRAM, 0, 4 >> >> INITV: >> MOV r5, 0 //Shared RAM address of ADC Saving position >> MOV r6, BUFF_SIZE //Counting variable >> >> READ: >> //Read ADC from FIFO0DATA >> MOV r2, 0x44E0D100 >> LBBO r3, r2, 0, 4 >> //Add address counting >> ADD r5, r5, 4 >> //Write ADC to PRU Shared RAM >> SBCO r3, CONST_PRUSHAREDRAM, r5, 4 >> >> DELAY >> >> SUB r6, r6, 4 >> MOV r2, HALF_SIZE >> QBEQ CHBUFFSTATUS1, r6, r2 //If first buffer is ready >> QBEQ CHBUFFSTATUS2, r6, 0 //If second buffer is ready >> QBA READ >> >> //Change buffer status to 1 >> CHBUFFSTATUS1: >> MOV r2, 1 >> SBCO r2, CONST_PRUSHAREDRAM, 0, 4 >> QBA READ >> >> //Change buffer status to 2 >> CHBUFFSTATUS2: >> MOV r2, 2 >> SBCO r2, CONST_PRUSHAREDRAM, 0, 4 >> QBA INITV >> >> //Send event to host program >> MOV r31.b0, PRU0_ARM_INTERRUPT+16 >> HALT >> .endm >> >> // Starting point >> START: >> // Enable OCP master port >> LBCO r0, CONST_PRUCFG, 4, 4 >> CLR r0, r0, 4 >> SBCO r0, CONST_PRUCFG, 4, 4 >> >> //C28 will point to 0x00012000 (PRU shared RAM) >> MOV r0, 0x00000120 >> MOV r1, CTPPR_0 >> ST32 r0, r1 >> >> //Init ADC CTRL register >> MOV r2, 0x44E0D040 >> MOV r3, 0x00000005 >> SBBO r3, r2, 0, 4 >> >> //Enable ADC STEPCONFIG 1 >> MOV r2, 0x44E0D054 >> MOV r3, 0x00000002 >> SBBO r3, r2, 0, 4 >> >> //Init ADC STEPCONFIG 1 >> MOV r2, 0x44E0D064 >> MOV r3, 0x00000001 //continuous mode >> SBBO r3, r2, 0, 4 >> >> //Read ADC and FIFOCOUNT >> READADC >> >> >> >> >> [ ADC Example - ADCCollector.c] >> >> /*********************************************************** >> ******************* >> * Include Files >> * >> ************************************************************ >> ******************/ >> // Standard header files >> #include <stdio.h> >> #include <stdlib.h> >> #include <sys/mman.h> >> #include <fcntl.h> >> #include <errno.h> >> #include <unistd.h> >> #include <string.h> >> #include <time.h> >> >> // Driver header file >> #include <pruss/prussdrv.h> >> #include <pruss/pruss_intc_mapping.h> >> >> /*********************************************************** >> ******************* >> * Local Macro Declarations >> * >> ************************************************************ >> ******************/ >> #define PRU_NUM 0 >> #define OFFSET_SHAREDRAM 2048 //equivalent with 0x00002000 >> >> #define PRUSS0_SHARED_DATARAM 4 >> #define SAMPLING_RATE 16000 //16khz >> #define BUFF_LENGTH SAMPLING_RATE >> #define PRU_SHARED_BUFF_SIZE 500 >> #define CNT_ONE_SEC SAMPLING_RATE / PRU_SHARED_BUFF_SIZE >> >> /*********************************************************** >> ******************* >> * Functions declarations >> * >> ************************************************************ >> ******************/ >> static void Enable_ADC(); >> static void Enable_PRU(); >> static unsigned int ProcessingADC1(unsigned int value); >> >> /*********************************************************** >> ******************* >> * Global variable Declarations >> * >> ************************************************************ >> ******************/ >> static void *sharedMem; >> static unsigned int *sharedMem_int; >> >> /*********************************************************** >> ******************* >> * Main >> * >> ************************************************************ >> ******************/ >> int main (int argc, char* argv[]) >> { >> FILE *fp_out; >> unsigned int ret; >> tpruss_intc_initdata pruss_intc_initdata = PRUSS_INTC_INITDATA; >> int i = 0, cnt = 0, total_cnt = 0; >> int target_buff = 1; >> int sampling_period = 0; >> >> if(argc != 2){ >> printf("\tERROR: Sampling period is required by second\n"); >> printf("\t %s [sampling period]\n", argv[0]); >> return 0; >> } >> sampling_period = atoi(argv[1]); >> >> /* Enable PRU */ >> Enable_PRU(); >> /* Enable ADC */ >> Enable_ADC(); >> /* Initializing PRU */ >> prussdrv_init(); >> ret = prussdrv_open(PRU_EVTOUT_0); >> if (ret){ >> printf("\tERROR: prussdrv_open open failed\n"); >> return (ret); >> } >> prussdrv_pruintc_init(&pruss_intc_initdata); >> printf("\tINFO: Initializing.\r\n"); >> prussdrv_map_prumem(PRUSS0_SHARED_DATARAM, &sharedMem); >> sharedMem_int = (unsigned int*) sharedMem; >> /* Open save file */ >> fp_out = fopen("Results.txt", "w"); >> if(fp_out == NULL){ >> printf("\tERROR: file open failed\n"); >> return 0; >> } >> >> /* Executing PRU. */ >> printf("\tINFO: Sampling is started for %d seconds\n", sampling_period); >> printf("\tINFO: Collecting"); >> prussdrv_exec_program (PRU_NUM, "./ADCCollector.bin"); >> /* Read ADC */ >> while(1){ >> while(1){ >> if(sharedMem_int[OFFSET_SHAREDRAM] == 1 && target_buff == 1){ // First >> buffer is ready >> for(i=0; i<PRU_SHARED_BUFF_SIZE; i++){ >> fprintf(fp_out, "%d\n", ProcessingADC1(sharedMem_int[OFFSET_SHAREDRAM + >> 1 + i])); >> } >> target_buff = 2; >> break; >> }else if(sharedMem_int[OFFSET_SHAREDRAM] == 2 && target_buff == 2){ // >> Second buffer is ready >> for(i=0; i<PRU_SHARED_BUFF_SIZE; i++){ >> fprintf(fp_out, "%d\n", ProcessingADC1(sharedMem_int[OFFSET_SHAREDRAM + >> PRU_SHARED_BUFF_SIZE + 1 + i])); >> } >> target_buff = 1; >> break; >> } >> } >> >> if(++cnt == CNT_ONE_SEC){ >> printf("."); >> total_cnt += cnt; >> cnt = 0; >> } >> >> if(total_cnt == CNT_ONE_SEC * sampling_period){ >> printf("\n\tINFO: Sampling completed ...\n"); >> break; >> } >> } >> >> fclose(fp_out); >> printf("\tINFO: PRU completed transfer.\r\n"); >> prussdrv_pru_clear_event (PRU_EVTOUT_0, PRU0_ARM_INTERRUPT); >> >> /* Disable PRU*/ >> prussdrv_pru_disable(PRU_NUM); >> prussdrv_exit(); >> >> return(0); >> } >> >> /*********************************************************** >> ****************** >> * Local Function Definitions >> * >> ************************************************************ >> *****************/ >> /* Enable ADC */ >> static int Enable_ADC() >> { >> FILE *ain; >> >> ain = fopen("/sys/devices/bone_capemgr.8/slots", "w"); >> if(!ain){ >> printf("\tERROR: /sys/devices/bone_capemgr.8/slots open failed\n"); >> return -1; >> } >> fseek(ain, 0, SEEK_SET); >> fprintf(ain, "cape-bone-iio"); >> fflush(ain); >> return 0; >> } >> >> /* Enable PRU */ >> static int Enable_PRU() >> { >> FILE *ain; >> >> ain = fopen("/sys/devices/bone_capemgr.8/slots", "w"); >> if(!ain){ >> printf("\tERROR: /sys/devices/bone_capemgr.8/slots open failed\n"); >> return -1; >> } >> fseek(ain, 0, SEEK_SET); >> fprintf(ain, "BB-BONE-PRU-01"); >> fflush(ain); >> return 0; >> } >> >> /* >> * FIFO0DATA register includes both ADC and channelID >> * so we need to remove the channelID >> */ >> static unsigned int ProcessingADC1(unsigned int value) >> { >> unsigned int result = 0; >> >> result = value << 20; >> result = result >> 20; >> >> return result; >> } >> >> >> >> [ ADC Example - ADCCollector.hp] >> // ************************************************************ >> *****************/ >> // file: PRU_memAccess_DDR_PRUsharedRAM.hp >> // >> // brief: PRU_memAccess_DDR_PRUsharedRAM assembly constants. >> // >> // >> // (C) Copyright 2012, Texas Instruments, Inc >> // >> // author M. Watkins >> // ************************************************************ >> *****************/ >> >> >> #ifndef _PRU_memAccess_DDR_PRUsharedRAM_HP_ >> #define _PRU_memAccess_DDR_PRUsharedRAM_HP_ >> >> >> // *************************************** >> // * Global Macro definitions * >> // *************************************** >> >> // Refer to this mapping in the file - \prussdrv\include\pruss_intc_ >> mapping.h >> #define PRU0_PRU1_INTERRUPT 17 >> #define PRU1_PRU0_INTERRUPT 18 >> #define PRU0_ARM_INTERRUPT 19 >> #define PRU1_ARM_INTERRUPT 20 >> #define ARM_PRU0_INTERRUPT 21 >> #define ARM_PRU1_INTERRUPT 22 >> >> #define CONST_PRUCFG C4 >> #define CONST_PRUDRAM C24 >> #define CONST_PRUSHAREDRAM C28 >> #define CONST_DDR C31 >> >> // Address for the Constant table Block Index Register (CTBIR) >> #define CTBIR 0x22020 >> >> // Address for the Constant table Programmable Pointer Register 0(CTPPR_0) >> #define CTPPR_0 0x22028 >> >> // Address for the Constant table Programmable Pointer Register 1(CTPPR_1) >> #define CTPPR_1 0x2202C >> >> >> .macro LD32 >> .mparam dst,src >> LBBO dst,src,#0x00,4 >> .endm >> >> .macro LD16 >> .mparam dst,src >> LBBO dst,src,#0x00,2 >> .endm >> >> .macro LD8 >> .mparam dst,src >> LBBO dst,src,#0x00,1 >> .endm >> >> .macro ST32 >> .mparam src,dst >> SBBO src,dst,#0x00,4 >> .endm >> >> .macro ST16 >> .mparam src,dst >> SBBO src,dst,#0x00,2 >> .endm >> >> .macro ST8 >> .mparam src,dst >> SBBO src,dst,#0x00,1 >> .endm >> >> >> // *************************************** >> // * Global Structure Definitions * >> // *************************************** >> >> .struct Global >> .u32 regPointer >> .u32 regVal >> .ends >> >> >> // *************************************** >> // * Global Register Assignments * >> // *************************************** >> >> .assign Global, r2, *, global >> >> #endif //_PRU_memAccess_DDR_PRUsharedRAM_ >> >> -- > For more options, visit http://beagleboard.org/discuss > --- > You received this message because you are subscribed to a topic in the > Google Groups "BeagleBoard" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/beagleboard/0a4tszlq2y0/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > beagleboard+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- 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. For more options, visit https://groups.google.com/d/optout.