Внезапно обнаружил, что англоязычный даташит на сайте WCH для
сабжевой микрухи не содержит описания некоторых регистров Ethernet
(таблица хэшей и фильтр приема пакетов). Выше есть перевод
китайского даташита, в котором эти регистры описаны. Фильтрация по
хэшу у меня, вроде как, работает вот таким макаром (на базе
китайского разъяснения): typedef uint8_t eth_addr_t[6];
#define HASH_POLY 0x04C11DB7UL
static uint8_t hash_crc(const eth_addr_t mac)
{
uint8_t c;
uint32_t crc = 0xFFFFFFFF;
int byte, bit;
for (byte = 0; byte < 6; byte++)
{
c = mac[byte];
for (bit = 0; bit < 8; bit++)
{
crc = (crc << 1) ^ ((((crc >> 31) ^ c) & 0x01) ? HASH_POLY : 0);
c >>= 1;
}
}
crc >>= 26;
return (uint8_t)crc;
}
int32_t eth_add_mac(const eth_addr_t hwaddr)
{
uint8_t hash;
hash = hash_crc(hwaddr);
if (hash > 31)
{
hash -= 32;
R32_ETH_HTH |= (1 << hash);
}
else
{
R32_ETH_HTL |= (1 << hash);
}
R8_ETH_ERXFCON |= RB_ETH_ERXFCON_HTEN;
// success
return 0;
}