Here is one such project, although I'm not sure this is the one I was thinking of
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]> 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]> wrote: > >> Hi Micka, >> >> Follow this tutorial: >> >> 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]> 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]> 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 >>> >>> >>> Le lun. 2 nov. 2015 à 09:48, Micka <[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]> 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 >>>>> [2] https://git.ti.com/pru-software-support-package >>>>> >>>>> >>>>> Regards, >>>>> John >>>>> >>>>> >>>>> >>>>> >>>>> On Nov 1, 2015, at 4:06 PM, William Hermans <[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]> >>>>> 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 >>>>>> 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]> 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]> a écrit : >>>>>>> >>>>>>> I've also posted this in I2C topic, the solution is there: >>>>>>> >>>>>>> >>>>>>> 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 >>>>>>> --- >>>>>>> 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. >>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> 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. >>>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>>> 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. >>>>> >>>>> >>>>> >>>>> -- >>>>> 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. >>>>> >>>> >> -- >> 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. >> >> >> -- >> 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. >> > > -- 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.
