41
41
"""
42
42
43
43
import time
44
- import adafruit_bus_device .spi_device as spidev
45
44
from micropython import const
46
45
46
+ from adafruit_bus_device .spi_device import SPIDevice
47
47
import adafruit_wiznet5k .adafruit_wiznet5k_dhcp as dhcp
48
48
49
49
113
113
SOCK_SIZE = const (0x800 ) # MAX W5k socket size
114
114
# Register commands
115
115
MR_RST = const (0x80 ) # Mode Register RST
116
+ # Socket mode register
117
+ SNMR_CLOSE = const (0x00 )
118
+ SNMR_TCP = const (0x21 )
119
+ SNMR_UDP = const (0x02 )
120
+ SNMR_IPRAW = const (0x03 )
121
+ SNMR_MACRAW = const (0x04 )
122
+ SNMR_PPPOE = const (0x05 )
116
123
117
124
# pylint: enable=bad-whitespace
118
-
125
+ MAX_PACKET = const (4000 )
126
+ LOCAL_PORT = const (0x400 )
119
127
# Default hardware MAC address
120
128
DEFAULT_MAC = (0xDE , 0xAD , 0xBE , 0xEF , 0xFE , 0xED )
121
129
122
130
# Maximum number of sockets to support, differs between chip versions.
123
131
W5200_W5500_MAX_SOCK_NUM = const (0x08 )
124
132
125
- # UDP Socket Struct .
133
+ # UDP socket struct .
126
134
UDP_SOCK = {'bytes_remaining' : 0 ,
127
135
'remote_ip' : 0 ,
128
136
'remote_port' : 0 }
@@ -138,24 +146,14 @@ class WIZNET:
138
146
139
147
"""
140
148
141
- # pylint: disable=bad-whitespace
142
- # Socket registers
143
- SNMR_CLOSE = const (0x00 )
144
- SNMR_TCP = const (0x21 )
145
- SNMR_UDP = const (0x02 )
146
- SNMR_IPRAW = const (0x03 )
147
- SNMR_MACRAW = const (0x04 )
148
- SNMR_PPPOE = const (0x05 )
149
- # pylint: enable=bad-whitespace
150
-
151
- # pylint: disable=too-many-arguments
149
+ # pylint: disable=too-many-arguments, too-many-public-methods
152
150
def __init__ (self , spi_bus , cs , reset = None ,
153
151
is_dhcp = True , mac = DEFAULT_MAC , debug = True ):
154
152
self ._debug = debug
155
153
self ._chip_type = None
156
- self ._device = spidev . SPIDevice (spi_bus , cs ,
157
- baudrate = 8000000 ,
158
- polarity = 0 , phase = 0 )
154
+ self ._device = SPIDevice (spi_bus , cs ,
155
+ baudrate = 8000000 ,
156
+ polarity = 0 , phase = 0 )
159
157
# init c.s.
160
158
self ._cs = cs
161
159
@@ -166,11 +164,16 @@ def __init__(self, spi_bus, cs, reset=None,
166
164
reset .value = False
167
165
time .sleep (0.1 )
168
166
167
+ # Buffer for reading from module
168
+ self ._pbuff = bytearray (8 )
169
+
169
170
# attempt to initialize the module
171
+ self ._ch_base_msb = 0
170
172
assert self ._w5100_init () == 1 , "Failed to initialize WIZnet module."
171
173
# Set MAC address
172
174
self .mac_address = mac
173
175
self ._src_port = 0
176
+ self ._dns = 0
174
177
# Set DHCP
175
178
if is_dhcp :
176
179
self .set_dhcp ()
@@ -192,7 +195,7 @@ def set_dhcp(self, response_timeout=1):
192
195
if self ._debug :
193
196
print ("* Found DHCP server - setting configuration..." )
194
197
_ip = (_dhcp_client .local_ip [0 ], _dhcp_client .local_ip [1 ],
195
- _dhcp_client .local_ip [2 ], _dhcp_client .local_ip [3 ])
198
+ _dhcp_client .local_ip [2 ], _dhcp_client .local_ip [3 ])
196
199
197
200
_subnet_mask = (_dhcp_client .subnet_mask [0 ], _dhcp_client .subnet_mask [1 ],
198
201
_dhcp_client .subnet_mask [2 ], _dhcp_client .subnet_mask [3 ])
@@ -201,7 +204,7 @@ def set_dhcp(self, response_timeout=1):
201
204
_dhcp_client .gateway_ip [2 ], _dhcp_client .gateway_ip [3 ])
202
205
203
206
_dns_addr = (_dhcp_client .dns_server_ip [0 ], _dhcp_client .dns_server_ip [1 ],
204
- _dhcp_client .dns_server_ip [2 ], _dhcp_client .dns_server_ip [3 ])
207
+ _dhcp_client .dns_server_ip [2 ], _dhcp_client .dns_server_ip [3 ])
205
208
self .ifconfig = ((_ip , _subnet_mask , _gw_addr , _dns_addr ))
206
209
return 0
207
210
# Reset SRC_Port
@@ -258,12 +261,11 @@ def remote_ip(self, socket_num):
258
261
:param int socket num: Desired socket.
259
262
260
263
"""
261
- remote_ip = bytearray (4 )
262
264
if socket_num >= self .max_sockets :
263
- return remote_ip
265
+ return self . _pbuff
264
266
for octet in range (0 , 4 ):
265
- remote_ip [octet ] = self ._read_socket (socket_num , REG_SNDIPR + octet )[0 ]
266
- return self .pretty_ip (remote_ip )
267
+ self . _pbuff [octet ] = self ._read_socket (socket_num , REG_SNDIPR + octet )[0 ]
268
+ return self .pretty_ip (self . _pbuff )
267
269
268
270
@property
269
271
def link_status (self ):
@@ -278,16 +280,19 @@ def remote_port(self):
278
280
"""Returns the port of the host who sent the current incoming packet.
279
281
280
282
"""
281
- return self ._remote_port
283
+ return self .remote_port
282
284
283
285
@property
284
286
def ifconfig (self ):
285
287
"""Returns the network configuration as a tuple."""
288
+ # set subnet and gateway addresses
286
289
for octet in range (0 , 4 ):
287
- subnet_mask = self .read (REG_SUBR + octet , 0x00 )
288
- params = (self .ip_address , subnet_mask , 0 , self ._dns )
290
+ subnet_mask += self .read (REG_SUBR + octet , 0x04 , subnet_mask [octet ])
291
+ gw_addr += self .read (REG_GAR + octet , 0x04 , gw_addr [octet ])
292
+ params = (self .ip_address , subnet_mask , gw_addr , self ._dns )
293
+ return params
289
294
290
- @ip_address .setter
295
+ @ifconfig .setter
291
296
def ifconfig (self , params ):
292
297
"""Sets network configuration to provided tuple in format:
293
298
(ip_address, subnet_mask, gateway_address, dns_server).
@@ -349,10 +354,10 @@ def sw_reset(self):
349
354
by writing to its MR register reset bit.
350
355
351
356
"""
352
- mr = self ._read_mr ()
357
+ mode_reg = self ._read_mr ()
353
358
self ._write_mr (0x80 )
354
- mr = self ._read_mr ()
355
- if mr [0 ] != 0x00 :
359
+ mode_reg = self ._read_mr ()
360
+ if mode_reg [0 ] != 0x00 :
356
361
return - 1
357
362
return 0
358
363
@@ -370,21 +375,21 @@ def _write_mr(self, data):
370
375
"""
371
376
self .write (REG_MR , 0x04 , data )
372
377
373
- def read (self , addr , cb , length = 1 , buffer = None ):
378
+ def read (self , addr , callback , length = 1 , buffer = None ):
374
379
"""Reads data from a register address.
375
380
:param int addr: Register address.
376
- :param int cb: Common register block (?)
377
381
378
382
"""
379
383
with self ._device as bus_device :
380
384
bus_device .write (bytes ([addr >> 8 ]))
381
385
bus_device .write (bytes ([addr & 0xFF ]))
382
- bus_device .write (bytes ([cb ]))
386
+ bus_device .write (bytes ([callback ]))
383
387
if buffer is None :
384
388
result = bytearray (length )
385
389
bus_device .readinto (result )
386
390
return result
387
391
bus_device .readinto (buffer , end = length )
392
+ return buffer
388
393
389
394
def write (self , addr , callback , data ):
390
395
"""Writes data to a register address.
@@ -410,7 +415,7 @@ def _write_n(self, addr, callback, data):
410
415
bus_device .write (bytes ([addr >> 8 ]))
411
416
bus_device .write (bytes ([addr & 0xFF ]))
412
417
bus_device .write (bytes ([callback ]))
413
- for i in range ( 0 , len ( data ) ):
418
+ for i , _ in enumerate ( data ):
414
419
bus_device .write (bytes ([data [i ]]))
415
420
return len
416
421
@@ -447,16 +452,15 @@ def socket_available(self, socket_num, sock_type=SNMR_TCP):
447
452
return res
448
453
if res > 0 :
449
454
# parse the udp rx packet
450
- tmp_buf = bytearray (8 )
451
455
ret = 0
452
456
# read the first 8 header bytes
453
- ret , tmp_buf = self .socket_read (socket_num , 8 )
457
+ ret , self . _pbuff = self .socket_read (socket_num , 8 )
454
458
if ret > 0 :
455
- UDP_SOCK ['remote_ip' ] = tmp_buf
456
- UDP_SOCK ['remote_port' ] = tmp_buf [4 ]
457
- UDP_SOCK ['remote_port' ] = (UDP_SOCK ['remote_port' ] << 8 ) + tmp_buf [5 ]
458
- UDP_SOCK ['bytes_remaining' ] = tmp_buf [6 ]
459
- UDP_SOCK ['bytes_remaining' ] = (UDP_SOCK ['bytes_remaining' ] << 8 ) + tmp_buf [7 ]
459
+ UDP_SOCK ['remote_ip' ] = self . _pbuff
460
+ UDP_SOCK ['remote_port' ] = self . _pbuff [4 ]
461
+ UDP_SOCK ['remote_port' ] = (UDP_SOCK ['remote_port' ] << 8 ) + self . _pbuff [5 ]
462
+ UDP_SOCK ['bytes_remaining' ] = self . _pbuff [6 ]
463
+ UDP_SOCK ['bytes_remaining' ] = (UDP_SOCK ['bytes_remaining' ] << 8 ) + self . _pbuff [7 ]
460
464
ret = UDP_SOCK ['bytes_remaining' ]
461
465
return ret
462
466
return 0
@@ -601,8 +605,9 @@ def socket_read(self, socket_num, length):
601
605
if ret == 0 :
602
606
# no data on socket?
603
607
status = self ._read_snmr (socket_num )
604
- if (status == SNSR_SOCK_LISTEN or status == SNSR_SOCK_CLOSED \
605
- or status == SNSR_SOCK_CLOSE_WAIT ):
608
+ if status in (SNSR_SOCK_LISTEN ,
609
+ SNSR_SOCK_CLOSED ,
610
+ SNSR_SOCK_CLOSE_WAIT ):
606
611
# remote end closed its side of the connection, EOF state
607
612
ret = 0
608
613
resp = 0
@@ -669,7 +674,8 @@ def socket_write(self, socket_num, buffer):
669
674
while free_size < ret :
670
675
free_size = self ._get_tx_free_size (socket_num )
671
676
status = self .socket_status (socket_num )
672
- if (status != SNSR_SOCK_ESTABLISHED ) and (status != SNSR_SOCK_CLOSE_WAIT ):
677
+ if status not in (SNSR_SOCK_ESTABLISHED ,
678
+ SNSR_SOCK_CLOSE_WAIT ):
673
679
ret = 0
674
680
break
675
681
@@ -725,10 +731,9 @@ def _get_tx_free_size(self, sock):
725
731
return val
726
732
727
733
def _read_snrx_rd (self , sock ):
728
- buf = bytearray (2 )
729
- buf [0 ] = self ._read_socket (sock , REG_SNRX_RD )[0 ]
730
- buf [1 ] = self ._read_socket (sock , REG_SNRX_RD + 1 )[0 ]
731
- return buf [0 ] << 8 | buf [1 ]
734
+ self ._pbuff [0 ] = self ._read_socket (sock , REG_SNRX_RD )[0 ]
735
+ self ._pbuff [1 ] = self ._read_socket (sock , REG_SNRX_RD + 1 )[0 ]
736
+ return self ._pbuff [0 ] << 8 | self ._pbuff [1 ]
732
737
733
738
734
739
def _write_snrx_rd (self , sock , data ):
@@ -740,10 +745,9 @@ def _write_sntx_wr(self, sock, data):
740
745
self ._write_socket (sock , REG_SNTX_WR + 1 , data & 0xff )
741
746
742
747
def _read_sntx_wr (self , sock ):
743
- buf = bytearray (2 )
744
- buf [0 ] = self ._read_socket (sock , 0x0024 )[0 ]
745
- buf [1 ] = self ._read_socket (sock , 0x0024 + 1 )[0 ]
746
- return buf [0 ] << 8 | buf [1 ]
748
+ self ._pbuff [0 ] = self ._read_socket (sock , 0x0024 )[0 ]
749
+ self ._pbuff [1 ] = self ._read_socket (sock , 0x0024 + 1 )[0 ]
750
+ return self ._pbuff [0 ] << 8 | self ._pbuff [1 ]
747
751
748
752
749
753
def _read_sntx_fsr (self , sock ):
0 commit comments