BTW, I believe the BeaglePilot project is running those drivers on the PRU, so 
this is the same as running on the Cortex-A8 bare-metal. 

Regards,
John




> On Nov 2, 2015, at 9:29 AM, William Hermans <[email protected]> wrote:
> 
> Here is one such project, although I'm not sure this is the one I was 
> thinking of 
> 
> https://github.com/BeaglePilot/PRUSS-C 
> <https://github.com/BeaglePilot/PRUSS-C>
> 
> the starterware stuff is located in the PRUSS_LIB sub directory.
> 
> On Mon, Nov 2, 2015 at 10:21 AM, William Hermans <[email protected] 
> <mailto:[email protected]>> wrote:
> Yeah that link John gave out seems good. I've been meaning to follow it 
> myself for a couple weeks now. But I've been doing other things waiting for 
> remoteproc / rpmsg to settle down.
> 
> I really like the idea of remoteproc / rpmsg, it seems very intuitive / 
> natural.
> 
> Also Micka, there is *some* github project that uses starterware too . . . 
> demonstrating how to use starterware inside a ti_cgt C compiler project . . . 
> I do not remember which it is, so may not be able to find a link to it . . .
> 
> On Mon, Nov 2, 2015 at 8:37 AM, John Syne <[email protected] 
> <mailto:[email protected]>> wrote:
> Hi Micka,
> 
> Follow this tutorial:
> 
> http://processors.wiki.ti.com/index.php/PRU_Training:_Hands-on_Labs 
> <http://processors.wiki.ti.com/index.php/PRU_Training:_Hands-on_Labs>
> 
> Regards,
> John
> 
> 
> 
> 
>> On Nov 2, 2015, at 1:26 AM, Micka <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Ok, the problem is that in a PRU project you don't have access to the I2C 
>> function that you have in the starterware :'( .
>> 
>> 
>> I guess that I need to code in ASM then ^^ .
>> 
>> Le lun. 2 nov. 2015 à 10:01, Micka <[email protected] 
>> <mailto:[email protected]>> a écrit :
>> I found that : 
>> 
>> http://www.element14.com/community/community/designcenter/single-board-computers/next-gen_beaglebone//blog/2014/04/30/bbb--pru-c-compiler
>>  
>> <http://www.element14.com/community/community/designcenter/single-board-computers/next-gen_beaglebone//blog/2014/04/30/bbb--pru-c-compiler>
>> 
>> 
>> Le lun. 2 nov. 2015 à 09:48, Micka <[email protected] 
>> <mailto:[email protected]>> a écrit :
>> Ok, thx for the tips.
>> 
>> I've CCS & starterware installed. I found the I2C driver. But how do you 
>> create a PRU project for the beaglebone black ? 
>> 
>> In the CCS App center, the PRU compiler is installed, but I can't find how 
>> to create a PRU project ?
>> 
>> 
>> Micka,
>> 
>> 
>> Le lun. 2 nov. 2015 à 01:30, John Syne <[email protected] 
>> <mailto:[email protected]>> a écrit :
>> Hi Micka,
>> 
>> With a few tweaks, you can use the drivers from Staterware[1] and use the 
>> PRU C compiler. My advice is to use Starterware on the CortexA8 to get 
>> familiar with the examples, utilities and driver code. Next you want to pull 
>> out just the driver and utility code you need and put it into one file, 
>> compile with the PRU C compiler and fix errors and warnings. Don’t forget to 
>> add CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;[2] to the start of main().
>> 
>> I do this all with a JTAG emulator. Not sure how you will be able to debug 
>> this code otherwise. 
>> 
>> [1] http://www.ti.com/tool/starterware-sitara 
>> <http://www.ti.com/tool/starterware-sitara>
>> [2] https://git.ti.com/pru-software-support-package 
>> <https://git.ti.com/pru-software-support-package>
>> 
>> 
>> Regards,
>> John
>> 
>> 
>> 
>> 
>>> On Nov 1, 2015, at 4:06 PM, William Hermans <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> By the way, I keep seeing stuff like "C2" in PASM assembly in regard to the 
>>> PRU's. Wish I could figure out what it is . . . Seems to be some sort of 
>>> constant "register" ? And there is more than just C2, but I have not found 
>>> any reference to those yet :/
>>> 
>>> On Sun, Nov 1, 2015 at 5:01 PM, William Hermans <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> Hi Micka,
>>> 
>>> I do not think he is using and driver. When speaking of the I2C module, I 
>>> believe hes speaking of the physical on chip module. But this . . .
>>> 
>>> #define I2C1_BASE            C2                //base registri I2C1 nella 
>>> tabella 
>>> 
>>> translated from Italian to English  . . . I2C1 base registers in the table  
>>> which seems to me he is setting up the I2C hardware module directly through 
>>> it's registers in memory. But the other link, he pasted I do not know if 
>>> you saw it or not 
>>> http://beagleboard.org/Community/Forums/?place=msg%2Fbeagleboard%2FDAXyYJOrDIc%2FDZ8WKkRWaC0J
>>>  
>>> <http://beagleboard.org/Community/Forums/?place=msg%2Fbeagleboard%2FDAXyYJOrDIc%2FDZ8WKkRWaC0J>
>>>  he talks about the problem being solved and he was not bringing the 
>>> hardware module out of reset, which is similar to how the ADC module works. 
>>> 
>>> Wish I could help you more, but I know nearly nothing about I2C. I know 
>>> what it is, and vaguely how it's done, but have never used I2C . . .
>>> 
>>> On Sun, Nov 1, 2015 at 2:45 PM, Micka <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> Hi,
>>> 
>>> I'm interested by what you have done.  I want to use i2c to read analog 
>>> value from a component.
>>> 
>>> The first solution that I found was to bitbang the i2c. But you, you use 
>>> the i2c driver which is nice.
>>> 
>>> Could you give us the peace of asm code that you use to interface with the 
>>> MCP23017. And if you have the c code also it would be great.
>>> 
>>> ( if possible, also the part of you managed to activate the module by 
>>> writing MODULEMODE field into register CM_PER_I2C1_CLKCTRL register and 
>>> also the code that wait for IDLEST field to confirm that module is ready).
>>> 
>>> Micka,
>>> 
>>> 
>>> Le dim. 19 juil. 2015 21:45, Gianfranco Rosso <[email protected] 
>>> <mailto:[email protected]>> a écrit :
>>> 
>>> I've also posted this in I2C topic, the solution is there:
>>> 
>>> http://beagleboard.org/Community/Forums/?place=msg%2Fbeagleboard%2FDAXyYJOrDIc%2FDZ8WKkRWaC0J
>>>  
>>> <http://beagleboard.org/Community/Forums/?place=msg%2Fbeagleboard%2FDAXyYJOrDIc%2FDZ8WKkRWaC0J>
>>> 
>>> 
>>> Il giorno lunedì 13 luglio 2015 09:49:20 UTC+2, Gianfranco Rosso ha scritto:
>>> 
>>> I want to manage the I2C1 module by the PRU, in order to interface some I/O 
>>> expanders (MCP23017 by Microchip).
>>> I use may own "cape" without the plug-n' play eeprom (one of the next steps 
>>> will be adding management for DCAN0 and DCAN1 so i'll need these pins 
>>> too...).
>>> So, at present, there are just 2 MCP23017 connected to the P9.17 and P9.18.
>>> 
>>> I load the cape-universal into slots and then I use configure-pin command 
>>> to set P9.17 and P9.18 as i2c
>>> 
>>> I've started from an example into the am335x_pru_package-master and wrote 
>>> my own C PRU loader.
>>> Very simple, it just:
>>> 
>>> loads the PRU codeinit the data exhanged with the PRUstart the PRUwait for 
>>> ESC key presssignal to the PRU to stopwait for the PRU stopexit.
>>> 
>>> 
>>> Also the assembly PRU code is simple: 
>>> 
>>> init I2C1 module (by writing registers PSC, SCLL, SCLH, CON)init 1st I/O 
>>> expander as 16 inputs (even if at power on it's already set as input)init 
>>> 2nd I/O expander as 16 outputscicle reading status of inputs from 1st 
>>> expander and echoing to the outputs of 2nd expanderexit cycle and halt when 
>>> receive stop flag from the loader
>>> 
>>> for send and receive I2C messages I use register SA, CNT, DATA and CON.
>>> 
>>> That's very simple and linear... pity, it doesn't work.
>>> 
>>> I didn't see any activity at all in P9.17 and P9.18.
>>> 
>>> The PRU code is surely running, as I add a cycle counter and show it in the 
>>> loader while it's waiting for ESC keypress, and also the PRU code correctly 
>>> stops at the loader command.
>>> 
>>> I was expecting that the PRU code stalls if I2C bus doesn't work, as there 
>>> are waiting cycles both for STOP condition or for CNT reaching zero 
>>> (depending on the write or read message sending).
>>> 
>>> But it seems running, and running very fast also: the cycle counter is 
>>> incremented to a very fast rate (over 550 kcycles/s)  that's not compatible 
>>> with the correct executing of I2C sequences (I've setted the module for 
>>> 400Kbps rate... so the PRU cycle it's even faster than a single I2C bit 
>>> time!).
>>> 
>>> I'm surely doing something wrong, but I cant fugure what.
>>> 
>>> Any idea?
>>> 
>>> Suggestions?
>>> 
>>> Inserisci qui il codice...
>>> 
>>> .origin 0
>>> .entrypoint START
>>> 
>>> #include "iic_ioexp.hp"
>>> 
>>> //costanti per l'accesso al modulo I2C1
>>> #define I2C1_BASE            C2                //base registri I2C1 nella 
>>> tabella costanti
>>> #define I2C_SYSC            0x10            //offset del registro I2C_SYSC
>>> #define I2C_STAT_RAW        0x24            //offset del registro 
>>> I2C_STATUS_RAW
>>> #define I2C_SYSS            0x90            //offset del registro I2C_SYSS
>>> #define I2C_CNT                0x98            //offset del registro I2C_CNT
>>> #define I2C_DATA            0x9C            //offset del registro I2C_DATA
>>> #define I2C_CON                0xA4            //offset del registro I2C_CON
>>> #define I2C_SA                0xAC            //offset del registro I2C_SA
>>> #define I2C_PSC                0xB0            //offset del registro I2C_PSC
>>> #define I2C_SCLL            0xB4            //offset del registro I2C_SCLL
>>> #define I2C_SCLH            0xB8            //offset del registro I2C_SCLH
>>> 
>>> #define I2C_CMD_ENABLE        0x8400            //modulo I2C abilitato come 
>>> master
>>> #define I2C_CMD_TX            0x0200            //modulo I2C in trasmissione
>>> #define I2C_CMD_RX            0x0000            //modulo I2C in ricezione
>>> #define I2C_CMD_START        0x0001            //modulo I2C richiesta 
>>> generazione sequenza START
>>> #define I2C_CMD_STOP        0x0002            //modulo I2C richiesta 
>>> generazione sequenza STOP
>>> 
>>> //costanti per l'accesso all'I/O expander MCP23017
>>> #define IO_EXP0                0x20            //7bit I2C address dell'I/O 
>>> expander 0 (ingressi)
>>> #define IO_EXP1                0x21            //7bit I2C address dell'I/O 
>>> expander 1 (uscite)
>>> 
>>> #define IO_EXP_IODIRA        0x00            //indirizzo registro IODIRA 
>>> dell'I/O expander 
>>> #define IO_EXP_GPIOA        0x12            //indirizzo registro GPIOA 
>>> dell'I/O expander
>>> 
>>> //======================================================================
>>> 
>>> //macro che attende fine sequenza verificando generazione seqeunza di STOP
>>> .macro I2C_WAIT_BY_STOP
>>> _CHECK:
>>>     LBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>>     QBBS _CHECK, r1.t1
>>> .endm   
>>> 
>>> //macro che attende fine sequenza verificando generazione seqeunza di STOP
>>> .macro I2C_WAIT_BY_COUNT
>>> _CHECK:
>>>     LBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>>     QBNE _CHECK, r1.w0, 0
>>> .endm
>>> 
>>> //======================================================================
>>> 
>>> START:
>>>     // clear that bit
>>>     LBCO r0,
>>> 
>>> on
>>> 
>>> , 4, 4
>>>     CLR r0, r0, 4
>>>     SBCO r0, C4, 4, 4
>>> 
>>>     //------------------------------------------------------------------
>>>     //configurazione modulo I2C1
>>>     
>>>     //reset del modulo I2C1
>>>     MOV r1.w0, 0x0002    
>>>     SBCO r1.w0, I2C1_BASE, I2C_SYSC, 2
>>>     
>>>     MOV r1.w0, 0x0000    
>>>     SBCO r1.w0, I2C1_BASE, I2C_SYSC, 2
>>> 
>>> //    //attesa fine reset modulo
>>> //_WAIT_RDONE:
>>> //    LBCO r1, I2C1_BASE, I2C_SYSS, 4
>>> //    QBBC _WAIT_RDONE, r1.t0    
>>>     
>>>     //configura prescaler e durata SCL H/L per avere 400kHz
>>>     MOV r1.b0, 4                //prescaler=4+1 --> 
>>> ICLK=SCLK/prescaler=100/5=20MHz (nel reference manual raccomandano circa 
>>> 24Mhz) 
>>>     SBCO r1.b0, I2C1_BASE, I2C_PSC, 1
>>>     
>>>     MOV r1.b0, 18                //durata SCL L=18+7 --> 
>>> tLOW=1/ICLK*(SCLL+7)=1/20E6*(18+7)=1.25us
>>>     SBCO r1.b0, I2C1_BASE, I2C_SCLL, 1
>>>     
>>>     MOV r1.b0, 20                //durata SCL H=20+5 --> 
>>> tHIGH=1/ICLK*(SCLH+5)=1/20E6*(20+5)=1.25us
>>>     SBCO r1.b0, I2C1_BASE, I2C_SCLH, 1
>>> 
>>>     //abilita modulo
>>>     MOV r1.w0, I2C_CMD_ENABLE
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>> 
>>>     //------------------------------------------------------------------
>>>     //inizializzazione IOEXP 0
>>>     
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP0            
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>> 
>>>     //n. byte da spedire
>>>     MOV r1.w0, 3            
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>> 
>>>     //riempie FIFO
>>>     MOV r1, IO_EXP_IODIRA | 0x00FFFF00        //tutti i pin come ingressi 
>>> (in realta' e' gia' cosi' dal POR)
>>>     SBCO r1.b0, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b1, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b2, I2C1_BASE, I2C_DATA, 1
>>> 
>>>     //attesa bus free
>>> _WAIT_BB:
>>>     LBCO r1, I2C1_BASE, I2C_STAT_RAW, 4
>>>     QBBS _WAIT_BB, r1.t12
>>> 
>>>     //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>> 
>>>     I2C_WAIT_BY_STOP
>>> 
>>>     //------------------------------------------------------------------
>>>     //inizializzazione IOEXP 1
>>>     
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP1            
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>> 
>>>     //n. byte da spedire gia' impostato
>>> 
>>>     //riempie FIFO
>>>     MOV r1, IO_EXP_IODIRA | 0x00000000        //tutti pin come uscita
>>>     SBCO r1.b0, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b1, I2C1_BASE, I2C_DATA, 1
>>>     SBCO r1.b2, I2C1_BASE, I2C_DATA, 1
>>> 
>>>     //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>> 
>>>     I2C_WAIT_BY_STOP
>>> 
>>>     //------------------------------------------------------------------
>>>     //ciclo rinfresco I/O
>>> 
>>> _LOOP:
>>>  
>>>     //------------------------------------------------------------------
>>>     //legge ingressi
>>>     
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP0            
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>> 
>>>     //n. byte da spedire
>>>     MOV r1.w0, 1            
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>> 
>>>     //riempie FIFO
>>>     MOV r1, IO_EXP_GPIOA
>>>     SBCO r1.b0, I2C1_BASE, I2C_DATA, 1 
>>>  
>>>      //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>> 
>>>     I2C_WAIT_BY_COUNT
>>>  
>>>      //n. byte da ricevere
>>>     MOV r1.w0, 2            
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>> 
>>>      //comando lettura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_RX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>> 
>>>     I2C_WAIT_BY_STOP
>>> 
>>>     //legge i byte ricevuti
>>>     LBCO r2.b1, I2C1_BASE, I2C_DATA, 1 
>>>     LBCO r2.b2, I2C1_BASE, I2C_DATA, 1
>>> 
>>>     //------------------------------------------------------------------
>>>     //scrive uscite
>>> 
>>>     //indirizzo slave
>>>     MOV r1.w0, IO_EXP1            
>>>     SBCO r1.w0, I2C1_BASE, I2C_SA, 2
>>> 
>>>     //n. byte da spedire
>>>     MOV r1.w0, 3            
>>>     SBCO r1.w0, I2C1_BASE, I2C_CNT, 2
>>> 
>>>     //riempie FIFO
>>>     MOV r2.b0, IO_EXP_GPIOA
>>>     SBCO r2.b0, I2C1_BASE, I2C_DATA, 1 
>>>     SBCO r2.b0, I2C1_BASE, I2C_DATA, 1 
>>>     SBCO r2.b0, I2C1_BASE, I2C_DATA, 1
>>> 
>>>     //comando scrittura
>>>     MOV r1.w0, I2C_CMD_ENABLE | I2C_CMD_TX | I2C_CMD_START | I2C_CMD_STOP
>>>     SBCO r1.w0, I2C1_BASE, I2C_CON, 2
>>> 
>>>     I2C_WAIT_BY_STOP
>>>     
>>>     //------------------------------------------------------------------
>>>     LBCO r2, CONST_PRUDRAM, 0, 4
>>>     ADD r2, r2, 1
>>>     SBCO r2, CONST_PRUDRAM, 0, 4    
>>>     
>>>     //------------------------------------------------------------------
>>>     //esce dal ciclo e se il flag di uscita nella ram condivisa e' azzerato
>>>     LBCO r2, CONST_PRUDRAM, 4, 1
>>>     QBNE _LOOP, r2.b0, 0
>>> 
>>> _EXIT:
>>>     //invia all'host la notifica di programma completato
>>>     MOV R31.b0, PRU0_ARM_INTERRUPT+16
>>> 
>>>     HALT
>>> 
>>> -- 
>>> For more options, visit http://beagleboard.org/discuss 
>>> <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] 
>>> <mailto:[email protected]>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <https://groups.google.com/d/optout>.
>>> 
>>> 
>>> 
>>> -- 
>>> For more options, visit http://beagleboard.org/discuss 
>>> <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] 
>>> <mailto:[email protected]>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <https://groups.google.com/d/optout>.
>>> 
>>> 
>>> 
>>> -- 
>>> For more options, visit http://beagleboard.org/discuss 
>>> <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] 
>>> <mailto:[email protected]>.
>>> For more options, visit https://groups.google.com/d/optout 
>>> <https://groups.google.com/d/optout>.
>> 
>> 
>> -- 
>> For more options, visit http://beagleboard.org/discuss 
>> <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] 
>> <mailto:[email protected]>.
>> For more options, visit https://groups.google.com/d/optout 
>> <https://groups.google.com/d/optout>.
>> 
>> -- 
>> For more options, visit http://beagleboard.org/discuss 
>> <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] 
>> <mailto:[email protected]>.
>> For more options, visit https://groups.google.com/d/optout 
>> <https://groups.google.com/d/optout>.
> 
> 
> -- 
> For more options, visit http://beagleboard.org/discuss 
> <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] 
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout 
> <https://groups.google.com/d/optout>.
> 
> 
> 
> -- 
> For more options, visit http://beagleboard.org/discuss 
> <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] 
> <mailto:[email protected]>.
> For more options, visit https://groups.google.com/d/optout 
> <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 [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to