Code:
// stepl's lwIP 2.0.2, for IDE add -I to boards.txt
// https://forum.pjrc.com/threads/45647-k6x-LAN8720(A)-amp-lwip
// ftpd with SD lib TODO
#include <SPI.h>
#include <SD.h>
#include <time.h>
// These were the includes used for the first FTP attempt
//#include "lwip_t41.h"
//#include "lwip/inet.h"
//#include "lwip/dhcp.h"
//#include "lwip_ftpd-sd.h"
#include "lwip_t41.h"
#include "QNEthernet.h" // added per https://github.com/ssilverman/QNEthernet
using namespace qindesign::network; // added per https://github.com/ssilverman/QNEthernet
//
#include "lwip/inet.h"
#include "lwip/dhcp.h"
#include "lwip_ftpd-sd.h"
#define LOG Serial.printf
#define PHY_ADDR 0 /*for read/write PHY registers (check link status,...)*/
#define DHCP 0
//#define IP "192.168.1.19"
#define IP "169.254.17.177" // Same first 2 bytes as T41_AudioTftpTest_ManitouVer.ino
#define MASK "255.255.255.0"
//#define GW "192.168.1.1"
#define GW "169.254.17.1"
File *file;
static void dateTime(uint16_t* p_date, uint16_t* p_time)
{
time_t rawtime;
struct tm *timeinfo;
time(&rawtime);
timeinfo = localtime(&rawtime);
*p_date = FAT_DATE(timeinfo->tm_year + 1900, timeinfo->tm_mon, timeinfo->tm_mday);
*p_time = FAT_TIME(timeinfo->tm_hour, timeinfo->tm_min, 0);
}
extern "C" {
extern int _gettimeofday_r(struct _reent *r, struct timeval *__tp, void *__tzp);
//sd,ftp - set current time for new files, dirs.
int _gettimeofday_r(struct _reent *r, struct timeval *__tp, void *__tzp)
{
//seconds and microseconds since the Epoch
//__tp->tv_sec = 0;
//__tp->tv_usec = 0;
return 0;
}
}
static void teensyMAC(uint8_t *mac)
{
uint32_t m1 = HW_OCOTP_MAC1;
uint32_t m2 = HW_OCOTP_MAC0;
mac[0] = m1 >> 8;
mac[1] = m1 >> 0;
mac[2] = m2 >> 24;
mac[3] = m2 >> 16;
mac[4] = m2 >> 8;
mac[5] = m2 >> 0;
}
static void netif_status_callback(struct netif *netif)
{
static char str1[IP4ADDR_STRLEN_MAX], str2[IP4ADDR_STRLEN_MAX], str3[IP4ADDR_STRLEN_MAX];
LOG("netif status changed: ip %s, mask %s, gw %s\n", ip4addr_ntoa_r(netif_ip_addr4(netif), str1, IP4ADDR_STRLEN_MAX), ip4addr_ntoa_r(netif_ip_netmask4(netif), str2, IP4ADDR_STRLEN_MAX), ip4addr_ntoa_r(netif_ip_gw4(netif), str3, IP4ADDR_STRLEN_MAX));
}
static void link_status_callback(struct netif *netif)
{
LOG("enet link status: %s\n", netif_is_link_up(netif) ? "up" : "down");
}
File root;
void setup()
{
Serial.begin(115200);
while (!Serial) delay(100);
Serial.println("Compiled at: " __DATE__ ", " __TIME__);
// FatFile::dateTimeCallback(dateTime);
Serial.print("MEMP_NUM_TCP_PCB_LISTEN = ");
Serial.println(MEMP_NUM_TCP_PCB_LISTEN);
Serial.print("Initializing SD card...");
if (!SD.begin(BUILTIN_SDCARD)) {
//if (!SD.begin(SDCARD_CS_PIN)) { // Use this line when the SD card is in the Audio board instead of 4.1
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
root = SD.open("/");
root.rewindDirectory();
printDirectory(root, 0);
root.rewindDirectory();
LOG("PHY_ADDR %d\n", PHY_ADDR);
uint8_t mac[6];
teensyMAC(mac);
LOG("MAC_ADDR %02x:%02x:%02x:%02x:%02x:%02x\n", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
LOG("DHCP is %s\n", DHCP == 1 ? "on" : "off");
ip_addr_t ip, mask, gateway;
if (DHCP == 1)
{
ip = IPADDR4_INIT(IPADDR_ANY);
mask = IPADDR4_INIT(IPADDR_ANY);
gateway = IPADDR4_INIT(IPADDR_ANY);
}
else
{
inet_aton(IP, &ip);
inet_aton(MASK, &mask);
inet_aton(GW, &gateway);
}
//enet_init(PHY_ADDR, mac, &ip, &mask, &gateway);
// Replace above with below per https://github.com/mesflores/teensy41_ethernet/blob/master/t41ether/lwip_ftpd/lwip_ftpd.ino
// Sid 2021-08-19
//enet_init(&ip, &mask, &gateway);
// and remove for QNEthernet
// Instead call .begin()
// begin defined as: static void begin(IPAddress ip, IPAddress dns, IPAddress gateway);
IPAddress myIp = IPAddress(169,254,17,177);
IPAddress myMask = IPAddress(255,255,255,0);
IPAddress myGW = IPAddress(169,254,17,1);
Ethernet.begin(myIp, myMask, myGW);
//Ethernet.begin();
Serial.print(F("My IP address before setting again: "));
Ethernet.localIP().printTo(Serial);
Serial.println();
Ethernet.setLocalIP(myIp);
Serial.print(F("My IP address after: "));
Ethernet.localIP().printTo(Serial);
Serial.println();
netif_set_status_callback(netif_default, netif_status_callback);
netif_set_link_callback(netif_default, link_status_callback);
netif_set_up(netif_default);
if (DHCP == 1)
dhcp_start(netif_default);
ftpd_init(&SD);
}
void loop()
{
static uint32_t last_ms;
uint32_t ms;
enet_proc_input();
ms = millis();
if (ms - last_ms > 100)
{
last_ms = ms;
enet_poll();
}
if (Serial.available())
{
char c = toupper(Serial.read());
switch (c)
{
case 'F':
root.rewindDirectory();
printDirectory(root, 0);
root.rewindDirectory();
break;
case '\n':
case '\r':
break;
default:
{
Serial.print(F("?? Cmd?: "));
Serial.println(c);
}
break;
}
}
}
void printDirectory(File dir, int numTabs)
{
while (true)
{
File entry = dir.openNextFile();
if (!entry)
{
if (numTabs == 0) Serial.println("** Done **");
return;
}
for (uint8_t i = 0; i < numTabs; i++)
Serial.print('\t');
Serial.print(entry.name());
if (entry.isDirectory())
{
Serial.println("/");
printDirectory(entry, numTabs + 1);
}
else
{
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
Thanks,