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 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.

Reply via email to