From aa1db00908df6fb07a7ee4c0b5aba90eae1ec575 Mon Sep 17 00:00:00 2001 From: bugobliterator Date: Tue, 1 Jul 2014 16:16:03 +0530 Subject: [PATCH] Linux_HAL_Essentials: cleanup PWM PRU code change firmware name to pwmpru1 --- .../BB-BONE-PRU-05-00A0.dtbo | Bin 2862 -> 2858 bytes .../BB-BONE-PRU-05-00A0.dts | 2 +- .../{testpru => }/README.md | 0 .../{testpru => pwmpru}/Makefile | 12 +- .../{testpru => pwmpru}/linux_types.h | 0 .../{testpru => pwmpru}/lnk-am33xx.cmd | 0 .../{testpru => pwmpru}/pru_defs.h | 0 .../{testpru => pwmpru}/prucomm.h | 15 +- .../{testpru/testpru1.c => pwmpru/pwmpru1.c} | 213 +++--------------- Tools/Linux_HAL_Essentials/pwmpru1 | Bin 0 -> 11924 bytes Tools/Linux_HAL_Essentials/startup.sh | 6 +- Tools/Linux_HAL_Essentials/testpru1 | Bin 35832 -> 0 bytes 12 files changed, 60 insertions(+), 188 deletions(-) rename Tools/Linux_HAL_Essentials/{testpru => }/README.md (100%) rename Tools/Linux_HAL_Essentials/{testpru => pwmpru}/Makefile (87%) rename Tools/Linux_HAL_Essentials/{testpru => pwmpru}/linux_types.h (100%) rename Tools/Linux_HAL_Essentials/{testpru => pwmpru}/lnk-am33xx.cmd (100%) rename Tools/Linux_HAL_Essentials/{testpru => pwmpru}/pru_defs.h (100%) rename Tools/Linux_HAL_Essentials/{testpru => pwmpru}/prucomm.h (86%) rename Tools/Linux_HAL_Essentials/{testpru/testpru1.c => pwmpru/pwmpru1.c} (59%) create mode 100644 Tools/Linux_HAL_Essentials/pwmpru1 delete mode 100644 Tools/Linux_HAL_Essentials/testpru1 diff --git a/Tools/Linux_HAL_Essentials/BB-BONE-PRU-05-00A0.dtbo b/Tools/Linux_HAL_Essentials/BB-BONE-PRU-05-00A0.dtbo index 4c2f313738ed3c1191890d173cacad81e0a54e05..374c18da86e5eaf23aa167d7ed00123122f6a2a6 100644 GIT binary patch delta 48 zcmZ1{wn|Lk0`I@K3=G^_3=9kw3=EtM69vQ>Pi)k<&&I>Sz`!`IpggyrsMK(?IJ-Ct E06m)wg#Z8m delta 52 zcmZ1_woXjo0`I@K3=G_Q3=9kw3=Ets69vQ>&urAV&nCdhz`!`IB(=Dtps3UkD7{&j HU7Q5~al#D# diff --git a/Tools/Linux_HAL_Essentials/BB-BONE-PRU-05-00A0.dts b/Tools/Linux_HAL_Essentials/BB-BONE-PRU-05-00A0.dts index c5b706886b..ea575e5db7 100644 --- a/Tools/Linux_HAL_Essentials/BB-BONE-PRU-05-00A0.dts +++ b/Tools/Linux_HAL_Essentials/BB-BONE-PRU-05-00A0.dts @@ -300,7 +300,7 @@ pdbg = <0x24400>; firmware-elf; - firmware = "testpru1"; + firmware = "pwmpru1"; /* NOTE: no resource table, no vrings for this one */ }; diff --git a/Tools/Linux_HAL_Essentials/testpru/README.md b/Tools/Linux_HAL_Essentials/README.md similarity index 100% rename from Tools/Linux_HAL_Essentials/testpru/README.md rename to Tools/Linux_HAL_Essentials/README.md diff --git a/Tools/Linux_HAL_Essentials/testpru/Makefile b/Tools/Linux_HAL_Essentials/pwmpru/Makefile similarity index 87% rename from Tools/Linux_HAL_Essentials/testpru/Makefile rename to Tools/Linux_HAL_Essentials/pwmpru/Makefile index 716524e9dd..34eb10a74e 100644 --- a/Tools/Linux_HAL_Essentials/testpru/Makefile +++ b/Tools/Linux_HAL_Essentials/pwmpru/Makefile @@ -5,7 +5,7 @@ .PHONY: all clean -all: testpru1.stripped testpru1.lst +all: pwmpru1.stripped pwmpru1.lst CC=clpru LD=lnkpru @@ -30,7 +30,7 @@ LDFLAGS=-cr --diag_warning=225 -llnk-am33xx.cmd -x STRIPFLAGS=-p -OBJS1:=testpru1.obj +OBJS1:=pwmpru1.obj %.obj: %.c $(CC) $(CFLAGS) -c $< -ea=.s @@ -38,18 +38,18 @@ OBJS1:=testpru1.obj %.obj: %.asm $(CC) $(CFLAGS) -c $< -testpru1: $(OBJS1) +pwmpru1: $(OBJS1) $(CC) $(CFLAGS) $^ -q -z $(LDFLAGS) -o $@ -testpru1.stripped: testpru1 +pwmpru1.stripped: pwmpru1 $(STRIP) $(STRIPFLAGS) $< -o $@ -testpru1.lst: testpru1 +pwmpru1.lst: pwmpru1 $(OBJDUMP) -1 $< > $@ clean: rm -f \ - testpru1 testpru1.asm \ + pwmpru1 pwmpru1.asm \ *.obj *.lst *.out *.stripped \ tags diff --git a/Tools/Linux_HAL_Essentials/testpru/linux_types.h b/Tools/Linux_HAL_Essentials/pwmpru/linux_types.h similarity index 100% rename from Tools/Linux_HAL_Essentials/testpru/linux_types.h rename to Tools/Linux_HAL_Essentials/pwmpru/linux_types.h diff --git a/Tools/Linux_HAL_Essentials/testpru/lnk-am33xx.cmd b/Tools/Linux_HAL_Essentials/pwmpru/lnk-am33xx.cmd similarity index 100% rename from Tools/Linux_HAL_Essentials/testpru/lnk-am33xx.cmd rename to Tools/Linux_HAL_Essentials/pwmpru/lnk-am33xx.cmd diff --git a/Tools/Linux_HAL_Essentials/testpru/pru_defs.h b/Tools/Linux_HAL_Essentials/pwmpru/pru_defs.h similarity index 100% rename from Tools/Linux_HAL_Essentials/testpru/pru_defs.h rename to Tools/Linux_HAL_Essentials/pwmpru/pru_defs.h diff --git a/Tools/Linux_HAL_Essentials/testpru/prucomm.h b/Tools/Linux_HAL_Essentials/pwmpru/prucomm.h similarity index 86% rename from Tools/Linux_HAL_Essentials/testpru/prucomm.h rename to Tools/Linux_HAL_Essentials/pwmpru/prucomm.h index 931f367ea0..3d03eb41ab 100644 --- a/Tools/Linux_HAL_Essentials/testpru/prucomm.h +++ b/Tools/Linux_HAL_Essentials/pwmpru/prucomm.h @@ -21,8 +21,7 @@ struct pwm_config { /* 14, 15 are not routed out for PRU1 */ #define PWM_EN_MASK ( \ BIT( 0)|BIT( 1)|BIT( 2)|BIT( 3)|BIT( 4)|BIT( 5)|BIT( 6)|BIT( 7)| \ - BIT( 8)|BIT( 9)|BIT(10)|BIT(11)|BIT(12)|BIT(13) | \ - BIT(16 + 5) \ + BIT( 8)|BIT( 9)|BIT(10)|BIT(11)|BIT(12) \ ) #define MIN_PWM_PULSE PRU_us(4) @@ -58,6 +57,18 @@ struct pwm_cmd_l{ }; +struct cxt { + u32 cnt; + u32 next; + u32 enmask; + u32 stmask; + u32 setmsk; + u32 clrmsk; + u32 deltamin; + u32 *next_hi_lo; +}; + + /* the command is at the start of shared DPRAM */ #define PWM_CMD ((volatile struct pwm_cmd *)DPRAM_SHARED) diff --git a/Tools/Linux_HAL_Essentials/testpru/testpru1.c b/Tools/Linux_HAL_Essentials/pwmpru/pwmpru1.c similarity index 59% rename from Tools/Linux_HAL_Essentials/testpru/testpru1.c rename to Tools/Linux_HAL_Essentials/pwmpru/pwmpru1.c index b7c54d07da..95dbe957d9 100644 --- a/Tools/Linux_HAL_Essentials/testpru/testpru1.c +++ b/Tools/Linux_HAL_Essentials/pwmpru/pwmpru1.c @@ -4,7 +4,6 @@ */ #define PRU1 - #include #include #include @@ -16,36 +15,6 @@ #include "prucomm.h" -extern void delay_cycles(u32 delay); -extern void delay_cycles_accurate(u32 delay); -extern void delay_cycles_accurate2(u32 delay); -extern u32 read_other_r30(void); - -extern void update_gpo(u32 clrmsk, u32 setmsk); - -void pwm_loop(u32 hi, u32 lo) -{ - while (!pru_signal()) { - __R30 |= (1 << 13); - delay_cycles(hi); - __R30 &= ~(1 << 13); - delay_cycles(lo); - } -} - -void pwm_loop2(u32 hi, u32 lo) -{ - while (!pru_signal()) { - __R30 |= (1 << 13); - delay_cycles_accurate2(hi); - __R30 &= ~(1 << 13); - delay_cycles_accurate2(lo); - } -} - -#define T1 asm (" .global T1\nT1:"); -#define T2 asm (" .global T2\nT2:"); - struct pwm_cmd_l cfg; static void pwm_setup(void) @@ -55,29 +24,8 @@ static void pwm_setup(void) cfg.enmask = 0; for (i = 0; i < MAX_PWMS; i++) cfg.hilo[i][0] = cfg.hilo[i][1] = PRU_us(200); - -#if 0 - cfg.enmask = BIT(13) | BIT(12); - cfg.hilo[12][0] = PRU_us(333); - cfg.hilo[12][1] = PRU_us(333); - cfg.hilo[13][0] = PRU_us(100); - cfg.hilo[13][1] = PRU_us(100); -#endif } -#undef USE_PWM_LOOP -#define USE_PWM_MACRO - -struct cxt { - u32 cnt; - u32 next; - u32 enmask; - u32 stmask; - u32 setmsk; - u32 clrmsk; - u32 deltamin; - u32 *next_hi_lo; -}; static inline u32 read_PIEP_COUNT(void) { @@ -85,70 +33,10 @@ static inline u32 read_PIEP_COUNT(void) } -static void handle_pwm_cmd(struct cxt *cxt) -{ - u8 i; - u32 msk, setmsk, clrmsk; - u32 enmask, stmask, cnt, deltamin, next; - u32 *nextp; - u32 *next_hi_lop; - const u32 *hilop; - cnt = cxt->cnt; - next = cxt->next; - enmask = cxt->enmask; - stmask = cxt->stmask; - setmsk = cxt->setmsk; - clrmsk = cxt->clrmsk; - deltamin = cxt->deltamin; - next_hi_lop = cxt->next_hi_lo; - - // sc_printf("cnt=%x next=%x deltamin=%x", cnt, next, deltamin); - - for (i = 0; i < MAX_PWMS; i++){ - cfg.hilo[i][0] = PWM_CMD->periodhi[i][1]; - cfg.hilo[i][1] = PWM_CMD->periodhi[i][0] - PWM_CMD->periodhi[i][1]; - PWM_CMD->hilo_read[i][0] = cfg.hilo[i][0]; - PWM_CMD->hilo_read[i][1] = cfg.hilo[i][1]; - } - - cfg.enmask = PWM_CMD->enmask; - PWM_CMD->enmask_read = cfg.enmask; - enmask = cfg.enmask; - stmask = 0; /* starting all low */ - - clrmsk = 0; - for (i = 0, msk = 1, nextp = next_hi_lop, hilop = &cfg.hilo[0][0]; - i < MAX_PWMS; - i++, msk <<= 1, nextp += 3, hilop += 2) { - if ((enmask & msk) == 0) { - nextp[1] = PRU_us(100); /* default */ - nextp[2] = PRU_us(100); - continue; - } - nextp[0] = cnt; /* next */ - nextp[1] = hilop[0]; /* hi */ - nextp[2] = hilop[1]; /* lo */ - } - - clrmsk = enmask; - setmsk = 0; - /* guaranteed to be immediate */ - deltamin = 0; - - cxt->cnt = cnt; - cxt->next = next; - cxt->enmask = enmask; - cxt->stmask = stmask; - cxt->setmsk = setmsk; - cxt->clrmsk = clrmsk; - cxt->deltamin = deltamin; -} - - int main(int argc, char *argv[]) { u8 i; - u32 cnt, next, magic; + u32 cnt, next; u32 msk, setmsk, clrmsk; u32 delta, deltamin, tnext, hi, lo; u32 *nextp; @@ -164,11 +52,7 @@ int main(int argc, char *argv[]) SYSCFG_IDLE_MODE_NO | SYSCFG_STANDBY_MODE_NO; /* our PRU wins arbitration */ -#if defined(PRU0) - PRUCFG_SPP &= ~SPP_PRU1_PAD_HP_EN; -#elif defined(PRU1) PRUCFG_SPP |= SPP_PRU1_PAD_HP_EN; -#endif pwm_setup(); /* configure timer */ @@ -179,9 +63,6 @@ int main(int argc, char *argv[]) PIEP_CMP_CFG |= CMP_CFG_CMP_EN(1); PIEP_GLOBAL_CFG |= GLOBAL_CFG_CNT_ENABLE; - /* copy from cfg to cxt */ - - /* initialize */ cnt = read_PIEP_COUNT(); @@ -212,25 +93,43 @@ int main(int argc, char *argv[]) while(1) { /* signalled interrupt from either PRU0 or host */ + if(PWM_CMD->magic == PWM_CMD_MAGIC) { - cxt.cnt = cnt; - cxt.next = next; - cxt.enmask = enmask; - cxt.stmask = stmask; - cxt.setmsk = setmsk; - cxt.clrmsk = clrmsk; - cxt.deltamin = deltamin; - cxt.next_hi_lo = &next_hi_lo[0][0]; + clrmsk = enmask; + setmsk = 0; + /* guaranteed to be immediate */ + deltamin = 0; - handle_pwm_cmd(&cxt); + for (i = 0; i < MAX_PWMS; i++){ + cfg.hilo[i][0] = PWM_CMD->periodhi[i][1]; + cfg.hilo[i][1] = PWM_CMD->periodhi[i][0] - PWM_CMD->periodhi[i][1]; + PWM_CMD->hilo_read[i][0] = cfg.hilo[i][0]; + PWM_CMD->hilo_read[i][1] = cfg.hilo[i][1]; + } + + cfg.enmask = PWM_CMD->enmask; + PWM_CMD->enmask_read = cfg.enmask; + enmask = cfg.enmask; + stmask = 0; /* starting all low */ + + clrmsk = 0; + for (i = 0, msk = 1, nextp = next_hi_lo, hilop = &cfg.hilo[0][0]; + i < MAX_PWMS; + i++, msk <<= 1, nextp += 3, hilop += 2) { + if ((enmask & msk) == 0) { + nextp[1] = PRU_us(100); /* default */ + nextp[2] = PRU_us(100); + continue; + } + nextp[0] = cnt; /* next */ + nextp[1] = hilop[0]; /* hi */ + nextp[2] = hilop[1]; /* lo */ + } + clrmsk = enmask; + setmsk = 0; + /* guaranteed to be immediate */ + deltamin = 0; - cnt = cxt.cnt; - next = cxt.next; - enmask = cxt.enmask; - stmask = cxt.stmask; - setmsk = cxt.setmsk; - clrmsk = cxt.clrmsk; - deltamin = cxt.deltamin; PWM_CMD->magic = PWM_REPLY_MAGIC; } PWM_CMD->enmask_read = enmask; @@ -271,38 +170,7 @@ int main(int argc, char *argv[]) } \ } while (0) -#ifdef USE_PWM_LOOP - for (i = 0, msk = 1, nextp = &next_hi_lo[0][0]; i < MAX_PWMS; i++, msk <<= 1, nextp += 3) { - if ((enmask & msk) == 0) - continue; - - tnext = nextp[0]; - hi = nextp[1]; - lo = nextp[2]; - - /* avoid signed arithmetic */ - while (((delta = (tnext - cnt)) & (1U << 31)) != 0) { - /* toggle the state */ - if (stmask & msk) { - stmask &= ~msk; - clrmsk &= ~msk; - tnext += lo; - } else { - stmask |= msk; - setmsk |= msk; - tnext += hi; - } - } - if (delta <= deltamin) { - deltamin = delta; - next = tnext; - } - nextp[0] = tnext; - } -#endif - -#ifdef USE_PWM_MACRO #if MAX_PWMS > 0 && (PWM_EN_MASK & BIT(0)) SINGLE_PWM(0); @@ -398,8 +266,7 @@ int main(int argc, char *argv[]) SINGLE_PWM(30); #endif #if MAX_PWMS > 31 && (PWM_EN_MASK & BIT(31)) - SINGLE_PWM(30); -#endif + SINGLE_PWM(31); #endif /* results in set bits where there are changes */ delta = ~clrmsk | setmsk; @@ -409,18 +276,12 @@ int main(int argc, char *argv[]) if ((delta >> 16) != 0) pru_other_and_or_reg(30, (clrmsk >> 16) | 0xffff0000, setmsk >> 16); -#if 0 - cnt = read_PIEP_COUNT(); - if (((next - cnt) & (1U << 31)) == 0 && delta > PRU_ms(1)) { - sc_printf("bad next=%x cnt=%x", next, cnt); - } -#endif /* loop while nothing changes */ do { cnt = read_PIEP_COUNT(); if(PWM_CMD->magic == PWM_CMD_MAGIC){ break; - } + } } while (((next - cnt) & (1U << 31)) == 0); } } diff --git a/Tools/Linux_HAL_Essentials/pwmpru1 b/Tools/Linux_HAL_Essentials/pwmpru1 new file mode 100644 index 0000000000000000000000000000000000000000..8c56222636f7285a500a8ef1413d2acd1ef2b3b1 GIT binary patch literal 11924 zcmeHNe{fvYb-wStUEL?GB(Hygz+SY97i_@ZU9DCU*al=|6AKJ6MueZuY9+0ut)*RM zcV%Si1}lMJ8jAcYq@iYpru@-P=+NO0LOT=UiJ69`?ieT}X(#FEHMC9JskLia!BC9) zoqOM1-IZ)`GSeA4!=2II^PO|P^X@zMzI*SxPmgTbc8g&cOcj$IV1(={#-3cw*xEJH z5@$i?Woy{g_&a8@&_31^awa{-Q%$UN>Xavd+8Gad4myr^DeCd@V7%lwtP!;{K0X_s z44R?wAahQ291TrQ+J=Yunx6`KoTs28EMrcFPWg=x=}zGqPX#wSA*G2M%3gF znL%dG!C-BP;vRzT9AXsDo%5fX95kj*o$|jIydyMiuuwg&bLRB4-*bkgzZLN~XWo0y z&stg2!3cAXL|N$wbVs5d)V4D{ZB$Q9)f&a3ZM+Tc5ynE}apwH|#lH?6T~rMH1Z{en z1w$txPe6Ad&Pvx#6$c$$`wjRX7-FH5s3&UWbq_^6r9;RI)rTXjbb9)<=TMW!fv$8Y z3VjpoQI9hCfg|%jcUiKH7NE`+ynK&A;f(1G`r_yvk{tL>q76Brq~4Z2aMV9KR|aF zI{#_*x8Dr2(lcRC>5s#9i9N!aW@bKM)R$9JtnqAVruN*~#y9^7{?EYQ`rvHO^x3oi z_h)AO;5qfD4e)Eh_k+Kz#3mHq0N)V&Ux9B;>%3a=cn_A?FBOl2 z#|3Zq0$w+GHh4YY^@BH9VkO11!LtRgZvn3dylU`I`?>)PPqbcsDHIjX8Cvec(L`-hS|&EU^`e=L63tc-MeuV!X&P_NY@T zvP(*(sU_31v!UtIwBI|;?wl@uwdkiO@oZ0wg+iDYO2tyqUo1{9Ied*d1Q^oG7 z_e-7+ryAd3HyTZEIlhxKGyj8U#TO_ReF3_cA2>Cxt_HfA0OjQcr`pw3LsuQ39Dm!f zU7Zb`9iaaDy2D)^hmHrR@AFQTtE+;pDnR3?$ML#4FLd4jjmg^`kE`=Q=LyjGUhi10 z&VtSg(6h4IFi84JDz@KfVxk-m8q5;wiRspsTT44*Z$PjF@EE<>Y$4nyfEmfBha>s^d~-CC zOAV!x`PA;@P`W=^NM|#V?K|#{#G=vOSfqC}J=7l=$z}UT`wEevbY^r6zrB%su8(zh z1>qR%jC5XmZLl-jpBhMIf_G=qW5M0Aa5NmfIR@>>o?Lohun=6+cXcopZH}$OPdwP2 z8cXJbU736#H#(fk6iDvN=0>u)WFghh4AU#xoX8iFeY=>~XfYZL#$3quiF>*lzaHZn z{KCWx>jC_lJtUfDimEE}%T(FsBdE+O^Kq)Y<{whU&7-J1Uh_GsxcL_ny(G~wRJPar zF;(3B1t~q|F9~_f{}dJbA}(sNtz;5;P2@*Xed**7@_Q?JV0mAOzfXIf@1wN#CDNHf zG@8g{)0uPuRWdh_N0k~&7s_{1Wpo-J?@7Z;OG9VXJjGT6BW7E=H}{Hb==87;cny|b1& zS7@(H&KjAEYLSamdM;iEppiv!KkcKd7R{G^t6E%T>@uXrz3*LBu8^%vfSxNNBhu5j zbBlFC@)(IkcNdM?R4$VoVv*rge>xc%$?uG8%?_s`o3nj#T8V7WWe0M};o)> z3nRHvHE(T8XLhA>`h@jcPghromId&Oo&Ibce$|fOVA`Y${Yv4v^t_(L?iBVb@#`_z z#)Xlz=L*vY|v>Kd5sQ9YllkG zaP^O+QI~j)F^w+n3mv+70$)_T}~pd!-$)udo~KpxtDD&R%7Q>?`f7?A7)f`)d0d`&xUg zz0MBX5j$!(+cCSvj@zwvo88W@ck_q%7~jJm=D)}H^55rQ;g9fr1|K*0R}KC( zgFkBU$BbH$ak(^*IF~W|vy7cLV|B<<4C9K%s1143XDR!nK}IP{nR0~?DKi!umhG=v z>RW;5=o=kAEE;iU)>!uSzV*HhzME>h{No+u2}gg`mG#mk#H@Os??!lA8z4$E#aV1D zG4xnr!&qwBq*d_{?Q0$OqaD7-I(%R6upjU6?eFkSbl6Ae+SdMYY*^v{2Oab{xQ+Xy zpr0IavGK%j67Z(lPY$WK5=}0rkE!+J|6t#{JDcvO1!IWi(*v1Qf3R;bnPa0F9X&+4 zM1kc8Y0p%)Nr)A3PDNlSn;DqX2t+@@g?g#liFLQY`m>|GLn%QHy0Toj?xn>S9Vch8 zWkQla(*6>Lp0ulHR=G&~tJu~{J1rnI>{Pi7g4pwmHvwC(;IGJfoy z6%OnQ!J!7xhVoS)eM>Y{nG?N@0B&c z<-QQT7J)|fRU3JW{<=Z;ld8>7QCHojn@F((3eivZ=@y~saZR$*2IkwPIs>)r&rwKj zKkijb7Xz|QbX(nB%%FXVSMH0LZPggH#u8|-XG->_nZY4@WbZ-J3bKc3MJniR6kS^` z77S|TBPG3`>f^@3c%ZSNiiK0qRSKZC5RKmPRI#wLXjTBVg;7M?7F8@(%{mo8ZLu1W zS*5a=k98{`?6oXWf$JE(J*r}{diJmas4cdL?XSRocC-R7W`9n&M<&E#OT^Hc!%Nu- zvL}^&8Jn!Y%h`Vuo>cZrm_-RL<4f5R!j7^xu+`(=6V&BoQ$1Kgh034Lf#ml+DUIJEqV48L872wxoa~a`R zf$7nsLijb{cO?|~$H4SLK!xl$8)gq`_$QDLX!sY9pVRQWkpEJ{{{@-apyHi|T-5OU zkU!Kg!@V@P_e0m`kXLHB9&%K}%OP*nF!^rR@G8jN8ombdpoW_v7c_hwVtzF*t(>pTrE;o4 zpHZl&u@F;>3cm14c5mn!Km@9){Ne?a7$&giI6zG=M-3PiY3;0_H_ zf81HdLD4^X4X<;bEmG0=X`hF;%)>i0?1#U6_GNV6k=-pz&|kj>4!Zosc)mU$JGBpaT8!uK z9ARpYz?U)u&n`q!=z8_;vrKM_@q8@@R^ylAw*ag0LU;qP8ZU%50qgN@n}_e8hn26} z1g$!sg)$30nJUb5NJxc+d-Hh~#;2Dg3*$qJsPlXB!>M5wmLEXEeRMF-!hKnMF=1gk zo@ZfkR-eq}l6zQqXEG;(pjL6pVj(p~)Ld#H+!+mLvh*4h&ZO{SIj5{d(ggwLJTwqL zUkoU<7-g3Vng(KR=L9EcAuuP>6*(L)&8FH!gl##c!MV zZ5O}Si{IvESxMjK7KtRMS(2J1t69>Tuahp49*YVTlTl(aN=!zH$tW=yB_^Z9WR#eU z5|dF{WRw;erA0<*kx^P?lolDKMMi0nQCeh_78xZjqr_#DxO?|9N?b;X%P4UfB`%}H zWt6y#(ki30$|$WeN~?_0DxZ8A!mjM65fw8pgfyM3}yRvg^4M?(NR+*8ZC&AcLF35_%561+_B~JiOwj~ z(9N6f+A>eo8DHp7q3XooS`Y%dUNI#l5~5Bd;DawRcXe;-ye)B8*Zo^`yycF~fPD$k z>)ScNaBUeKO!quTo%$$z{%?|A=%5q-Cg04K{7xGIiKpI|5ga^97@u9sA)!$ z1DO3W(+gUD(3NQUjccnleNLu7Ebn4}MD`wcAF15vU5iw-wrl%68hT z&>t1e4m6_250V{)V*e(Eu4Cg*Y-y<}01c#ci;73>D*Hj+H}BpQh0f>5&u#Gq{g%0Y zsLoqdJbK^JuPg3Z1&2+wZg~HwUOF!_9-Z7? z%yqjj(vQv~>7G<~(U_%is*1{A3W|%lE}dUqjNkr?^rQ36i-||)pk+Vxyg;Xl>Nh%i zCqFTs;U~t6GD5FJIyWuHbI(tqDi`H92@Uy)AqT$;^)H>Xmg7xo0~C5HDjuB=l-mct z3$<^F>nF(W`K*xL9~F9}--X&o@3D$QA;>R9la*VPjoxRKOs0ROFKwDaiS%Bp zWb*qJ9{fKNNhdUCqw@vbZ=avB9hyRkbnc*J;=i?+v0szm7Gk1A!qQ}Cl_eSVpO fA9YjEHGB?2S{nzXh6{Udp5HgFgkHZf*YAG;Wc(o< literal 0 HcmV?d00001 diff --git a/Tools/Linux_HAL_Essentials/startup.sh b/Tools/Linux_HAL_Essentials/startup.sh index fb6acc3934..8ce8b42d41 100755 --- a/Tools/Linux_HAL_Essentials/startup.sh +++ b/Tools/Linux_HAL_Essentials/startup.sh @@ -4,7 +4,7 @@ if [ "`echo $1`" = "load" ]; then cp BB-SPI1-SWP-01-00A0.dtbo /lib/firmware/ cp BB-BONE-PRU-05-00A0.dtbo /lib/firmware/ cp testpru0 /lib/firmware - cp testpru1 /lib/firmware + cp pwmpru1 /lib/firmware echo BB-BONE-PRU-05 > /sys/devices/bone_capemgr.*/slots echo BB-SPI0-SWP-01 > /sys/devices/bone_capemgr.*/slots echo BB-SPI1-SWP-01 > /sys/devices/bone_capemgr.*/slots @@ -14,8 +14,8 @@ if [ "`echo $1`" = "load" ]; then elif [ "`echo $1`" = "reload" ]; then echo "Loading Firmware..." cp testpru0 /lib/firmware - cp testpru1 /lib/firmware - echo 0:testpru0,1:testpru1 > /sys/devices/ocp.3/4a300000.prurproc/load + cp pwmpru1 /lib/firmware + echo 0:testpru0,1:pwmpru1 > /sys/devices/ocp.3/4a300000.prurproc/load else echo "Usage:" echo " ./startup.sh load : to load the capes and firmware" diff --git a/Tools/Linux_HAL_Essentials/testpru1 b/Tools/Linux_HAL_Essentials/testpru1 deleted file mode 100644 index 772fd126a54ba95e134f85b74b12ea2f7391edea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35832 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
    +%}x$jHfj{!qt!u4}mrU==V>0mepBVcM; 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 l{}299kN8->>o?}HM7to0+hY{_q}+#ZHReAlGO