10 #INCLUDE ONCE "w1_prucode.bi"
12 #INCLUDE ONCE "BBB/pruio_prussdrv.bi"
13 #INCLUDE ONCE "BBB/pruio_intc.bi"
16 #IFNDEF __PRUW1_MONITOR__
18 #MACRO PRUCALL(_C_,_V_,_T_)
19 WHILE DRam[0] :
SLEEP 1 :
WEND
21 DRam[0] = _C_ + PruLMod
22 WHILE DRam[0] :
SLEEP 1 :
WEND
26 #MACRO PRUCALL(_C_,_V_,_T_)
27 WHILE DRam[0] :
SLEEP 1 :
?"."; :
WEND
29 DRam[0] = _C_ + PruLMod
30 ?!
"\n";_T_;
" command=&h";
HEX(DRam[0], 4);
" ";
31 WHILE DRam[0] :
SLEEP 1 :
?"."; :
WEND
73 CONSTRUCTOR PruW1(
BYVAL P
AS PruIo
PTR,
BYVAL B
AS Uint8,
BYVAL M
AS Uint8 =
PRUW1_PULLUP)
74 IF 0 = P
ORELSE P->Errr
THEN Errr = @
"libpruio issue" :
EXIT CONSTRUCTOR
76 IF B >
UBOUND(.BallGpio)
THEN _
77 Errr = @
"invalid pin number" :
EXIT CONSTRUCTOR
78 IF .Gpio->config(B,
IIF(M
AND PRUW1_PULLUP, PRUIO_GPIO_IN_1, PRUIO_GPIO_IN))
THEN _
79 Errr = @
"pin configuration not matching" :
EXIT CONSTRUCTOR
80 VAR r = .BallGpio(B) _
85 Raw = @.Gpio->Raw(i)->Mix
86 PruLMod = M
AND PRUW1_PARPOW
89 PruIRam = PRUSS0_PRU0_IRAM
91 ram = PRUSS0_PRU0_DRAM
93 ram = PRUSS0_PRU1_DRAM
97 PruIRam = PRUSS0_PRU1_IRAM
100 prussdrv_map_prumem(ram,
CAST(
ANY PTR, @DRam))
102 prussdrv_pru_disable(PruNo)
104 DRam[1] = .Gpio->Conf(i)->DeAd + &h100
107 VAR l = (
UBOUND(Pru_W1) + 1) *
SIZEOF(Pru_W1(0))
108 IF 0 >= prussdrv_pru_write_memory(PruIRam, 0, @Pru_W1(0), l)
THEN _
109 Errr = @
"failed loading PRU firmware" :
EXIT CONSTRUCTOR
110 prussdrv_pru_enable(PruNo)
111 IF PruLMod
THEN SLEEP 1
123 prussdrv_pru_disable(PruNo)
145 FUNCTION PruW1.scanBus(
BYVAL SearchType
AS UInt8 = &hF0)
AS ZSTRING PTR
155 WHILE 0 = last_device
ANDALSO cnt < max_slave
158 IF resetBus()
THEN Errr = @
"no devices" :
RETURN Errr
160 FOR i
AS INTEGER = 0
TO 63
162 CASE desc_bit : search_bit = 1
163 CASE IS > desc_bit : search_bit = 0
164 CASE ELSE : search_bit = (last_rn
SHR i)
AND &b1
167 PRUCALL(CMD_TRIP + search_bit
SHL 8,,
"tripple:")
168 ret = DRam[4]
AND &b111
170 SELECT CASE AS CONST ret
171 CASE 0 : last_zero = i
172 CASE 3 :
CONTINUE WHILE
174 rn
OR=
CULNGINT(ret)
SHR 2 SHL i
176 IF desc_bit = last_zero
ORELSE last_zero < 0
THEN last_device = 1
178 VAR u =
UBOUND(Slots) + 1
179 REDIM PRESERVE Slots(u)
195 PRUCALL(CMD_SEND + 1
SHL 8,DRam[4] = V,
"sendByte: " &
HEX(V, 2) &
" (&b" &
BIN(V, 8) &
")")
208 PRUCALL(CMD_SEND + 8
SHL 8,*
CAST(
ULONGINT PTR, @DRam[4]) = V,
"sendRom: " &
HEX(
PEEK(
ULONGINT, @DRam[4]), 16))
228 #IFDEF __PRUW1_MONITOR__
229 IF N > 112
THEN Errr = @
"block too big (< 112 bytes in monitoring)" :
RETURN 0
231 PRUCALL(CMD_RECV + N
SHL 8,,
"recvBlock: " & N)
245 PRUCALL(CMD_RECV + 1
SHL 8,,
"recvByte: ")
246 RETURN DRam[4]
AND &hFF
260 RETURN IIF(*Raw
AND Mask, 1, 0)
276 PRUCALL(CMD_RESET,,
"resetBus:")
277 RETURN DRam[4]
AND &b1
295 VAR crc = 0, p =
CAST(
UBYTE PTR, @DRam[4])
296 FOR p = p
TO p + N - 1
297 crc = Crc8_Table(crc
XOR *p)
312 STATIC AS UInt32 p = LOG_BASE, b = 0
314 FOR i
AS INTEGER = 1
TO DRam[3]
315 IF BIT(DRam[p], b)
THEN ?"-";
ELSE ?"_";
316 IF 0 = i
MOD 70 THEN ?
317 IF b < 31
THEN b += 1
ELSE b = 0 :
IF p < 2047
THEN p += 1
ELSE p = LOG_BASE
335 IF resetBus()
THEN Errr = @
"no devices" :
RETURN 0
338 RETURN IIF(
BIT(
recvByte(), 0), 0, 1)
356 FUNCTION T_fam10(
BYVAL Rom
AS UBYTE PTR)
AS SHORT EXPORT
357 RETURN PEEK(
SHORT, Rom)
SHR 1 SHL 8 + (Rom[7] - Rom[6] - 4)
SHL 4
376 FUNCTION T_fam20(
BYVAL Rom
AS UBYTE PTR)
AS SHORT EXPORT
377 RETURN PEEK(
SHORT, Rom)
SHL 4