//#define STATS //Print how many times each thread loops per second #include //USB Host Driver #include //USB Ethernet Driver #include //Multi-thread #include //TCP/IP stack #include //USB settings USBHost myusb; USBHub hub1(myusb); USBHub hub2(myusb); ASIXEthernet asix1(myusb); volatile uint8_t rbuf[1024*2]; // recieve buffer volatile uint8_t sbuf[2000]; // send buffer volatile uint16_t sbuflen; // length of data to send uint8_t MacAddress[6] = {0x00,0x50,0xB6,0xBE,0x8B,0xB4}; //Not setup yet, but can't be 0 //Uses your adapters builtin address right now #ifdef STATS elapsedMillis advertise; uint32_t Looped; volatile uint32_t LoopedUSB; #endif Threads::Mutex fnet_mutex1; //Used by the stack uint16_t fnet_mutex1_calls; //Used to support recursiveness Threads::Mutex fnet_mutex2; //Used by the services uint16_t fnet_mutex2_calls; //Used to support recursiveness uint8_t mutex_init_calls = 0; //Change which mutex to assign fnet_return_t teensy_mutex_init(fnet_mutex_t *mutex) { Serial.print("Mutex initialized: "); Serial.println(mutex_init_calls); fnet_return_t result = FNET_ERR; if(mutex){ if(mutex_init_calls == 0)*mutex = (fnet_mutex_t)&fnet_mutex1; else if(mutex_init_calls == 1)*mutex = (fnet_mutex_t)&fnet_mutex2; mutex_init_calls++; result = FNET_OK; } return result; } void teensy_mutex_release(fnet_mutex_t *mutex) { Serial.println("Mutex released"); mutex_init_calls = 0; return; //TeensyThreads has no function for this? } void teensy_mutex_lock(fnet_mutex_t *mutex) { // Serial.print("Mutex locked: "); // Serial.println((uint32_t)((Threads::Mutex*)*mutex)); Threads::Mutex *_mutex = (Threads::Mutex*)*mutex; if(&fnet_mutex1 == *mutex) { fnet_mutex1_calls++; if(fnet_mutex1_calls == 1){ _mutex->lock(); } } else if(&fnet_mutex2 == *mutex) { fnet_mutex2_calls++; if(fnet_mutex2_calls == 1){ _mutex->lock(); } } } void teensy_mutex_unlock(fnet_mutex_t *mutex) { // Serial.print("Mutex unlocked: "); // Serial.println((uint32_t)((Threads::Mutex*)*mutex)); Threads::Mutex *_mutex = (Threads::Mutex*)*mutex; if(&fnet_mutex1 == *mutex) { fnet_mutex1_calls--; if(fnet_mutex1_calls == 0){ _mutex->unlock(); } } else if(&fnet_mutex2 == *mutex) { fnet_mutex2_calls--; if(fnet_mutex2_calls == 0){ _mutex->unlock(); } } } const fnet_mutex_api_t teensy_mutex_api ={ .mutex_init = teensy_mutex_init, .mutex_release = teensy_mutex_release, .mutex_lock = teensy_mutex_lock, .mutex_unlock = teensy_mutex_unlock, }; fnet_time_t timer_get_ms(void){ //Used for multi-thread version fnet_time_t result; result = millis(); return result; } fnet_dhcp_cln_params_t dhcp_params; //DHCP intialization parameters fnet_dhcp_cln_desc_t dhcp_desc; //DHCP object fnet_netif_desc_t current_netif; //Network interface, USB Ethernet static DMAMEM fnet_uint8_t stack_heap[(128U * 1024U)]; void setup() { Serial.begin(115200); // Wait 1.5 seconds before turning on USB Host. If connected USB devices // use too much power, Teensy at least completes USB enumeration, which // makes isolating the power issue easier. delay(1500); Serial.println("USB Host InputFunctions example"); delay(10); myusb.begin(); asix1.setHandleRecieve(handleRecieve); asix1.setHandleWait(handleWait); Serial.println("USB Ready"); // threads.addThread(usbpoll); threads.addThread(usbthread); //All of these have to be set to function correctly setHandleOutput(handleOutput); setHandleSetMACAddress(handleSetMACAddress); setHandleGetMACAddress(handleGetMACAddress); setHandlePHYRead(handlePHYRead); setHandlePHYWrite(handlePHYWrite); setHandleMulticastLeave(handleMulticastLeave); setHandleMulticastJoin(handleMulticastJoin); setHandleIsConnected(handleIsConnected); } void loop() { while(1){ myusb.Task(); asix1.read(); if(uint8_t index = Serial.available()){ if(index >= 64) break; char serialMessage[64]; for(uint8_t i = 0;i= 1000) { advertise -= 1000; Serial.print("Looped: "); Serial.print(Looped); Serial.print(" LoopedUSB: "); Serial.print(LoopedUSB); if(fnet_netif_is_initialized(current_netif)){ Serial.print(" FNETMemFree: "); Serial.print((uint32_t)fnet_free_mem_status()); } Serial.print(" LinkSpeed: "); Serial.println(asix1.PHYSpeed ? "100BASE" : "10BASE"); Looped = 0; LoopedUSB = 0; } #endif } }