aboutsummaryrefslogtreecommitdiff
path: root/libraries/ethernet/socket.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/ethernet/socket.c')
-rw-r--r--libraries/ethernet/socket.c127
1 files changed, 127 insertions, 0 deletions
diff --git a/libraries/ethernet/socket.c b/libraries/ethernet/socket.c
new file mode 100644
index 0000000..8ccfdd3
--- /dev/null
+++ b/libraries/ethernet/socket.c
@@ -0,0 +1,127 @@
+#include "wirish.h"
+#include "w5100.h"
+#include "socket.h"
+
+#define ETHERNET_DEBUG
+
+#ifdef ETHERNET_DEBUG
+ #define ETH_DBG(...) iprintf(__VA_ARGS__)
+#else
+ #define ETH_DBG(...)
+#endif
+
+
+int32 socket(int32 type) {
+ /* tcp */
+ w5100_write(SOCKET0_BASE + SN_MR, 0x01);
+}
+
+int32 bind(int32 sockfd, uint16 port) {
+ int32 rc;
+ /* port 80 */
+ w5100_write(SOCKET0_BASE + SN_PORT0, 0x00);
+ w5100_write(SOCKET0_BASE + SN_PORT1, 80); // low byte
+
+ /* open */
+ ETH_DBG("open()\n");
+ w5100_write(SOCKET0_BASE + SN_CR, CR_OPEN);
+ rc = w5100_read(SOCKET0_BASE + SN_SR);
+ ETH_DBG("SR: 0x%0x\n", rc);
+
+}
+
+static char buf[2048];
+
+int32 listen(int32 sockfd) {
+ uint16 bytesAvailable = 0;
+ uint32 i;
+ int32 rc;
+
+ /* listen */
+ ETH_DBG("listen()\n");
+ w5100_write(SOCKET0_BASE + SN_CR, CR_LISTEN);
+ rc = w5100_read(SOCK_ADDR(0, SN_SR));
+ ETH_DBG("SR: 0x%0x\n", rc);
+
+ /* wait for connection */
+ while(1) {
+ if (w5100_read(SOCK_ADDR(0, SN_SR)) == SOCK_ESTABLISHED) {
+ ETH_DBG("Connection received\n");
+ break;
+ }
+ }
+ /* wait for data */
+ while (!bytesAvailable) {
+ bytesAvailable += (w5100_read(SOCK_ADDR(0, SN_RX_RSR0)) << 8);
+ bytesAvailable += w5100_read(SOCK_ADDR(0, SN_RX_RSR1));
+ }
+ ETH_DBG("recv: %u bytes\n", bytesAvailable);
+
+ /* Read them out */
+ uint32 rxrd = w5100_read(SOCK_ADDR(0, SN_RX_RD0)) << 8;
+ rxrd += w5100_read(SOCK_ADDR(0, SN_RX_RD1));
+ ETH_DBG("rxrd: %u\n", rxrd);
+
+ for (i = 0; i < bytesAvailable; i++) {
+ buf[i] = w5100_read(0x6000 + i);
+ iprintf("%c", buf[i]);
+ }
+
+ sprintf(buf, "HTTP/1.1 200 OK\r\n"
+ "Content-Type: text/html\r\n\r\n"
+ "analogInput(2): %u<BR>"
+ "analogInput(15): %u<BR>"
+ "analogInput(16): %u<BR>"
+ "analogInput(17): %u<BR>"
+ "analogInput(18): %u<BR>"
+ "analogInput(19): %u<BR>"
+ "analogInput(20): %u<BR>"
+ "analogInput(27): %u<BR>"
+ "analogInput(28): %u<BR>"
+ "watch out for cows",
+ analogRead(2),
+ analogRead(15),
+ analogRead(16),
+ analogRead(17),
+ analogRead(18),
+ analogRead(19),
+ analogRead(20),
+ analogRead(27),
+ analogRead(28));
+
+ uint32 send_size = strlen(buf);
+
+ iprintf("sending %u bytes()\n", send_size);
+
+ uint16 txwr;
+ uint16 get_offset;
+ uint16 get_start_address;
+ uint16 tx_mask = 0x07ff;
+ /* calculate offset address */
+ txwr = w5100_read(SOCK_ADDR(0, SN_TX_WR0)) << 8;
+ txwr += w5100_read(SOCK_ADDR(0, SN_TX_WR1));
+ iprintf("SN_TX_WR: %x\n", txwr);
+
+ get_offset = txwr & tx_mask;
+ get_start_address = 0x4000 + get_offset;
+
+ iprintf("get_offset: %x send_size: %u\n" , get_offset, send_size);
+
+ /* copy data to get_start_address */
+ for (i = 0; i < send_size; i++) {
+ w5100_write(get_start_address + i, buf[i]);
+ }
+
+ txwr += send_size;
+
+ w5100_write(SOCK_ADDR(0, SN_TX_WR0), (txwr & 0xFF00) >> 8 );
+ w5100_write(SOCK_ADDR(0, SN_TX_WR1), (txwr & 0x00FF));
+ w5100_write(SOCK_ADDR(0, SN_CR), CR_SEND);
+
+ delay(1);
+ w5100_write(SOCK_ADDR(0, SN_CR), CR_DISCON);
+ delay(1);
+ w5100_write(SOCK_ADDR(0, SN_CR), CR_CLOSE);
+}
+
+