Skip to content

Commit f78bdb7

Browse files
author
taylor
committed
Added W5100S for W5100S Ethernetshield
1 parent 4f4ac17 commit f78bdb7

File tree

7 files changed

+65
-14
lines changed

7 files changed

+65
-14
lines changed

keywords.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,4 @@ EthernetNoHardware LITERAL1
6565
EthernetW5100 LITERAL1
6666
EthernetW5200 LITERAL1
6767
EthernetW5500 LITERAL1
68+
EthernetW5100S LITERAL1

src/Ethernet.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ EthernetLinkStatus EthernetClass::linkStatus()
114114
EthernetHardwareStatus EthernetClass::hardwareStatus()
115115
{
116116
switch (W5100.getChip()) {
117+
case 50: return EthernetW5100S;
117118
case 51: return EthernetW5100;
118119
case 52: return EthernetW5200;
119120
case 55: return EthernetW5500;

src/Ethernet.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ enum EthernetHardwareStatus {
6363
EthernetNoHardware,
6464
EthernetW5100,
6565
EthernetW5200,
66-
EthernetW5500
66+
EthernetW5500,
67+
EthernetW5100S
6768
};
6869

6970
class EthernetUDP;

src/EthernetServer.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ EthernetClient EthernetServer::available()
4646
chip = W5100.getChip();
4747
if (!chip) return EthernetClient(MAX_SOCK_NUM);
4848
#if MAX_SOCK_NUM > 4
49-
if (chip == 51) maxindex = 4; // W5100 chip never supports more than 4 sockets
49+
if (chip == 51 || chip == 50) maxindex = 4; // W5100 chip never supports more than 4 sockets
5050
#endif
5151
for (uint8_t i=0; i < maxindex; i++) {
5252
if (server_port[i] == _port) {
@@ -81,7 +81,7 @@ EthernetClient EthernetServer::accept()
8181
chip = W5100.getChip();
8282
if (!chip) return EthernetClient(MAX_SOCK_NUM);
8383
#if MAX_SOCK_NUM > 4
84-
if (chip == 51) maxindex = 4; // W5100 chip never supports more than 4 sockets
84+
if (chip == 51 || chip == 50) maxindex = 4; // W5100 chip never supports more than 4 sockets
8585
#endif
8686
for (uint8_t i=0; i < maxindex; i++) {
8787
if (server_port[i] == _port) {
@@ -108,7 +108,7 @@ EthernetServer::operator bool()
108108
{
109109
uint8_t maxindex=MAX_SOCK_NUM;
110110
#if MAX_SOCK_NUM > 4
111-
if (W5100.getChip() == 51) maxindex = 4; // W5100 chip never supports more than 4 sockets
111+
if (W5100.getChip() == 51 || W5100.getChip() == 50) maxindex = 4; // W5100 chip never supports more than 4 sockets
112112
#endif
113113
for (uint8_t i=0; i < maxindex; i++) {
114114
if (server_port[i] == _port) {
@@ -165,7 +165,7 @@ size_t EthernetServer::write(const uint8_t *buffer, size_t size)
165165
chip = W5100.getChip();
166166
if (!chip) return 0;
167167
#if MAX_SOCK_NUM > 4
168-
if (chip == 51) maxindex = 4; // W5100 chip never supports more than 4 sockets
168+
if (chip == 51 || chip == 50) maxindex = 4; // W5100 chip never supports more than 4 sockets
169169
#endif
170170
available();
171171
for (uint8_t i=0; i < maxindex; i++) {

src/socket.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ uint8_t EthernetClass::socketBegin(uint8_t protocol, uint16_t port)
6868
chip = W5100.getChip();
6969
if (!chip) return MAX_SOCK_NUM; // immediate error if no hardware detected
7070
#if MAX_SOCK_NUM > 4
71-
if (chip == 51) maxindex = 4; // W5100 chip never supports more than 4 sockets
71+
if (chip == 51 || chip == 50) maxindex = 4; // W5100 chip never supports more than 4 sockets
7272
#endif
7373
//Serial.printf("W5000socket begin, protocol=%d, port=%d\n", protocol, port);
7474
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
@@ -132,7 +132,7 @@ uint8_t EthernetClass::socketBeginMulticast(uint8_t protocol, IPAddress ip, uint
132132
chip = W5100.getChip();
133133
if (!chip) return MAX_SOCK_NUM; // immediate error if no hardware detected
134134
#if MAX_SOCK_NUM > 4
135-
if (chip == 51) maxindex = 4; // W5100 chip never supports more than 4 sockets
135+
if (chip == 51 || chip == 50) maxindex = 4; // W5100 chip never supports more than 4 sockets
136136
#endif
137137
//Serial.printf("W5000socket begin, protocol=%d, port=%d\n", protocol, port);
138138
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);

src/utility/w5100.cpp

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,29 @@ uint8_t W5100Class::init(void)
157157
writeSnTX_SIZE(i, 0);
158158
}
159159
#endif
160-
// Try W5100 last. This simple chip uses fixed 4 byte frames
160+
// Try W5100S. Brandnew based W5100.
161+
} else if (isW5100S()) {
162+
CH_BASE_MSB = 0x04;
163+
#ifdef ETHERNET_LARGE_BUFFERS
164+
#if MAX_SOCK_NUM <= 1
165+
SSIZE = 8192;
166+
writeTMSR(0x03);
167+
writeRMSR(0x03);
168+
#elif MAX_SOCK_NUM <= 2
169+
SSIZE = 4096;
170+
writeTMSR(0x0A);
171+
writeRMSR(0x0A);
172+
#else
173+
SSIZE = 2048;
174+
writeTMSR(0x55);
175+
writeRMSR(0x55);
176+
#endif
177+
SMASK = SSIZE - 1;
178+
#else
179+
writeTMSR(0x55);
180+
writeRMSR(0x55);
181+
#endif
182+
// Try W5100 last. This simple chip uses fixed 4 byte frames
161183
// for every 8 bit access. Terribly inefficient, but so simple
162184
// it recovers from "hearing" unsuccessful W5100 or W5200
163185
// communication. W5100 is also the only chip without a VERSIONR
@@ -210,7 +232,7 @@ uint8_t W5100Class::softReset(void)
210232
uint8_t mr = readMR();
211233
//Serial.print("mr=");
212234
//Serial.println(mr, HEX);
213-
if (mr == 0) return 1;
235+
if (mr == 0 || (mr == 3 && chip == 50)) return 1;
214236
delay(1);
215237
} while (++count < 20);
216238
return 0;
@@ -231,6 +253,23 @@ uint8_t W5100Class::isW5100(void)
231253
return 1;
232254
}
233255

256+
uint8_t W5100Class::isW5100S(void)
257+
{
258+
chip = 50;
259+
//Serial.println("w5100.cpp: detect W5100S chip");
260+
if (!softReset()) return 0;
261+
writeMR(0x13);
262+
if (readMR() != 0x13) return 0;
263+
writeMR(0x03);
264+
if (readMR() != 0x03) return 0;
265+
int ver = readVERSIONR_W5100S();
266+
//Serial.print("version=");
267+
//Serial.println(ver);
268+
if (ver != 81) return 0;
269+
//Serial.println("chip is W5100S");
270+
return 1;
271+
}
272+
234273
uint8_t W5100Class::isW5200(void)
235274
{
236275
chip = 52;
@@ -275,6 +314,12 @@ W5100Linkstatus W5100Class::getLinkStatus()
275314

276315
if (!init()) return UNKNOWN;
277316
switch (chip) {
317+
case 50:
318+
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
319+
phystatus = readPHYCFGR_W5100S();
320+
SPI.endTransaction();
321+
if (phystatus & 0x01) return LINK_ON;
322+
return LINK_OFF;
278323
case 52:
279324
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
280325
phystatus = readPSTATUS_W5200();
@@ -286,7 +331,7 @@ W5100Linkstatus W5100Class::getLinkStatus()
286331
phystatus = readPHYCFGR_W5500();
287332
SPI.endTransaction();
288333
if (phystatus & 0x01) return LINK_ON;
289-
return LINK_OFF;
334+
return LINK_OFF;
290335
default:
291336
return UNKNOWN;
292337
}
@@ -296,7 +341,7 @@ uint16_t W5100Class::write(uint16_t addr, const uint8_t *buf, uint16_t len)
296341
{
297342
uint8_t cmd[8];
298343

299-
if (chip == 51) {
344+
if (chip == 51 || chip == 50) {
300345
for (uint16_t i=0; i<len; i++) {
301346
setSS();
302347
SPI.transfer(0xF0);
@@ -387,7 +432,7 @@ uint16_t W5100Class::read(uint16_t addr, uint8_t *buf, uint16_t len)
387432
{
388433
uint8_t cmd[4];
389434

390-
if (chip == 51) {
435+
if (chip == 51 || chip == 50) {
391436
for (uint16_t i=0; i < len; i++) {
392437
setSS();
393438
#if 1

src/utility/w5100.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,10 @@ class W5100Class {
208208
__GP_REGISTER16(UPORT, 0x002E); // Unreachable Port address in UDP mode (W5100 only)
209209
__GP_REGISTER8 (VERSIONR_W5200,0x001F); // Chip Version Register (W5200 only)
210210
__GP_REGISTER8 (VERSIONR_W5500,0x0039); // Chip Version Register (W5500 only)
211+
__GP_REGISTER8 (VERSIONR_W5100S, 0x0080); // Chip Version Register (W5100S only)
211212
__GP_REGISTER8 (PSTATUS_W5200, 0x0035); // PHY Status
212213
__GP_REGISTER8 (PHYCFGR_W5500, 0x002E); // PHY Configuration register, default: 10111xxx
214+
__GP_REGISTER8 (PHYCFGR_W5100S, 0x003C); // PHY Status
213215

214216

215217
#undef __GP_REGISTER8
@@ -300,6 +302,7 @@ class W5100Class {
300302
static uint8_t ss_pin;
301303
static uint8_t softReset(void);
302304
static uint8_t isW5100(void);
305+
static uint8_t isW5100S(void);
303306
static uint8_t isW5200(void);
304307
static uint8_t isW5500(void);
305308

@@ -313,14 +316,14 @@ class W5100Class {
313316
static const uint16_t SMASK = 0x07FF;
314317
#endif
315318
static uint16_t SBASE(uint8_t socknum) {
316-
if (chip == 51) {
319+
if (chip == 51 || chip == 50) {
317320
return socknum * SSIZE + 0x4000;
318321
} else {
319322
return socknum * SSIZE + 0x8000;
320323
}
321324
}
322325
static uint16_t RBASE(uint8_t socknum) {
323-
if (chip == 51) {
326+
if (chip == 51 || chip == 50) {
324327
return socknum * SSIZE + 0x6000;
325328
} else {
326329
return socknum * SSIZE + 0xC000;

0 commit comments

Comments
 (0)