156
156
_MR_RST = const (0x80 ) # Mode Register RST
157
157
# Socket mode register
158
158
_SNMR_CLOSE = const (0x00 )
159
- SNMR_TCP = const (0x21 )
159
+ _SNMR_TCP = const (0x21 )
160
160
SNMR_UDP = const (0x02 )
161
161
_SNMR_IPRAW = const (0x03 )
162
162
_SNMR_MACRAW = const (0x04 )
@@ -219,10 +219,12 @@ def __init__(
219
219
220
220
# Reset wiznet module prior to initialization.
221
221
if reset :
222
+ debug_msg ("* Resetting WIZnet chip" , self ._debug )
223
+ reset .switch_to_output ()
222
224
reset .value = False
223
225
time .sleep (0.1 )
224
226
reset .value = True
225
- time .sleep (0.1 )
227
+ time .sleep (5 )
226
228
227
229
# Setup chip_select pin.
228
230
time .sleep (1 )
@@ -384,7 +386,7 @@ def mac_address(self, address: Union[MacAddressRaw, str]) -> None:
384
386
"""
385
387
try :
386
388
address = [int (x , 16 ) for x in address .split (":" )]
387
- except AttributeError :
389
+ except TypeError :
388
390
pass
389
391
try :
390
392
if len (address ) != 6 :
@@ -492,7 +494,7 @@ def ifconfig(
492
494
493
495
# *** Public Socket Methods ***
494
496
495
- def socket_available (self , socket_num : int , sock_type : int = SNMR_TCP ) -> int :
497
+ def socket_available (self , socket_num : int , sock_type : int = _SNMR_TCP ) -> int :
496
498
"""
497
499
Number of bytes available to be read from the socket.
498
500
@@ -514,7 +516,7 @@ def socket_available(self, socket_num: int, sock_type: int = SNMR_TCP) -> int:
514
516
self ._sock_num_in_range (socket_num )
515
517
516
518
number_of_bytes = self ._get_rx_rcv_size (socket_num )
517
- if self .read_snsr (socket_num ) == SNMR_UDP :
519
+ if self ._read_snsr (socket_num ) == SNMR_UDP :
518
520
number_of_bytes -= 8 # Subtract UDP header from packet size.
519
521
if number_of_bytes < 0 :
520
522
raise ValueError ("Negative number of bytes found on socket." )
@@ -533,14 +535,14 @@ def socket_status(self, socket_num: int) -> int:
533
535
534
536
:return int: The connection status.
535
537
"""
536
- return self .read_snsr (socket_num )
538
+ return self ._read_snsr (socket_num )
537
539
538
540
def socket_connect (
539
541
self ,
540
542
socket_num : int ,
541
543
dest : IpAddress4Raw ,
542
544
port : int ,
543
- conn_mode : int = SNMR_TCP ,
545
+ conn_mode : int = _SNMR_TCP ,
544
546
) -> int :
545
547
"""
546
548
Open and verify a connection from a socket to a destination IPv4 address
@@ -567,11 +569,11 @@ def socket_connect(
567
569
# initialize a socket and set the mode
568
570
self .socket_open (socket_num , conn_mode = conn_mode )
569
571
# set socket destination IP and port
570
- self .write_sndipr (socket_num , dest )
571
- self .write_sndport (socket_num , port )
572
- self .write_sncr (socket_num , _CMD_SOCK_CONNECT )
572
+ self ._write_sndipr (socket_num , dest )
573
+ self ._write_sndport (socket_num , port )
574
+ self ._write_sncr (socket_num , _CMD_SOCK_CONNECT )
573
575
574
- if conn_mode == SNMR_TCP :
576
+ if conn_mode == _SNMR_TCP :
575
577
# wait for tcp connection establishment
576
578
while self .socket_status (socket_num ) != SNSR_SOCK_ESTABLISHED :
577
579
time .sleep (0.001 )
@@ -638,7 +640,7 @@ def release_socket(self, socket_number):
638
640
WIZNET5K ._sockets_reserved [socket_number - 1 ] = False
639
641
640
642
def socket_listen (
641
- self , socket_num : int , port : int , conn_mode : int = SNMR_TCP
643
+ self , socket_num : int , port : int , conn_mode : int = _SNMR_TCP
642
644
) -> None :
643
645
"""
644
646
Listen on a socket's port.
@@ -665,15 +667,15 @@ def socket_listen(
665
667
self .socket_open (socket_num , conn_mode = conn_mode )
666
668
self .src_port = 0
667
669
# Send listen command
668
- self .write_sncr (socket_num , _CMD_SOCK_LISTEN )
670
+ self ._write_sncr (socket_num , _CMD_SOCK_LISTEN )
669
671
# Wait until ready
670
672
status = SNSR_SOCK_CLOSED
671
673
while status not in (
672
674
SNSR_SOCK_LISTEN ,
673
675
SNSR_SOCK_ESTABLISHED ,
674
676
_SNSR_SOCK_UDP ,
675
677
):
676
- status = self .read_snsr (socket_num )
678
+ status = self ._read_snsr (socket_num )
677
679
if status == SNSR_SOCK_CLOSED :
678
680
raise RuntimeError ("Listening socket closed." )
679
681
@@ -703,7 +705,7 @@ def socket_accept(self, socket_num: int) -> Tuple[int, Tuple[str, int]]:
703
705
)
704
706
return next_socknum , (dest_ip , dest_port )
705
707
706
- def socket_open (self , socket_num : int , conn_mode : int = SNMR_TCP ) -> None :
708
+ def socket_open (self , socket_num : int , conn_mode : int = _SNMR_TCP ) -> None :
707
709
"""
708
710
Open an IP socket.
709
711
@@ -720,7 +722,7 @@ def socket_open(self, socket_num: int, conn_mode: int = SNMR_TCP) -> None:
720
722
self ._sock_num_in_range (socket_num )
721
723
self ._check_link_status ()
722
724
debug_msg ("*** Opening socket {}" .format (socket_num ), self ._debug )
723
- if self .read_snsr (socket_num ) not in (
725
+ if self ._read_snsr (socket_num ) not in (
724
726
SNSR_SOCK_CLOSED ,
725
727
SNSR_SOCK_TIME_WAIT ,
726
728
SNSR_SOCK_FIN_WAIT ,
@@ -732,22 +734,22 @@ def socket_open(self, socket_num: int, conn_mode: int = SNMR_TCP) -> None:
732
734
debug_msg ("* Opening W5k Socket, protocol={}" .format (conn_mode ), self ._debug )
733
735
time .sleep (0.00025 )
734
736
735
- self .write_snmr (socket_num , conn_mode )
737
+ self ._write_snmr (socket_num , conn_mode )
736
738
self .write_snir (socket_num , 0xFF )
737
739
738
740
if self .src_port > 0 :
739
741
# write to socket source port
740
- self .write_sock_port (socket_num , self .src_port )
742
+ self ._write_sock_port (socket_num , self .src_port )
741
743
else :
742
744
s_port = randint (49152 , 65535 )
743
745
while s_port in self ._src_ports_in_use :
744
746
s_port = randint (49152 , 65535 )
745
- self .write_sock_port (socket_num , s_port )
747
+ self ._write_sock_port (socket_num , s_port )
746
748
self ._src_ports_in_use [socket_num ] = s_port
747
749
748
750
# open socket
749
- self .write_sncr (socket_num , _CMD_SOCK_OPEN )
750
- if self .read_snsr (socket_num ) not in [_SNSR_SOCK_INIT , _SNSR_SOCK_UDP ]:
751
+ self ._write_sncr (socket_num , _CMD_SOCK_OPEN )
752
+ if self ._read_snsr (socket_num ) not in [_SNSR_SOCK_INIT , _SNSR_SOCK_UDP ]:
751
753
raise RuntimeError ("Could not open socket in TCP or UDP mode." )
752
754
753
755
def socket_close (self , socket_num : int ) -> None :
@@ -760,14 +762,14 @@ def socket_close(self, socket_num: int) -> None:
760
762
"""
761
763
debug_msg ("*** Closing socket {}" .format (socket_num ), self ._debug )
762
764
self ._sock_num_in_range (socket_num )
763
- self .write_sncr (socket_num , _CMD_SOCK_CLOSE )
765
+ self ._write_sncr (socket_num , _CMD_SOCK_CLOSE )
764
766
debug_msg (" Waiting for socket to close…" , self ._debug )
765
767
timeout = time .monotonic () + 5.0
766
- while self .read_snsr (socket_num ) != SNSR_SOCK_CLOSED :
768
+ while self ._read_snsr (socket_num ) != SNSR_SOCK_CLOSED :
767
769
if time .monotonic () > timeout :
768
770
raise RuntimeError (
769
771
"Wiznet5k failed to close socket, status = {}." .format (
770
- self .read_snsr (socket_num )
772
+ self ._read_snsr (socket_num )
771
773
)
772
774
)
773
775
time .sleep (0.0001 )
@@ -783,7 +785,7 @@ def socket_disconnect(self, socket_num: int) -> None:
783
785
"""
784
786
debug_msg ("*** Disconnecting socket {}" .format (socket_num ), self ._debug )
785
787
self ._sock_num_in_range (socket_num )
786
- self .write_sncr (socket_num , _CMD_SOCK_DISCON )
788
+ self ._write_sncr (socket_num , _CMD_SOCK_DISCON )
787
789
788
790
def socket_read (self , socket_num : int , length : int ) -> Tuple [int , bytes ]:
789
791
"""
@@ -819,7 +821,7 @@ def socket_read(self, socket_num: int, length: int) -> Tuple[int, bytes]:
819
821
# After reading the received data, update Sn_RX_RD register.
820
822
pointer = (pointer + bytes_on_socket ) & 0xFFFF
821
823
self ._write_snrx_rd (socket_num , pointer )
822
- self .write_sncr (socket_num , _CMD_SOCK_RECV )
824
+ self ._write_sncr (socket_num , _CMD_SOCK_RECV )
823
825
else :
824
826
# no data on socket
825
827
if self ._read_snmr (socket_num ) in (
@@ -906,7 +908,7 @@ def socket_write(
906
908
# update sn_tx_wr to the value + data size
907
909
pointer = (pointer + bytes_to_write ) & 0xFFFF
908
910
self ._write_sntx_wr (socket_num , pointer )
909
- self .write_sncr (socket_num , _CMD_SOCK_SEND )
911
+ self ._write_sncr (socket_num , _CMD_SOCK_SEND )
910
912
911
913
# check data was transferred correctly
912
914
while not self .read_snir (socket_num ) & _SNIR_SEND_OK :
@@ -1057,6 +1059,11 @@ def _check_link_status(self):
1057
1059
if not self .link_status :
1058
1060
raise ConnectionError ("The Ethernet connection is down." )
1059
1061
1062
+ @staticmethod
1063
+ def _read_socket_reservations () -> list [int ]:
1064
+ """Return the list of reserved sockets."""
1065
+ return WIZNET5K ._sockets_reserved
1066
+
1060
1067
def _read_mr (self ) -> int :
1061
1068
"""Read from the Mode Register (MR)."""
1062
1069
return int .from_bytes (self ._read (_REG_MR [self ._chip_type ], 0x00 ), "big" )
@@ -1175,18 +1182,22 @@ def _read_sndipr(self, sock) -> bytes:
1175
1182
)
1176
1183
return bytes (data )
1177
1184
1178
- def write_sndipr (self , sock : int , ip_addr : bytes ) -> None :
1185
+ def _write_sndipr (self , sock : int , ip_addr : bytes ) -> None :
1179
1186
"""Write to socket destination IP Address."""
1180
1187
for offset , value in enumerate (ip_addr ):
1181
1188
self ._write_socket_register (
1182
1189
sock , _REG_SNDIPR [self ._chip_type ] + offset , value
1183
1190
)
1184
1191
1185
- def write_sndport (self , sock : int , port : int ) -> None :
1192
+ def _read_sndport (self , sock : int ) -> int :
1193
+ """Read socket destination port."""
1194
+ return self ._read_two_byte_sock_reg (sock , _REG_SNDPORT [self ._chip_type ])
1195
+
1196
+ def _write_sndport (self , sock : int , port : int ) -> None :
1186
1197
"""Write to socket destination port."""
1187
1198
self ._write_two_byte_sock_reg (sock , _REG_SNDPORT [self ._chip_type ], port )
1188
1199
1189
- def read_snsr (self , sock : int ) -> int :
1200
+ def _read_snsr (self , sock : int ) -> int :
1190
1201
"""Read Socket n Status Register."""
1191
1202
return self ._read_socket_register (sock , _REG_SNSR [self ._chip_type ])
1192
1203
@@ -1202,15 +1213,15 @@ def _read_snmr(self, sock: int) -> int:
1202
1213
"""Read the socket MR register."""
1203
1214
return self ._read_socket_register (sock , _REG_SNMR )
1204
1215
1205
- def write_snmr (self , sock : int , protocol : int ) -> None :
1216
+ def _write_snmr (self , sock : int , protocol : int ) -> None :
1206
1217
"""Write to Socket n Mode Register."""
1207
1218
self ._write_socket_register (sock , _REG_SNMR , protocol )
1208
1219
1209
- def write_sock_port (self , sock : int , port : int ) -> None :
1220
+ def _write_sock_port (self , sock : int , port : int ) -> None :
1210
1221
"""Write to the socket port number."""
1211
1222
self ._write_two_byte_sock_reg (sock , _REG_SNPORT [self ._chip_type ], port )
1212
1223
1213
- def write_sncr (self , sock : int , data : int ) -> None :
1224
+ def _write_sncr (self , sock : int , data : int ) -> None :
1214
1225
"""Write to socket command register."""
1215
1226
self ._write_socket_register (sock , _REG_SNCR [self ._chip_type ], data )
1216
1227
# Wait for command to complete before continuing.
0 commit comments