Цитата
Если нет системы не получиться использовать сокет, если правильно понял.
Да.
Если у Вас пинга нету чего вы лезете к tcp_slowtmr ??? вам нужен только ARP, IP, ICMP. В изернете нельзя передавать пакеты меньшие 64 байт!!!,
многие МАС не умеют дополнять пакет если он меньше 64 байт это надо будет сделать вам самим. STM32 умеет это делать но п омоему надо где то битик установить.
P.S. Все по шагам.
1) Делаем функцию приема кадров изернет. Запускаем ее проверяем что она принимает правильно. Буфер расшифровываем в уме.
2) Делаем функцию передачи, создаем константный фрейм, засовываем его в функцию ловим ваершарком убеждаемся что все ок.
3) Прикручиваем эти функции к стеку.
4) Запускаем пинг. Смотрим ARP таблицу, если ваш МАС есть а девайс не пингается что с IP + ICMP, Если в таблице нету вашего МАСа копаем ARP.
5) Потом уже UDP + TCP
Я использую FreeRTOS + LwIP примерно так у меня выглядят функции драйвера (прием вынесен в отдельную задачу)
Прием:
Код
__task void EthernetDeamon(void *arg)
{
int32_t size;
struct pbuf *p,*q;
uint8_t* pkt;
struct netif *ethif = (struct netif *)arg;
for(;; )
{
size = HwEMAC::RecivePacket((void**)&pkt, 1000);
if ( size > 0 )
{
p = pbuf_alloc(PBUF_RAW, size, PBUF_POOL);
if (p != NULL)
{
for (q = p; q != NULL; q = q->next)
{
memcpy((u8_t*)q->payload, pkt, q->len);
pkt += q->len;
}
HwEMAC::Recived();
if (tcpip_input(p,ethif) != ERR_OK) pbuf_free(p);
}
}
else
{
LINKSTATUS_t ls = HwPHY::LinkStatus(PHY_ADDR);
if ( ls == NOLINK )
{
netif_set_link_down(ethif);
HwEMAC::Stop();
}
else
{
if (!netif_is_link_up(ethif))
{
HwEMAC::Start(ls);
netif_set_link_up(ethif);
}
}
}
}
};
P.S. tcpip_input - используется если стек работает в режиме ОС (NO_SYS = 0), если без ос то фреймы нужно запихивать в ethernet_input
передача:
Цитата
err_t EthernetOutput(struct netif *ethif, struct pbuf *p)
{
uint8_t* pkt;
struct pbuf *q;
if (HwEMAC::GetSendBuffer((void**)&pkt,20) != 0 ) return ERR_IF;
for(q = p; q != NULL; q = q->next)
{
memcpy(pkt, q->payload, q->len);
pkt += q->len;
}
HwEMAC::Send(p->tot_len);
return ERR_OK;
}