Skip to content

Commit 298d5dd

Browse files
committed
add W5100s
1 parent fdafe3b commit 298d5dd

File tree

5 files changed

+226
-55
lines changed

5 files changed

+226
-55
lines changed

adafruit_wiznet5k/adafruit_wiznet5k.py

Lines changed: 124 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@
4545
REG_GAR = const(0x0001) # Gateway IP Address
4646
REG_SUBR = const(0x0005) # Subnet Mask Address
4747
REG_VERSIONR_W5500 = const(0x0039) # W5500 Silicon Version
48+
REG_VERSIONR_W5100S = const(0x0080) # W5100S Silicon Version
4849
REG_SHAR = const(0x0009) # Source Hardware Address
4950
REG_SIPR = const(0x000F) # Source IP Address
5051
REG_PHYCFGR = const(0x002E) # W5500 PHY Configuration
52+
REG_PHYCFGR_W5100S = const(0x003C) # W5100S PHY Configuration
5153

5254
# Wiznet5k Socket Registers
5355
REG_SNMR = const(0x0000) # Socket n Mode
@@ -99,6 +101,7 @@
99101

100102
CH_SIZE = const(0x100)
101103
SOCK_SIZE = const(0x800) # MAX W5k socket size
104+
SOCK_MASK = const(0x7FF)
102105
# Register commands
103106
MR_RST = const(0x80) # Mode Register RST
104107
# Socket mode register
@@ -116,6 +119,7 @@
116119

117120
# Maximum number of sockets to support, differs between chip versions.
118121
W5200_W5500_MAX_SOCK_NUM = const(0x08)
122+
W5100_MAX_SOCK_NUM = const(0x04)
119123
SOCKET_INVALID = const(255)
120124

121125
# UDP socket struct.
@@ -179,8 +183,18 @@ def __init__(
179183
self.src_port = 0
180184
self._dns = 0
181185

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)
183195
self._dhcp_client = None
196+
197+
# Set DHCP
184198
if is_dhcp:
185199
ret = self.set_dhcp(hostname, dhcp_timeout)
186200
if ret != 0:
@@ -198,16 +212,6 @@ def set_dhcp(self, hostname=None, response_timeout=30):
198212
if self._debug:
199213
print("* Initializing DHCP")
200214

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-
211215
# Return IP assigned by DHCP
212216
self._dhcp_client = dhcp.DHCP(
213217
self, self.mac_address, hostname, response_timeout, debug=self._debug
@@ -251,6 +255,8 @@ def max_sockets(self):
251255
"""Returns max number of sockets supported by chip."""
252256
if self._chip_type == "w5500":
253257
return W5200_W5500_MAX_SOCK_NUM
258+
elif self._chip_type == "w5100s":
259+
return W5100_MAX_SOCK_NUM
254260
return -1
255261

256262
@property
@@ -319,6 +325,9 @@ def link_status(self):
319325
if self._chip_type == "w5500":
320326
data = self.read(REG_PHYCFGR, 0x00)
321327
return data[0] & 0x01
328+
elif self._chip_type == "w5100s":
329+
data = self.read(REG_PHYCFGR_W5100S, 0x00)
330+
return data[0] & 0x01
322331
return 0
323332

324333
def remote_port(self, socket_num):
@@ -367,25 +376,44 @@ def _w5100_init(self):
367376
self.write(0x1E, ctrl_byte, 2)
368377
self.write(0x1F, ctrl_byte, 2)
369378
else:
370-
return 0
379+
# Detect if chip is Wiznet W5100S
380+
if self.detect_w5100s() == 1:
381+
pass
382+
else:
383+
return 0
371384
return 1
372385

373386
def detect_w5500(self):
374387
"""Detects W5500 chip."""
388+
self._chip_type = "w5500"
375389
assert self.sw_reset() == 0, "Chip not reset properly!"
376390
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
378393

379394
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
381397

382398
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
384401

385402
if self.read(REG_VERSIONR_W5500, 0x00)[0] != 0x04:
386403
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
389417
return 1
390418

391419
def sw_reset(self):
@@ -396,7 +424,9 @@ def sw_reset(self):
396424
mode_reg = self._read_mr()
397425
self._write_mr(0x80)
398426
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):
400430
return -1
401431
return 0
402432

@@ -418,9 +448,16 @@ def read(self, addr, callback, length=1, buffer=None):
418448
419449
"""
420450
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+
424461
if buffer is None:
425462
self._rxbuf = bytearray(length)
426463
bus_device.readinto(self._rxbuf) # pylint: disable=no-member
@@ -437,9 +474,15 @@ def write(self, addr, callback, data):
437474
438475
"""
439476
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
443486

444487
if hasattr(data, "from_bytes"):
445488
bus_device.write(bytes([data])) # pylint: disable=no-member
@@ -687,14 +730,28 @@ def socket_read(self, socket_num, length):
687730
# Read the starting save address of the received data
688731
ptr = self._read_snrx_rd(socket_num)
689732

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)
694751

695752
# After reading the received data, update Sn_RX_RD to the increased
696753
# value as many as the reading size.
697-
ptr += ret
754+
ptr = (ptr + ret) & 0xFFFF
698755
self._write_snrx_rd(socket_num, ptr)
699756

700757
# Notify the W5k of the updated Sn_Rx_RD
@@ -740,16 +797,34 @@ def socket_write(self, socket_num, buffer, timeout=0):
740797

741798
# Read the starting address for saving the transmitting data.
742799
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])
745823

746824
# update sn_tx_wr to the value + data size
747-
ptr = (ptr + len(buffer)) & 0xFFFF
825+
ptr = (ptr + ret) & 0xFFFF
748826
self._write_sntx_wr(socket_num, ptr)
749827

750-
cntl_byte = 0x14 + (socket_num << 5)
751-
self.write(dst_addr, cntl_byte, buffer)
752-
753828
self._write_sncr(socket_num, CMD_SOCK_SEND)
754829
self._read_sncr(socket_num)
755830

@@ -863,11 +938,20 @@ def _read_snmr(self, sock):
863938

864939
def _write_socket(self, sock, address, data):
865940
"""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)
869948

870949
def _read_socket(self, sock, address):
871950
"""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)

adafruit_wiznet5k/adafruit_wiznet5k_dhcp.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,8 @@ def send_dhcp_message(self, state, time_elapsed, renew=False):
192192
# HW Type - ETH
193193
_BUFF[245] = 0x01
194194
# Client MAC Address
195-
for mac, val in enumerate(self._mac_address):
196-
_BUFF[246 + mac] = val
195+
for mac in range(0, len(self._mac_address)):
196+
_BUFF[246 + mac] = self._mac_address[mac]
197197

198198
# Option - Host Name
199199
_BUFF[252] = 12
@@ -471,24 +471,23 @@ def _dhcp_state_machine(self):
471471
print("* DHCP: Time to renew lease")
472472

473473
if (
474-
self._dhcp_state
475-
in (
476-
STATE_DHCP_DISCOVER,
477-
STATE_DHCP_REQUEST,
478-
)
479-
and time.monotonic() > (self._start_time + self._response_timeout)
480-
):
474+
self._dhcp_state == STATE_DHCP_DISCOVER
475+
or self._dhcp_state == STATE_DHCP_REQUEST
476+
) and time.monotonic() > (self._start_time + self._response_timeout):
481477
self._dhcp_state = STATE_DHCP_WAIT
482478
if self._sock is not None:
483479
self._sock.close()
484480
self._sock = None
485481

486482
def request_dhcp_lease(self):
487483
"""Request to renew or acquire a DHCP lease."""
488-
if self._dhcp_state in (STATE_DHCP_LEASED, STATE_DHCP_WAIT):
484+
if self._dhcp_state == STATE_DHCP_LEASED or self._dhcp_state == STATE_DHCP_WAIT:
489485
self._dhcp_state = STATE_DHCP_START
490486

491-
while self._dhcp_state not in (STATE_DHCP_LEASED, STATE_DHCP_WAIT):
487+
while (
488+
self._dhcp_state != STATE_DHCP_LEASED
489+
and self._dhcp_state != STATE_DHCP_WAIT
490+
):
492491
self._dhcp_state_machine()
493492

494493
return self._dhcp_state == STATE_DHCP_LEASED
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# SPDX-FileCopyrightText: 2019 Brent Rubell for Adafruit Industries
2+
#
3+
# SPDX-License-Identifier: MIT
4+
5+
"""
6+
`wiznet5k_ntp`
7+
================================================================================
8+
9+
Network Time Protocol (NTP) helper for CircuitPython
10+
11+
* Author(s): irinakim
12+
13+
Implementation Notes
14+
--------------------
15+
**Hardware:**
16+
**Software and Dependencies:**
17+
18+
19+
"""
20+
import time
21+
22+
import adafruit_wiznet5k.adafruit_wiznet5k_socket as socket
23+
from adafruit_wiznet5k.adafruit_wiznet5k_socket import htons
24+
25+
26+
##__version__ = "0.0.0-auto.0"
27+
##__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_NTP.git"
28+
29+
30+
class NTP:
31+
def __init__(self, iface, ntp_address,utc,debug=False):
32+
self._debug = debug
33+
self._iface = iface
34+
socket.set_interface(self._iface)
35+
self._sock = socket.socket(type=socket.SOCK_DGRAM)
36+
self._sock.settimeout(1)
37+
self._utc = utc
38+
39+
self._ntp_server = ntp_address
40+
self._host = 0
41+
self._request_id = 0 # request identifier
42+
43+
self._pkt_buf_ = bytearray()
44+
45+
def _build_ntp_header(self,ip):
46+
self._pkt_buf_.append(0x23)
47+
48+
for i in range(55):
49+
self._pkt_buf_.append(0x00)
50+
51+
def get_time(self):
52+
self._build_ntp_header(self._ntp_server)
53+
self._sock.bind((None,50001))
54+
self._sock.sendto(self._pkt_buf_,(self._ntp_server, 123))
55+
while True:
56+
data = self._sock.recv()
57+
if data:
58+
sec = data[40:44]
59+
int_cal = int.from_bytes(sec,"big")
60+
cal =int_cal - 2208988800 + self._utc *3600
61+
cal = time.localtime(cal)
62+
return cal

0 commit comments

Comments
 (0)