102 #DEFINE __PRUIO_COMPILING__
104 #DEFINE PMUX_NAME
"pruio-"
118 #INCLUDE ONCE "pasm_init.bi"
120 #INCLUDE ONCE "pasm_run.bi"
122 #INCLUDE ONCE "dir.bi"
125 DECLARE FUNCTION memcpy CDECL ALIAS "memcpy"(
BYVAL AS ANY PTR,
BYVAL AS ANY PTR,
BYVAL AS size_t)
AS ANY PTR
197 IF OPEN(
"/dev/uio5" FOR OUTPUT AS fnr)
THEN _
198 Errr = @
"cannot open /dev/uio5" :
EXIT CONSTRUCTOR
201 VAR p =
"/sys/devices/" _
202 , n =
DIR(p &
"ocp.*", fbDirectory)
203 IF LEN(n)
THEN MuxAcc = p & n &
"/"
205 IF Act
AND PRUIO_ACT_PRU1
THEN
206 PruIRam = PRUSS0_PRU1_IRAM
207 PruDRam = PRUSS0_PRU1_DATARAM
208 PruEvtOut = PRU_EVTOUT_1
209 ArmPruInt = ARM_PRU1_INTERRUPT
212 PruIRam = PRUSS0_PRU0_IRAM
213 PruDRam = PRUSS0_PRU0_DATARAM
214 PruEvtOut = PRU_EVTOUT_0
215 ArmPruInt = ARM_PRU0_INTERRUPT
219 IF prussdrv_open(PRUIO_EVNT)
THEN _
220 Errr = @
"failed opening prussdrv library" :
EXIT CONSTRUCTOR
222 prussdrv_map_prumem(PruDRam,
CAST(
ANY PTR, @DRam))
223 prussdrv_map_extmem(@ERam)
224 ESize = prussdrv_extmem_size()
225 EAddr = prussdrv_get_phys_addr(ERam)
227 DRam[1] = PRUIO_DAT_ALL
234 Adc =
NEW AdcUdt(@
THIS)
235 Gpio =
NEW GpioUdt(@
THIS)
238 ParOffs += 1 : DRam[ParOffs] = &h44E10800
240 PwmSS =
NEW PwmssUdt(@
THIS)
243 ASSERT(ParOffs < DRam[1]
SHR 4)
244 prussdrv_pru_disable(PruNo)
245 VAR l = ArrayBytes(Pru_Init)
246 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_Init(0), l)
THEN _
247 Errr = @
"failed loading Pru_Init instructions" :
EXIT CONSTRUCTOR
248 prussdrv_pruintc_init(@IntcInit)
249 prussdrv_pru_enable(PruNo)
251 Pwm =
NEW PwmMod(@
THIS)
252 Cap =
NEW CapMod(@
THIS)
256 prussdrv_pru_wait_event(PRUIO_EVNT)
257 IF DRam[0] <> PRUIO_MSG_INIT_OK
THEN _
258 Errr = @
"failed executing Pru_Init instructions" :
EXIT CONSTRUCTOR
260 DSize = DRam[ParOffs] - DRam[1]
261 DInit =
ALLOCATE(DSize * 2)
262 IF 0 = DInit
THEN Errr = @
"out of memory" :
EXIT CONSTRUCTOR
264 MOffs = DInit - DRam[1]
265 DConf = DInit + DSize
266 VAR p0 =
CAST(
ANY PTR, DRam) + DRam[1]
270 Init = MOffs + DRam[offs]
271 Conf =
CAST(
ANY PTR, Init) + DSize
272 BallInit =
CAST(
ANY PTR, Init) +
OFFSETOF(BallSet, Value(0))
273 BallConf = BallInit + DSize
275 IF Adc->initialize(Av, OpD, SaD)
THEN EXIT CONSTRUCTOR
276 IF Gpio->initialize()
THEN EXIT CONSTRUCTOR
277 IF PwmSS->initialize()
THEN EXIT CONSTRUCTOR
299 prussdrv_pru_disable(PruNo)
302 FOR i
AS LONG = 0
TO PRUIO_AZ_BALL
303 IF BallInit[i] = BallConf[i]
THEN CONTINUE FOR
304 IF setPin(i, BallInit[i])
THEN mux &= !
"\n" & *Errr
308 DRam[1] = PRUIO_DAT_ALL
309 memcpy(
CAST(
ANY PTR, DRam) + DRam[1], DInit, DSize)
314 VAR l = ArrayBytes(Pru_Run)
315 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_Run(0), l)
THEN
316 Errr = @
"failed loading Pru_Exit instructions"
318 prussdrv_pruintc_init(@IntcInit)
319 prussdrv_pru_enable(PruNo)
320 prussdrv_pru_wait_event(PRUIO_EVNT)
321 IF DRam[0] <> PRUIO_MSG_CONF_OK
THEN _
322 Errr = @
"failed executing Pru_Exit instructions"
325 Errr = @
"destructor warning: subsystems are NOT restored"
327 prussdrv_pru_disable(PruNo)
330 Errr = @
"destructor warning: constructor failed"
334 VAR fnr =
FREEFILE :
OPEN ERR AS fnr :
PRINT #fnr,
MID(mux, 2) :
CLOSE #fnr
336 VAR fnr =
FREEFILE :
OPEN ERR AS fnr :
PRINT #fnr, *Errr :
CLOSE #fnr
456 prussdrv_pru_disable(PruNo)
457 IF Adc->configure(Samp, Mask, Tmr, Mds)
THEN RETURN Errr
459 DRam[1] = PRUIO_DAT_ALL
460 memcpy(
CAST(
ANY PTR, DRam) + DRam[1], DConf, DSize)
462 VAR l = ArrayBytes(Pru_Run)
463 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_Run(0), l)
THEN _
464 Errr = @
"failed loading Pru_Run instructions" :
RETURN Errr
465 prussdrv_pruintc_init(@IntcInit)
466 prussdrv_pru_enable(PruNo)
467 prussdrv_pru_wait_event(PRUIO_EVNT)
468 SELECT CASE AS CONST Samp
469 CASE 0 : l = DRam[0] <> PRUIO_MSG_CONF_OK
470 CASE 1 : l = DRam[0] <> PRUIO_MSG_IO_OK
471 CASE ELSE : l = DRam[0] <> PRUIO_MSG_MM_WAIT
473 IF l
THEN ?" MURX: " & DRam[0] : _
474 Errr = @
"failed executing Pru_Run instructions" :
RETURN Errr
475 IF Samp < 2
THEN RETURN 0
477 prussdrv_pru_clear_event(PRUIO_EVNT, PRUIO_IRPT)
478 prussdrv_pru_send_event(ArmPruInt)
505 BYVAL Ball
AS UInt8, _
506 BYVAL Mo
AS UInt32 = 0)
AS ZSTRING PTR
507 STATIC AS STRING*50 t
509 VAR x = nameBall(Ball)
513 IF Ball > PRUIO_AZ_BALL
THEN _
514 Errr = @
"unknown pin number" :
RETURN Errr
515 t =
"b " &
RIGHT(
"00" & Ball, 3)
518 VAR r =
IIF(Mo, BallInit[Ball], BallConf[Ball]) _
521 VAR i = BallGpio(Ball)
SHR 5 _
522 , n = BallGpio(Ball)
AND 31 _
524 t &=
", GPIO " & i &
"/" &
RIGHT(
"0" & n, 2)
528 WITH *
IIF(Mo, Gpio->Init(i), Gpio->Conf(i))
529 t &=
": output-" & *
IIF((.DATAOUT
OR .SETDATAOUT)
AND m, @
"1", @
"0")
534 &
": input " & *
IIF(
BIT(r, 5), @
"enabled", @
"disabled")
540 IF BIT(r, 4)
THEN t &=
", pullup" ELSE t &=
", pulldown"
572 BYVAL Ball
AS UInt8 _
573 ,
BYVAL Mo
AS UInt8)
AS ZSTRING PTR
575 IF Ball > PRUIO_AZ_BALL
THEN _
576 Errr = @
"unknown setPin ball number" :
RETURN Errr
578 VAR m =
IIF(Mo = PRUIO_PIN_RESET, BallInit[Ball], Mo)
579 if BallConf[Ball] = m
then RETURN 0
581 IF 0 =
LEN(MuxAcc)
THEN Errr = @
"no ocp.* access" :
RETURN Errr
583 VAR p =
DIR(MuxAcc &
"/" & PMUX_NAME &
HEX(Ball, 2) &
".*", fbDirectory)
584 IF 0 =
LEN(p)
THEN Errr = @
"no pin control" :
RETURN Errr
587 , r =
SHELL(
"echo x" & h &
" > " & MuxAcc & p &
"/state")
588 IF 0 = r
THEN BallConf[Ball] = m :
RETURN 0
590 STATIC AS STRING*30 e =
"pinmux failed: P._.. -> x.."
591 VAR x = nameBall(Ball)
592 if x
then MID(e, 16, 5) = *x
else MID(e, 16, 5) =
"bal" &
HEX(Ball, 2)
593 MID(e, 26, 2) = h : Errr =
SADD(e) :
RETURN Errr
611 SELECT CASE AS CONST Ball
612 CASE 6 :
RETURN @
"P8_03"
613 CASE 7 :
RETURN @
"P8_04"
614 CASE 2 :
RETURN @
"P8_05"
615 CASE 3 :
RETURN @
"P8_06"
616 CASE 36 :
RETURN @
"P8_07"
617 CASE 37 :
RETURN @
"P8_08"
618 CASE 39 :
RETURN @
"P8_09"
619 CASE 38 :
RETURN @
"P8_10"
620 CASE 13 :
RETURN @
"P8_11"
621 CASE 12 :
RETURN @
"P8_12"
622 CASE 9 :
RETURN @
"P8_13"
623 CASE 10 :
RETURN @
"P8_14"
624 CASE 15 :
RETURN @
"P8_15"
625 CASE 14 :
RETURN @
"P8_16"
626 CASE 11 :
RETURN @
"P8_17"
627 CASE 35 :
RETURN @
"P8_18"
628 CASE 8 :
RETURN @
"P8_19"
629 CASE 33 :
RETURN @
"P8_20"
630 CASE 32 :
RETURN @
"P8_21"
631 CASE 5 :
RETURN @
"P8_22"
632 CASE 4 :
RETURN @
"P8_23"
633 CASE 1 :
RETURN @
"P8_24"
634 CASE 0 :
RETURN @
"P8_25"
635 CASE 31 :
RETURN @
"P8_26"
636 CASE 56 :
RETURN @
"P8_27"
637 CASE 58 :
RETURN @
"P8_28"
638 CASE 57 :
RETURN @
"P8_29"
639 CASE 59 :
RETURN @
"P8_30"
640 CASE 54 :
RETURN @
"P8_31"
641 CASE 55 :
RETURN @
"P8_32"
642 CASE 53 :
RETURN @
"P8_33"
643 CASE 51 :
RETURN @
"P8_34"
644 CASE 52 :
RETURN @
"P8_35"
645 CASE 50 :
RETURN @
"P8_36"
646 CASE 48 :
RETURN @
"P8_37"
647 CASE 49 :
RETURN @
"P8_38"
648 CASE 46 :
RETURN @
"P8_39"
649 CASE 47 :
RETURN @
"P8_40"
650 CASE 44 :
RETURN @
"P8_41"
651 CASE 45 :
RETURN @
"P8_42"
652 CASE 42 :
RETURN @
"P8_43"
653 CASE 43 :
RETURN @
"P8_44"
654 CASE 40 :
RETURN @
"P8_45"
655 CASE 41 :
RETURN @
"P8_46"
656 CASE 28 :
RETURN @
"P9_11"
657 CASE 30 :
RETURN @
"P9_12"
658 CASE 29 :
RETURN @
"P9_13"
659 CASE 18 :
RETURN @
"P9_14"
660 CASE 16 :
RETURN @
"P9_15"
661 CASE 19 :
RETURN @
"P9_16"
662 CASE 87 :
RETURN @
"P9_17"
663 CASE 86 :
RETURN @
"P9_18"
664 CASE 95 :
RETURN @
"P9_19"
665 CASE 94 :
RETURN @
"P9_20"
666 CASE 85 :
RETURN @
"P9_21"
667 CASE 84 :
RETURN @
"P9_22"
668 CASE 17 :
RETURN @
"P9_23"
669 CASE 97 :
RETURN @
"P9_24"
670 CASE 107 :
RETURN @
"P9_25"
671 CASE 96 :
RETURN @
"P9_26"
672 CASE 105 :
RETURN @
"P9_27"
673 CASE 103 :
RETURN @
"P9_28"
674 CASE 101 :
RETURN @
"P9_29"
675 CASE 102 :
RETURN @
"P9_30"
676 CASE 100 :
RETURN @
"P9_31"
677 CASE 109 :
RETURN @
"P9_41"
678 CASE 89 :
RETURN @
"P9_42"
679 END SELECT :
RETURN 0
700 IF DRam[0] <> PRUIO_MSG_MM_WAIT
THEN _
701 Errr = @
"ring buffer mode not ready" :
RETURN Errr
703 DRam[1] = Adc->Samples
SHL 1
708 prussdrv_pru_clear_event(PruEvtOut, ArmPruInt)
743 BYVAL Trg1
AS UInt32 = 0 _
744 ,
BYVAL Trg2
AS UInt32 = 0 _
745 ,
BYVAL Trg3
AS UInt32 = 0 _
746 ,
BYVAL Trg4
AS UInt32 = 0)
AS ZSTRING PTR
748 IF DRam[0] <> PRUIO_MSG_MM_WAIT
THEN _
749 Errr = @
"measurement mode not ready" :
RETURN Errr
751 STATIC AS UInt32 tmin = (1
SHL 22), t_pin
754 #DEFINE PRUIO_PRE_TRIG(_T_) Trg##_T_ >= tmin
ANDALSO (Trg##_T_
AND (1
SHL 4))
THEN : _
755 IF BIT(Trg##_T_, 5)
ORELSE BIT(Adc->Conf->STEPENABLE, (Trg##_T_
AND &b1111) + 1)
THEN : _
756 VAR n = (Trg##_T_
SHR 22) * Adc->ChAz : _
757 IF n < Adc->Samples
THEN : DRam[3] = n
SHL 1 : _
758 ELSE : Errr = @
"Trg" #_T_
": too much pre-trigger samples" :
RETURN Errr : _
760 ELSE : Errr = @
"Trg" #_T_
": pre-trigger step must be active" :
RETURN Errr : _
763 #DEFINE PRUIO_GPIO_TRIG(_T_)
BIT(Trg##_T_, 21)
THEN : _
764 t_pin = (Trg##_T_
SHR 8)
AND &b1111111 : _
765 IF t_pin > PRUIO_AZ_BALL
THEN _
766 Errr = @
"Trg" #_T_
": unknown trigger pin number" :
RETURN Errr : _
768 IF BallConf[t_pin]
AND &b111 <> 7
THEN _
769 Errr = @
"Trg" #_T_
": trigger pin must be in mode 7 (GPIO)" :
RETURN Errr : _
770 ELSE Trg##_T_
AND= &b11111111111100000000000011111111uL : _
771 Trg##_T_
OR= BallGpio(t_pin)
SHL 8 : _
778 IF PRUIO_GPIO_TRIG(1)
782 IF PRUIO_GPIO_TRIG(2)
786 IF PRUIO_GPIO_TRIG(3)
790 IF PRUIO_GPIO_TRIG(4)
807 prussdrv_pru_clear_event(PruEvtOut, ArmPruInt)
809 prussdrv_pru_wait_event(PRUIO_EVNT)
810 prussdrv_pru_clear_event(PRUIO_EVNT, PRUIO_IRPT)
811 prussdrv_pru_send_event(ArmPruInt)