void ethos_setup(ethos_t *dev, const ethos_params_t *params) { dev->netdev.driver = &netdev_driver_ethos; dev->uart = params->uart; dev->state = WAIT_FRAMESTART; dev->framesize = 0; dev->frametype = 0; dev->last_framesize = 0; tsrb_init(&dev->inbuf, (char*)params->buf, params->bufsize); mutex_init(&dev->out_mutex); uint32_t a = random_uint32(); memcpy(dev->mac_addr, (char*)&a, 4); a = random_uint32(); memcpy(dev->mac_addr+4, (char*)&a, 2); dev->mac_addr[0] &= (0x2); /* unset globally unique bit */ dev->mac_addr[0] &= ~(0x1); /* set unicast bit*/ uart_init(params->uart, params->baudrate, ethos_isr, (void*)dev); uint8_t frame_delim = ETHOS_FRAME_DELIMITER; uart_write(dev->uart, &frame_delim, 1); ethos_send_frame(dev, dev->mac_addr, 6, ETHOS_FRAME_TYPE_HELLO); }
int uart_stdio_write(const char* buffer, int len) { #ifndef USE_ETHOS_FOR_STDIO uart_write(UART_STDIO_DEV, (uint8_t *)buffer, (size_t)len); #else ethos_send_frame(ðos, (uint8_t*)buffer, len, ETHOS_FRAME_TYPE_TEXT); #endif return len; }
ssize_t stdio_write(const void* buffer, size_t len) { #ifndef USE_ETHOS_FOR_STDIO uart_write(STDIO_UART_DEV, (const uint8_t *)buffer, len); #else ethos_send_frame(ðos, (const uint8_t *)buffer, len, ETHOS_FRAME_TYPE_TEXT); #endif return len; }
static void _end_of_frame(ethos_t *dev) { switch(dev->frametype) { case ETHOS_FRAME_TYPE_DATA: if (dev->framesize) { dev->last_framesize = dev->framesize; dev->netdev.event_callback((netdev_t*) dev, NETDEV_EVENT_ISR); } break; case ETHOS_FRAME_TYPE_HELLO: ethos_send_frame(dev, dev->mac_addr, 6, ETHOS_FRAME_TYPE_HELLO_REPLY); /* fall through */ case ETHOS_FRAME_TYPE_HELLO_REPLY: if (dev->framesize == 6) { tsrb_get(&dev->inbuf, (char*)dev->remote_mac_addr, 6); } break; } _reset_state(dev); }