45
45
REG_GAR = const (0x0001 ) # Gateway IP Address
46
46
REG_SUBR = const (0x0005 ) # Subnet Mask Address
47
47
REG_VERSIONR_W5500 = const (0x0039 ) # W5500 Silicon Version
48
+ REG_VERSIONR_W5100S = const (0x0080 ) # W5100S Silicon Version
48
49
REG_SHAR = const (0x0009 ) # Source Hardware Address
49
50
REG_SIPR = const (0x000F ) # Source IP Address
50
51
REG_PHYCFGR = const (0x002E ) # W5500 PHY Configuration
52
+ REG_PHYCFGR_W5100S = const (0x003C ) # W5100S PHY Configuration
51
53
52
54
# Wiznet5k Socket Registers
53
55
REG_SNMR = const (0x0000 ) # Socket n Mode
99
101
100
102
CH_SIZE = const (0x100 )
101
103
SOCK_SIZE = const (0x800 ) # MAX W5k socket size
104
+ SOCK_MASK = const (0x7FF )
102
105
# Register commands
103
106
MR_RST = const (0x80 ) # Mode Register RST
104
107
# Socket mode register
116
119
117
120
# Maximum number of sockets to support, differs between chip versions.
118
121
W5200_W5500_MAX_SOCK_NUM = const (0x08 )
122
+ W5100_MAX_SOCK_NUM = const (0x04 )
119
123
SOCKET_INVALID = const (255 )
120
124
121
125
# UDP socket struct.
@@ -179,8 +183,18 @@ def __init__(
179
183
self .src_port = 0
180
184
self ._dns = 0
181
185
182
- # Set DHCP
186
+ # First, wait link status is on
187
+ # to avoid the code during DHCP, socket listen, connect ... - assert self.link_status, "Ethernet cable disconnected!"
188
+ start_time = time .monotonic ()
189
+ while True :
190
+ if self .link_status or ((time .monotonic () - start_time ) > 5 ):
191
+ break
192
+ time .sleep (1 )
193
+ if self ._debug :
194
+ print ("My Link is:" , self .link_status )
183
195
self ._dhcp_client = None
196
+
197
+ # Set DHCP
184
198
if is_dhcp :
185
199
ret = self .set_dhcp (hostname , dhcp_timeout )
186
200
if ret != 0 :
@@ -198,16 +212,6 @@ def set_dhcp(self, hostname=None, response_timeout=30):
198
212
if self ._debug :
199
213
print ("* Initializing DHCP" )
200
214
201
- # First, wait link status is on
202
- # to avoid the code during DHCP - assert self.link_status, "Ethernet cable disconnected!"
203
- start_time = time .monotonic ()
204
- while True :
205
- if self .link_status or ((time .monotonic () - start_time ) > 5 ):
206
- break
207
- time .sleep (1 )
208
- if self ._debug :
209
- print ("My Link is:" , self .link_status )
210
-
211
215
# Return IP assigned by DHCP
212
216
self ._dhcp_client = dhcp .DHCP (
213
217
self , self .mac_address , hostname , response_timeout , debug = self ._debug
@@ -251,6 +255,8 @@ def max_sockets(self):
251
255
"""Returns max number of sockets supported by chip."""
252
256
if self ._chip_type == "w5500" :
253
257
return W5200_W5500_MAX_SOCK_NUM
258
+ elif self ._chip_type == "w5100s" :
259
+ return W5100_MAX_SOCK_NUM
254
260
return - 1
255
261
256
262
@property
@@ -319,6 +325,9 @@ def link_status(self):
319
325
if self ._chip_type == "w5500" :
320
326
data = self .read (REG_PHYCFGR , 0x00 )
321
327
return data [0 ] & 0x01
328
+ elif self ._chip_type == "w5100s" :
329
+ data = self .read (REG_PHYCFGR_W5100S , 0x00 )
330
+ return data [0 ] & 0x01
322
331
return 0
323
332
324
333
def remote_port (self , socket_num ):
@@ -367,25 +376,44 @@ def _w5100_init(self):
367
376
self .write (0x1E , ctrl_byte , 2 )
368
377
self .write (0x1F , ctrl_byte , 2 )
369
378
else :
370
- return 0
379
+ # Detect if chip is Wiznet W5100S
380
+ if self .detect_w5100s () == 1 :
381
+ pass
382
+ else :
383
+ return 0
371
384
return 1
372
385
373
386
def detect_w5500 (self ):
374
387
"""Detects W5500 chip."""
388
+ self ._chip_type = "w5500"
375
389
assert self .sw_reset () == 0 , "Chip not reset properly!"
376
390
self ._write_mr (0x08 )
377
- assert self ._read_mr ()[0 ] == 0x08 , "Expected 0x08."
391
+ # assert self._read_mr()[0] == 0x08, "Expected 0x08."
392
+ if self ._read_mr ()[0 ] != 0x08 : return - 1
378
393
379
394
self ._write_mr (0x10 )
380
- assert self ._read_mr ()[0 ] == 0x10 , "Expected 0x10."
395
+ # assert self._read_mr()[0] == 0x10, "Expected 0x10."
396
+ if self ._read_mr ()[0 ] != 0x10 : return - 1
381
397
382
398
self ._write_mr (0x00 )
383
- assert self ._read_mr ()[0 ] == 0x00 , "Expected 0x00."
399
+ # assert self._read_mr()[0] == 0x00, "Expected 0x00."
400
+ if self ._read_mr ()[0 ] != 0x00 : return - 1
384
401
385
402
if self .read (REG_VERSIONR_W5500 , 0x00 )[0 ] != 0x04 :
386
403
return - 1
387
- self ._chip_type = "w5500"
388
- self ._ch_base_msb = 0x10
404
+ # self._chip_type = "w5500"
405
+ # self._ch_base_msb = 0x10
406
+ return 1
407
+
408
+ def detect_w5100s (self ):
409
+ """Detects W5100S chip."""
410
+ self ._chip_type = "w5100s"
411
+ # sw reset
412
+ assert self .sw_reset () == 0 , "Chip not reset properly!"
413
+ if self .read (REG_VERSIONR_W5100S , 0x00 )[0 ] != 0x51 :
414
+ return - 1
415
+
416
+ self ._ch_base_msb = 0x0400
389
417
return 1
390
418
391
419
def sw_reset (self ):
@@ -396,7 +424,9 @@ def sw_reset(self):
396
424
mode_reg = self ._read_mr ()
397
425
self ._write_mr (0x80 )
398
426
mode_reg = self ._read_mr ()
399
- if mode_reg [0 ] != 0x00 :
427
+
428
+ # W5100S case => 0x03
429
+ if (mode_reg [0 ] != 0x00 ) and (mode_reg [0 ] != 0x03 ):
400
430
return - 1
401
431
return 0
402
432
@@ -418,9 +448,16 @@ def read(self, addr, callback, length=1, buffer=None):
418
448
419
449
"""
420
450
with self ._device as bus_device :
421
- bus_device .write (bytes ([addr >> 8 ])) # pylint: disable=no-member
422
- bus_device .write (bytes ([addr & 0xFF ])) # pylint: disable=no-member
423
- bus_device .write (bytes ([callback ])) # pylint: disable=no-member
451
+ if self ._chip_type == "w5500" :
452
+ bus_device .write (bytes ([addr >> 8 ])) # pylint: disable=no-member
453
+ bus_device .write (bytes ([addr & 0xFF ])) # pylint: disable=no-member
454
+ bus_device .write (bytes ([callback ])) # pylint: disable=no-member
455
+ else :
456
+ #if self._chip_type == "w5100s":
457
+ bus_device .write (bytes ([0x0F ])) # pylint: disable=no-member
458
+ bus_device .write (bytes ([addr >> 8 ])) # pylint: disable=no-member
459
+ bus_device .write (bytes ([addr & 0xFF ])) # pylint: disable=no-member
460
+
424
461
if buffer is None :
425
462
self ._rxbuf = bytearray (length )
426
463
bus_device .readinto (self ._rxbuf ) # pylint: disable=no-member
@@ -437,9 +474,15 @@ def write(self, addr, callback, data):
437
474
438
475
"""
439
476
with self ._device as bus_device :
440
- bus_device .write (bytes ([addr >> 8 ])) # pylint: disable=no-member
441
- bus_device .write (bytes ([addr & 0xFF ])) # pylint: disable=no-member
442
- bus_device .write (bytes ([callback ])) # pylint: disable=no-member
477
+ if self ._chip_type == "w5500" :
478
+ bus_device .write (bytes ([addr >> 8 ])) # pylint: disable=no-member
479
+ bus_device .write (bytes ([addr & 0xFF ])) # pylint: disable=no-member
480
+ bus_device .write (bytes ([callback ])) # pylint: disable=no-member
481
+ else :
482
+ #if self._chip_type == "w5100s":
483
+ bus_device .write (bytes ([0xF0 ])) # pylint: disable=no-member
484
+ bus_device .write (bytes ([addr >> 8 ])) # pylint: disable=no-member
485
+ bus_device .write (bytes ([addr & 0xFF ])) # pylint: disable=no-member
443
486
444
487
if hasattr (data , "from_bytes" ):
445
488
bus_device .write (bytes ([data ])) # pylint: disable=no-member
@@ -687,14 +730,28 @@ def socket_read(self, socket_num, length):
687
730
# Read the starting save address of the received data
688
731
ptr = self ._read_snrx_rd (socket_num )
689
732
690
- # Read data from the starting address of snrx_rd
691
- ctrl_byte = 0x18 + (socket_num << 5 )
692
-
693
- resp = self .read (ptr , ctrl_byte , ret )
733
+ if self ._chip_type == "w5500" :
734
+ # Read data from the starting address of snrx_rd
735
+ ctrl_byte = 0x18 + (socket_num << 5 )
736
+
737
+ resp = self .read (ptr , ctrl_byte , ret )
738
+ else :
739
+ #if self._chip_type == "w5100s":
740
+ offset = ptr & SOCK_MASK
741
+ src_addr = offset + (socket_num * SOCK_SIZE + 0x6000 )
742
+ if (offset + ret > SOCK_SIZE ) :
743
+ size = SOCK_SIZE - offset
744
+ resp1 = self .read (src_addr , 0x00 , size )
745
+ size = ret - size
746
+ src_addr = (socket_num * SOCK_SIZE + 0x6000 )
747
+ resp2 = self .read (src_addr , 0x00 , size )
748
+ resp = resp1 + resp2
749
+ else :
750
+ resp = self .read (src_addr , 0x00 , ret )
694
751
695
752
# After reading the received data, update Sn_RX_RD to the increased
696
753
# value as many as the reading size.
697
- ptr += ret
754
+ ptr = ( ptr + ret ) & 0xFFFF
698
755
self ._write_snrx_rd (socket_num , ptr )
699
756
700
757
# Notify the W5k of the updated Sn_Rx_RD
@@ -740,16 +797,34 @@ def socket_write(self, socket_num, buffer, timeout=0):
740
797
741
798
# Read the starting address for saving the transmitting data.
742
799
ptr = self ._read_sntx_wr (socket_num )
743
- offset = ptr & 0x07FF
744
- dst_addr = offset + (socket_num * 2048 + 0x8000 )
800
+ offset = ptr & SOCK_MASK
801
+ if self ._chip_type == "w5500" :
802
+ dst_addr = offset + (socket_num * SOCK_SIZE + 0x8000 )
803
+
804
+ txbuf = buffer [:ret ]
805
+ cntl_byte = 0x14 + (socket_num << 5 )
806
+ self .write (dst_addr , cntl_byte , txbuf )
807
+
808
+ else :
809
+ #if self._chip_type == "w5100s":
810
+ dst_addr = offset + (socket_num * SOCK_SIZE + 0x4000 )
811
+
812
+ if (offset + ret > SOCK_SIZE ) :
813
+ size = SOCK_SIZE - offset
814
+ txbuf = buffer [0 :size ]
815
+ self .write (dst_addr , 0x00 , txbuf )
816
+ txbuf = buffer [size :ret ]
817
+ size = ret - size
818
+ dst_addr = (socket_num * SOCK_SIZE + 0x4000 )
819
+ self .write (dst_addr , 0x00 , txbuf )
820
+ else :
821
+ txbuf = buffer [:ret ]
822
+ self .write (dst_addr , 0x00 , buffer [:ret ])
745
823
746
824
# update sn_tx_wr to the value + data size
747
- ptr = (ptr + len ( buffer ) ) & 0xFFFF
825
+ ptr = (ptr + ret ) & 0xFFFF
748
826
self ._write_sntx_wr (socket_num , ptr )
749
827
750
- cntl_byte = 0x14 + (socket_num << 5 )
751
- self .write (dst_addr , cntl_byte , buffer )
752
-
753
828
self ._write_sncr (socket_num , CMD_SOCK_SEND )
754
829
self ._read_sncr (socket_num )
755
830
@@ -863,11 +938,20 @@ def _read_snmr(self, sock):
863
938
864
939
def _write_socket (self , sock , address , data ):
865
940
"""Write to a W5k socket register."""
866
- base = self ._ch_base_msb << 8
867
- cntl_byte = (sock << 5 ) + 0x0C
868
- return self .write (base + sock * CH_SIZE + address , cntl_byte , data )
941
+ if self ._chip_type == "w5500" :
942
+ cntl_byte = (sock << 5 ) + 0x0C
943
+ return self .write (address , cntl_byte , data )
944
+ else :
945
+ #if self._chip_type == "w5100s":
946
+ cntl_byte = 0
947
+ return self .write (self ._ch_base_msb + sock * CH_SIZE + address , cntl_byte , data )
869
948
870
949
def _read_socket (self , sock , address ):
871
950
"""Read a W5k socket register."""
872
- cntl_byte = (sock << 5 ) + 0x08
873
- return self .read (address , cntl_byte )
951
+ if self ._chip_type == "w5500" :
952
+ cntl_byte = (sock << 5 ) + 0x08
953
+ return self .read (address , cntl_byte )
954
+ else :
955
+ #if self._chip_type == "w5100s":
956
+ cntl_byte = 0
957
+ return self .read (self ._ch_base_msb + sock * CH_SIZE + address , cntl_byte )
0 commit comments