Thanks Mahmoud, I'll try with this library . Best regards
2015-02-05 17:52 GMT-03:00 <[email protected]>: > I use BBBIOlib-master. You can get it from > https://github.com/VegetableAvenger/BBBIOlib > I think it is better than this library in my own opinion :) It is easier > to be installed and is complete. It also contains examples. > > > On Thursday, February 5, 2015 at 10:10:39 PM UTC+2, celso maia wrote: >> >> I got one error, and I don't know how to solve this. >> >> "ERROR: Sampling period is required by second" >> >> Anyone can help me? >> >> Em terça-feira, 8 de abril de 2014 07:15:31 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 > [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- Celso Machado Maia Padilha Fones: OI (83) 8665-7615 / TIM (83) 9960-6442 Aluno do Programa de Pós-Graduação em Engenharia Elétrica - PPGEE Universidade Federal da Paraíba - UFPB Graduado em Ciências da Computação Centro Universitário de João Pessoa - UNIPÊ -- 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]. For more options, visit https://groups.google.com/d/optout.
