103 #DEFINE __PRUIO_COMPILING__
110 #INCLUDE ONCE "pruio_init.bi"
112 #INCLUDE ONCE "pruio_run.bi"
114 #INCLUDE ONCE "pruio_exit.bi"
117 #DEFINE ArrayBytes(_A_) (
UBOUND(_A_) + 1) *
SIZEOF(_A_)
120 DECLARE FUNCTION memcpy CDECL ALIAS "memcpy"(
BYVAL AS ANY PTR,
BYVAL AS ANY PTR,
BYVAL AS size_t)
AS ANY PTR
159 SELECT CASE AS CONST Pru
161 PruEvtout = PRU_EVTOUT_0
162 PruIRam = PRUSS0_PRU0_IRAM
163 PruDRam = PRUSS0_PRU0_DATARAM
164 ArmPruInt = ARM_PRU0_INTERRUPT
166 PruEvtout = PRU_EVTOUT_1
167 PruIRam = PRUSS0_PRU1_IRAM
168 PruDRam = PRUSS0_PRU1_DATARAM
169 ArmPruInt = ARM_PRU1_INTERRUPT
170 CASE ELSE : Errr = @
"unknown PRUSS - select 0 or 1" :
EXIT CONSTRUCTOR
175 IF prussdrv_open(PRUIO_EVNT)
THEN _
176 Errr = @
"failed opening uio5 interrupt" :
EXIT CONSTRUCTOR
178 prussdrv_map_prumem(PruDRam,
CAST(
ANY PTR, @DRam))
179 prussdrv_map_extmem(@ERam)
180 ESize = prussdrv_extmem_size()
181 EOffs = prussdrv_get_phys_addr(ERam)
183 VAR o = PRUIO_GPIO_OFFS
SHR 2 _
184 , l =
SIZEOF(GpioSet) * (PRUIO_GPIO_AZ + 1)
185 Gpio =
CAST(GpioSet
PTR, DRam + o)
186 IF 0 >= prussdrv_pru_write_memory(PruDRam, o,
CAST(uint32
PTR, @GpioInit(0)), l)
THEN _
187 Errr = @
"failed loading GPIO initialisation" :
EXIT CONSTRUCTOR
189 prussdrv_pru_disable(PruNo)
190 l = ArrayBytes(Pru_Init)
191 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_Init(0), l)
THEN _
192 Errr = @
"failed loading Pru_Init instructions" :
EXIT CONSTRUCTOR
193 prussdrv_pruintc_init(@IntcInit)
194 prussdrv_pru_enable(PruNo)
196 VAR a =
ABS((Av > 1) + (Av > 2) + (Av > 4) + (Av > 8))
SHL 2 _
197 , d = OpD
AND &h3FFFF
198 FOR i
AS INTEGER = 1
TO 8
200 .Confg = a + ((i - 1)
SHL 19)
201 .Delay = d + SaD
SHL 24
205 prussdrv_pru_wait_event(PRUIO_EVNT)
206 IF DRam[0] <> PRUIO_MSG_INIT_OK
THEN _
207 Errr = @
"failed executing Pru_Init instructions" :
EXIT CONSTRUCTOR
209 BallConf =
CAST(uint8
PTR, DRam) + PRUIO_BALL_OFFS
210 VAR p1 = DRam[1] - PRUIO_BALL_OFFS _
211 , p2 = p1 + (PRUIO_GPIO_AZ + 1) * PRUIO_GPIO_DATA _
212 , adc = DRam + p1 + p2
213 CSize = p2 +
iif(adc[0], PRUIO_ADC_DATA, PRUIO_ADC_EMPTY)
214 BallOrg =
ALLOCATE(CSize)
215 IF 0 = BallOrg
THEN Errr = @
"out of memory" :
EXIT CONSTRUCTOR
216 memcpy(BallOrg, BallConf, CSize)
217 AdcOrg = BallOrg + p2
218 GpioOrg = BallOrg + p1
220 BallRef = BallConf + PRUIO_BALL_AZ + 1
221 FOR i
AS INTEGER = 0
TO PRUIO_BALL_AZ
223 IF BIT(BallConf[i], 5)
THEN CONTINUE FOR
225 Gpio[y
SHR 5 AND &b11].OutE
AND=
NOT (1
SHL (y
AND &b11111))
227 FOR i
AS INTEGER = 0
TO UBOUND(P8_Pins)
229 IF (BallConf[x]
AND &b111) = 7
THEN BallRef[x] = BallGpio(x)
231 FOR i
AS INTEGER = 0
TO UBOUND(P9_Pins)
233 IF (BallConf[x]
AND &b111) = 7
THEN BallRef[x] = BallGpio(x)
252 prussdrv_pru_disable(PruNo)
255 memcpy(BallConf, BallOrg, CSize)
257 DRam[1] = PRUIO_BALL_OFFS
263 VAR l = ArrayBytes(Pru_Exit)
264 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_Exit(0), l)
THEN
265 Errr = @
"failed loading Pru_Exit instructions"
267 prussdrv_pruintc_init(@IntcInit)
268 prussdrv_pru_enable(PruNo)
269 prussdrv_pru_wait_event(PRUIO_EVNT)
270 IF DRam[0] <> PRUIO_MSG_EXIT_OK
THEN _
271 Errr = @
"failed executing Pru_Exit instructions"
273 IF Errr
THEN l =
FREEFILE :
OPEN ERR AS l :
PRINT #l, *Errr :
CLOSE #l
275 prussdrv_pru_disable(PruNo)
413 prussdrv_pru_disable(PruNo)
415 VAR c =
UBOUND(St_p), r = 0, n = 0, d = 0
416 FOR i
AS INTEGER = c - 1
TO 0 STEP -1
421 VAR opd = .Delay
AND &h3FFFF _
422 , smd = .Delay
SHR 24 _
423 , avr = (.Confg
SHR 2)
AND &b111
424 d += opd + 1 + (14 + smd) *
IIF(avr, 1
SHL avr, 1)
428 IF r < 1
THEN Errr = @
"no step active" :
RETURN Errr
433 Value =
CAST(uint16
PTR,
CAST(
ANY PTR, DRam) + PRUIO_ADC_BUFF) - 1
436 IF (Samples
SHL 1) > ESize
THEN _
437 Errr = @
"out of memory" :
RETURN Errr
438 d *= (ClDv + 1) * 417
440 IF Tmr <= d
THEN Errr = @
"sample rate too big" :
RETURN Errr
442 Value =
CAST(uint16
PTR, ERam)
445 StepMask = Mask
AND ((1
SHL c) - 1)
447 LslMode =
IIF(Mds < 4, Mds,
CAST(uint16, 4))
448 St_p(c).Delay =
IIF(
BIT(Mask, 31), r, 0)
450 c = PRUIO_ADC_OFFS
SHR 2
451 r =
OFFSETOF(PruIo, DRam)
452 IF 0 >= prussdrv_pru_write_memory(PruDRam, c, @Samples, r)
THEN _
453 Errr = @
"failed loading parameters" :
RETURN Errr
455 r = ArrayBytes(Pru_Run)
456 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_Run(0), r)
THEN _
457 Errr = @
"failed loading Pru_Run instructions" :
RETURN Errr
458 prussdrv_pruintc_init(@IntcInit)
459 prussdrv_pru_enable(PruNo)
461 c =
IIF(Samp < 2, PRUIO_MSG_IO_OK, PRUIO_MSG_MM_WAIT)
462 prussdrv_pru_wait_event(PRUIO_EVNT)
463 IF DRam[0] <> c
THEN _
464 Errr = @
"failed executing Pru_Run instructions" :
RETURN Errr
466 IF Samp < 2
THEN RETURN 0
468 prussdrv_pru_clear_event(PRUIO_EVNT, PRUIO_IRPT)
469 prussdrv_pru_send_event(ArmPruInt)
508 ,
BYVAL ChN
AS uint8 _
513 IF Stp >
UBOUND(St_p)
THEN Errr = @
"step number too big" :
RETURN Errr
514 IF ChN > 7
THEN Errr = @
"channel number too big" :
RETURN Errr
517 VAR a =
ABS((Av > 1) + (Av > 2) + (Av > 4) + (Av > 8))
518 .Confg = (a
SHL 2) + (ChN
SHL 19)
519 .Delay = (OpD
AND &h3FFFF) + (SaD
SHL 24)
525 #DEFINE BallCheck(_T_,_R_)
IF Ball > PRUIO_BALL_AZ
THEN Errr = @
"unknown" _T_
" pin number" :
RETURN _R_
548 STATIC AS STRING*50 t
550 SELECT CASE AS CONST Ball
555 CASE 36 : t =
"P8_07"
556 CASE 37 : t =
"P8_08"
557 CASE 39 : t =
"P8_09"
558 CASE 38 : t =
"P8_10"
559 CASE 13 : t =
"P8_11"
560 CASE 12 : t =
"P8_12"
562 CASE 10 : t =
"P8_14"
563 CASE 15 : t =
"P8_15"
564 CASE 14 : t =
"P8_16"
565 CASE 11 : t =
"P8_17"
566 CASE 35 : t =
"P8_18"
568 CASE 33 : t =
"P8_20"
569 CASE 32 : t =
"P8_21"
574 CASE 31 : t =
"P8_26"
575 CASE 56 : t =
"P8_27"
576 CASE 58 : t =
"P8_28"
577 CASE 57 : t =
"P8_29"
578 CASE 59 : t =
"P8_30"
579 CASE 54 : t =
"P8_31"
580 CASE 55 : t =
"P8_32"
581 CASE 53 : t =
"P8_33"
582 CASE 51 : t =
"P8_34"
583 CASE 52 : t =
"P8_35"
584 CASE 50 : t =
"P8_36"
585 CASE 48 : t =
"P8_37"
586 CASE 49 : t =
"P8_38"
587 CASE 46 : t =
"P8_39"
588 CASE 47 : t =
"P8_40"
589 CASE 44 : t =
"P8_41"
590 CASE 45 : t =
"P8_42"
591 CASE 42 : t =
"P8_43"
592 CASE 43 : t =
"P8_44"
593 CASE 40 : t =
"P8_45"
594 CASE 41 : t =
"P8_46"
595 CASE 28 : t =
"P9_11"
596 CASE 30 : t =
"P9_12"
597 CASE 29 : t =
"P9_13"
598 CASE 18 : t =
"P9_14"
599 CASE 16 : t =
"P9_15"
600 CASE 19 : t =
"P9_16"
601 CASE 87 : t =
"P9_17"
602 CASE 86 : t =
"P9_18"
603 CASE 95 : t =
"P9_19"
604 CASE 94 : t =
"P9_20"
605 CASE 85 : t =
"P9_21"
606 CASE 84 : t =
"P9_22"
607 CASE 17 : t =
"P9_23"
608 CASE 97 : t =
"P9_24"
609 CASE 107 : t =
"P9_25"
610 CASE 96 : t =
"P9_26"
611 CASE 105 : t =
"P9_27"
612 CASE 103 : t =
"P9_28"
613 CASE 101 : t =
"P9_29"
614 CASE 102 : t =
"P9_30"
615 CASE 100 : t =
"P9_31"
616 CASE 109 : t =
"P9_41"
617 CASE 89 : t =
"P9_42"
620 t =
"b " &
RIGHT(
"00" & Ball, 3)
623 VAR r = BallConf[Ball], m = r
AND &b111, g = BallGpio(Ball)
SHR 5
625 t &=
", GPIO " & g &
"/" &
RIGHT(
"0" & (BallGpio(Ball)
AND 31), 2)
626 t &= *
IIF(
BIT(r, 5), @
": input", @
": output")
630 IF BIT(r, 4)
THEN t &=
", pullup" ELSE t &=
", pulldown"
635 IF BallRef[Ball] = 255
THEN t &=
" (locked)"
695 BYVAL Ball
AS uint8 _
701 SELECT CASE AS CONST Lokk
702 CASE PRUIO_UNLOCK_CURR
703 BallRef[Ball] = BallGpio(Ball) :
RETURN 0
705 BallRef[Ball] = 255 :
RETURN 0
706 CASE PRUIO_UNLOCK_ORIG
707 BallConf[Ball] =
PEEK(BallOrg + Ball)
708 BallRef[Ball] = BallGpio(Ball)
710 BallConf[Ball] =
PEEK(BallOrg + Ball)
713 SELECT CASE AS CONST Lokk
714 CASE PRUIO_UNLOCK_NEW
715 BallRef[Ball] = BallGpio(Ball)
719 IF 255 = BallRef[Ball]
THEN Errr = @
"pin locked" :
RETURN Errr
722 VAR r = BallGpio(Ball)
723 IF Modus = PRUIO_PIN_RESET
THEN
724 BallConf[Ball] =
PEEK(BallOrg + Ball)
726 BallConf[Ball] = Modus
AND &b1111111
727 IF BIT(Modus, 5)
THEN
728 Gpio[r
SHR 5].OutE
OR= 1
SHL (r
AND 31)
730 Gpio[r
SHR 5].OutE
AND=
NOT (1
SHL (r
AND 31))
731 IF BIT(Modus, 7)
THEN
732 Gpio[r
SHR 5].SetM
OR= 1
SHL (r
AND 31)
734 Gpio[r
SHR 5].ClrM
OR= 1
SHL (r
AND 31)
740 IF DRam[0] <> PRUIO_MSG_IO_OK
THEN RETURN 0
741 WHILE DRam[1] <> PRUIO_MSG_INIT_OK :
WEND : DRam[1] = Ball
OR (1
SHL 31)
773 VAR r = BallRef[Ball]
774 RETURN IIF(Gpio[r
SHR 5].Stat
AND (1
SHL (r
AND 31)), 1, 0)
801 BYVAL Ball
AS uint8 _
802 ,
BYVAL Modus
AS uint8 = 0)
AS ZSTRING PTR
804 BallCheck(
" output", Errr)
805 IF BIT(BallConf[Ball], 5)
THEN Errr = @
"input pin" :
RETURN Errr
806 VAR r = BallRef[Ball]
807 IF r = 255
THEN Errr = @
"output pin locked" :
RETURN Errr
809 Gpio[r
SHR 5].SetM
OR= 1
SHL (r
AND 31)
811 Gpio[r
SHR 5].ClrM
OR= 1
SHL (r
AND 31)
836 BYVAL Ball
AS uint8 _
837 ,
BYVAL GpioV
AS uint8 = 0 _
838 ,
BYVAL Skip
AS uint16 = 0)
AS uint32
840 BallCheck(
" trigger", 0)
841 IF 7 <> (BallConf[Ball]
AND &b111)
THEN _
842 Errr = @
"pin must be in GPIO mode (mode 7)" :
RETURN 0
843 IF Skip > 1023
THEN Errr = @
"too much values to skip" :
RETURN 0
845 DIM AS uint32 r = (1
SHL 21) _
847 +
IIF(GpioV = 0, 1
SHL 7, 0) _
849 IF Skip
THEN r += (1
SHL 5) _
911 ,
BYVAL AdcV
AS int32 _
912 ,
BYVAL Rela
AS uint8 = 0 _
913 ,
BYVAL Skip
AS uint16 = 0)
AS uint32
915 IF Stp < 1
ORELSE Stp > 16
THEN Errr = @
"invalid step number" :
RETURN 0
916 IF 0 = St_p(Stp).Confg
THEN _
917 Errr = @
"trigger step not configured" :
RETURN 0
918 IF Skip > 1023
THEN Errr = @
"too much values to skip" :
RETURN 0
920 VAR v =
ABS(AdcV)
SHR LslMode
921 IF v < &hF
THEN v = &hF
ELSE IF v > &hFF0
THEN v = &hFF0
923 DIM AS uint32 r = Stp - 1 _
925 +
IIF(AdcV < 0, 1
SHL 7, 0) _
926 +
IIF(Rela, 1
SHL 6, 0) _
928 IF Skip
THEN r += (Skip
SHL 22) _
994 ,
BYVAL AdcV
AS int32 _
995 ,
BYVAL Samp
AS uint16 = 0 _
996 ,
BYVAL Rela
AS uint8 = 0)
AS uint32
998 IF Stp > 16
THEN Errr = @
"invalid step number" :
RETURN 0
999 IF Stp
andalso 0 = St_p(Stp).Confg
THEN _
1000 Errr = @
"trigger step not configured" :
RETURN 0
1001 IF Stp
ANDALSO 0 = (StepMask
AND (1
SHL Stp))
THEN _
1002 Errr = @
"trigger step not activated" :
RETURN 0
1003 VAR t = (Samp + 1) * ChAz
1004 IF t > ((16384 - PRUIO_ADC_OFFS)
SHR 1)
THEN _
1005 Errr = @
"too much pre-samples" :
RETURN 0
1006 IF t > Samples
THEN Errr = @
"more pre-samples than samples" :
RETURN 0
1008 VAR v =
ABS(AdcV)
SHR LslMode
1009 IF v < &hF
THEN v = &hF
ELSE IF v > &hFF0
THEN v = &hFF0
1011 DIM AS uint32 r = (Samp
SHL 22) _
1013 +
IIF(AdcV < 0, 1
SHL 7, 0)
1014 IF 0 = Stp
THEN r += (1
SHL 20) _
1016 +
IIF(Rela, 1
SHL 6, 0)
1048 BYVAL Trg1
AS uint32 = 0 _
1049 ,
BYVAL Trg2
AS uint32 = 0 _
1050 ,
BYVAL Trg3
AS uint32 = 0 _
1051 ,
BYVAL Trg4
AS uint32 = 0)
AS ZSTRING PTR
1053 IF DRam[0] <> PRUIO_MSG_MM_WAIT
THEN _
1054 Errr = @
"measurement mode not ready" :
RETURN Errr
1056 STATIC AS uint32 tmin = (1
SHL 22), t_pin
1059 #DEFINE PRUIO_PRE_TRIG(_T_) Trg##_T_ >= tmin
ANDALSO 0 = (Trg##_T_
AND (1
SHL 4))
THEN : _
1060 IF BIT(Trg##_T_, 20)
ORELSE BIT(StepMask, (Trg##_T_
AND &b1111) + 1)
THEN : _
1061 VAR n = (Trg##_T_
SHR 22) * ChAz : _
1062 IF n < Samples
THEN : DRam[3] = n
SHL 1 : _
1063 ELSE : Errr = @
"Trg" #_T_
": too much pre-trigger samples" :
RETURN Errr : _
1065 ELSE : Errr = @
"Trg" #_T_
": pre-trigger step must be active" :
RETURN Errr : _
1068 #DEFINE PRUIO_GPIO_TRIG(_T_)
BIT(Trg##_T_, 21)
THEN : _
1069 t_pin = (Trg##_T_
SHR 8)
AND &b1111111 : _
1070 IF t_pin > PRUIO_BALL_AZ
THEN _
1071 Errr = @
"Trg" #_T_
": unknown trigger pin number" :
RETURN Errr : _
1073 IF BallConf[t_pin]
AND &b111 <> 7
THEN _
1074 Errr = @
"Trg" #_T_
": trigger pin must be in mode 7 (GPIO)" :
RETURN Errr : _
1075 ELSE Trg##_T_
AND= &b11111111111100000000000011111111uL : _
1076 Trg##_T_
OR= BallGpio(t_pin)
SHL 8 : _
1081 IF PRUIO_PRE_TRIG(1)
1083 IF PRUIO_GPIO_TRIG(1)
1085 IF PRUIO_PRE_TRIG(2)
1087 IF PRUIO_GPIO_TRIG(2)
1089 IF PRUIO_PRE_TRIG(3)
1091 IF PRUIO_GPIO_TRIG(3)
1093 IF PRUIO_PRE_TRIG(4)
1095 IF PRUIO_GPIO_TRIG(4)
1112 prussdrv_pru_clear_event(PruEvtout, ArmPruInt)
1114 prussdrv_pru_wait_event(PRUIO_EVNT)
1115 prussdrv_pru_clear_event(PRUIO_EVNT, PRUIO_IRPT)
1116 prussdrv_pru_send_event(ArmPruInt)