57
57
from adafruit_wiznet5k .adafruit_wiznet5k_debug import debug_msg
58
58
59
59
# *** Wiznet Common Registers ***
60
- # Mode (used only for initialization and soft reset).
61
- _REG_MR = {"w5100s" : const (0x0000 ), "w5500" : const (0x0000 ), "w6100" : const (0x4000 )}
60
+ _REG_MR = {"w5100s" : const (0x0000 ), "w5500" : const (0x0000 )}
62
61
# Gateway IPv4 Address.
63
62
_REG_GAR = {"w5100s" : const (0x0001 ), "w5500" : const (0x0001 ), "w6100" : const (0x4130 )}
64
63
# Subnet Mask Address
@@ -498,7 +497,7 @@ def socket_available(self, socket_num: int, sock_type: int = _SNMR_TCP) -> int:
498
497
Number of bytes available to be read from the socket.
499
498
500
499
:param int socket_num: Socket to check for available bytes.
501
- :param int sock_type: Socket type. Use SNMR_TCP for TCP or SNMR_UDP for UDP, \
500
+ :param int sock_type: Socket type. Use SNMR_TCP for TCP or SNMR_UDP for UDP,
502
501
defaults to SNMR_TCP.
503
502
504
503
:return int: Number of bytes available to read.
@@ -946,18 +945,15 @@ def sw_reset(self) -> None:
946
945
"""
947
946
self ._wiznet_chip_init ()
948
947
949
- def _sw_reset (self ) -> None :
948
+ def _sw_reset_5x00 (self ) -> bool :
950
949
"""
951
- Perform a soft reset on the WIZnet chip .
950
+ Perform a soft reset on the WIZnet 5100s and 5500 chips .
952
951
953
- :raises RuntimeError: If reset fails.
952
+ :returns bool: True if reset was success
954
953
"""
955
954
self ._write_mr (_MR_RST )
956
955
time .sleep (0.05 )
957
- result = self ._read_mr ()
958
- expected_result = {"w5500" : 0x00 , "w5100s" : 0x03 }[self ._chip_type ]
959
- if result != expected_result :
960
- raise RuntimeError ("WIZnet chip reset failed." )
956
+ return self ._read_mr () == {"w5500" : 0x00 , "w5100s" : 0x03 }[self ._chip_type ]
961
957
962
958
def _wiznet_chip_init (self ) -> None :
963
959
"""
@@ -966,6 +962,16 @@ def _wiznet_chip_init(self) -> None:
966
962
:raises RuntimeError: If no WIZnet chip is detected.
967
963
"""
968
964
965
+ def _setup_sockets () -> None :
966
+ """Initialise sockets for w5500 and w6100 chips."""
967
+ for sock_num in range (_MAX_SOCK_NUM [self ._chip_type ]):
968
+ ctrl_byte = 0x0C + (sock_num << 5 )
969
+ self ._write (0x1E , ctrl_byte , 2 )
970
+ self ._write (0x1F , ctrl_byte , 2 )
971
+ self ._ch_base_msb = 0x00
972
+ WIZNET5K ._sockets_reserved = [False ] * (_MAX_SOCK_NUM [self ._chip_type ] - 1 )
973
+ self ._src_ports_in_use = [0 ] * _MAX_SOCK_NUM [self ._chip_type ]
974
+
969
975
def _detect_and_reset_w6100 () -> bool :
970
976
"""
971
977
Detect and reset a W6100 chip. Called at startup to initialize the
@@ -974,22 +980,18 @@ def _detect_and_reset_w6100() -> bool:
974
980
:return bool: True if a W6100 chip is detected, False if not.
975
981
"""
976
982
self ._chip_type = "w6100"
977
- try :
978
- self ._sw_reset ()
979
- except RuntimeError :
980
- return False
983
+
984
+ # Reset w6100
985
+ self ._write (0x41F4 , 0x04 , 0xCE ) # Unlock chip settings.
986
+ time .sleep (0.05 ) # Wait for unlock.
987
+ self ._write (0x2004 , 0x04 , 0x00 ) # Reset chip.
988
+ time .sleep (0.05 ) # Wait for reset.
981
989
982
990
if self ._read (_REG_VERSIONR [self ._chip_type ], 0x00 )[0 ] != 0x61 :
983
991
return False
984
992
# Initialize w6100.
985
993
self ._write (0x41F5 , 0x04 , 0x3A ) # Unlock network settings.
986
- for i in range (_MAX_SOCK_NUM [self ._chip_type ]):
987
- ctrl_byte = 0x0C + (i << 5 )
988
- self ._write (0x1E , ctrl_byte , 2 )
989
- self ._write (0x1F , ctrl_byte , 2 )
990
- self ._ch_base_msb = 0x00
991
- WIZNET5K ._sockets_reserved = [False ] * (_MAX_SOCK_NUM [self ._chip_type ] - 1 )
992
- self ._src_ports_in_use = [0 ] * _MAX_SOCK_NUM [self ._chip_type ]
994
+ _setup_sockets ()
993
995
return True
994
996
995
997
def _detect_and_reset_w5500 () -> bool :
@@ -1000,9 +1002,7 @@ def _detect_and_reset_w5500() -> bool:
1000
1002
:return bool: True if a W5500 chip is detected, False if not.
1001
1003
"""
1002
1004
self ._chip_type = "w5500"
1003
- try :
1004
- self ._sw_reset ()
1005
- except RuntimeError :
1005
+ if not self ._sw_reset_5x00 ():
1006
1006
return False
1007
1007
1008
1008
self ._write_mr (0x08 )
@@ -1020,13 +1020,7 @@ def _detect_and_reset_w5500() -> bool:
1020
1020
if self ._read (_REG_VERSIONR [self ._chip_type ], 0x00 )[0 ] != 0x04 :
1021
1021
return False
1022
1022
# Initialize w5500
1023
- for i in range (_MAX_SOCK_NUM [self ._chip_type ]):
1024
- ctrl_byte = 0x0C + (i << 5 )
1025
- self ._write (0x1E , ctrl_byte , 2 )
1026
- self ._write (0x1F , ctrl_byte , 2 )
1027
- self ._ch_base_msb = 0x00
1028
- WIZNET5K ._sockets_reserved = [False ] * (_MAX_SOCK_NUM [self ._chip_type ] - 1 )
1029
- self ._src_ports_in_use = [0 ] * _MAX_SOCK_NUM [self ._chip_type ]
1023
+ _setup_sockets ()
1030
1024
return True
1031
1025
1032
1026
def _detect_and_reset_w5100s () -> bool :
@@ -1037,13 +1031,13 @@ def _detect_and_reset_w5100s() -> bool:
1037
1031
:return bool: True if a W5100 chip is detected, False if not.
1038
1032
"""
1039
1033
self ._chip_type = "w5100s"
1040
- try :
1041
- self ._sw_reset ()
1042
- except RuntimeError :
1034
+ if not self ._sw_reset_5x00 ():
1043
1035
return False
1044
1036
1045
1037
if self ._read (_REG_VERSIONR [self ._chip_type ], 0x00 )[0 ] != 0x51 :
1046
1038
return False
1039
+
1040
+ # Initialise w5100s
1047
1041
self ._ch_base_msb = 0x0400
1048
1042
WIZNET5K ._sockets_reserved = [False ] * (_MAX_SOCK_NUM [self ._chip_type ] - 1 )
1049
1043
self ._src_ports_in_use = [0 ] * _MAX_SOCK_NUM [self ._chip_type ]
@@ -1123,7 +1117,7 @@ def _write(self, addr: int, callback: int, data: Union[int, bytes]) -> None:
1123
1117
1124
1118
def _write_socket_register (self , sock : int , address : int , data : int ) -> None :
1125
1119
"""Write to a WIZnet 5k socket register."""
1126
- if self ._chip_type == "w5500" :
1120
+ if self ._chip_type in ( "w5500" , "w6100" ) :
1127
1121
cntl_byte = (sock << 5 ) + 0x0C
1128
1122
self ._write (address , cntl_byte , data )
1129
1123
elif self ._chip_type == "w5100s" :
@@ -1132,7 +1126,7 @@ def _write_socket_register(self, sock: int, address: int, data: int) -> None:
1132
1126
1133
1127
def _read_socket_register (self , sock : int , address : int ) -> int :
1134
1128
"""Read a WIZnet 5k socket register."""
1135
- if self ._chip_type == "w5500" :
1129
+ if self ._chip_type in ( "w5500" , "w6100" ) :
1136
1130
cntl_byte = (sock << 5 ) + 0x08
1137
1131
register = self ._read (address , cntl_byte )
1138
1132
elif self ._chip_type == "w5100s" :
0 commit comments