Приветствую,
пишу библиотеку к Layer-2 24-портовому свитчу (25 порт - внутренний для связи с cpu), и одна из функций - VLAN. Неудобство в том, что каждый порт представлен двумя регистрами: один 16 битный, второй - 9бит. Каждый из этих регистров имеет такой смысл (цитирую даташит): "the ports which p1~p25 can forward to". Для примера:
порты {5, 6, 7, 8, 25} помещаем в vlan группу 1, соответственно пишем следующие рег-ры:
reg5-1 to 0x00f0, reg5-2 to 0x100 (for port 5)
reg6-1 to 0x00f0, reg6-2 to 0x100 (for port 6)
reg7-1 to 0x00f0, reg7-2 to 0x100 (for port 7)
reg8-1 to 0x00f0, reg8-2 to 0x100 (for port 8)
reg25-1 to 0x00f0, reg25-2 to 0x100 (for port 25)
Стал сочинять ф-цию и застрял:
int vlan_port_add(int unit, unsigned int vid, unsigned int port)
{
int p;
long portmask;
uint16_t val;
portmask = getPortmask(vid); /* current bitmask stored in NVRAM */
portmask |= 1 << (port - 1);
savePortmask(vid, portmask);
mask = portmask;
for (p = 0; p < PORT_MAX; p++) {
if (mask & 1) {
addr = R_VLAN_ENTRY_BASE + (p * 2); /* evaluate register address */
val = portmask & 0x0000ffff;
writeReg(unit, addr, val);
/* XXX */
}
mask >>= 1;
}
...
}
Но этот код правильно работает только для младших битов. Т.е. пробегая по маске, записываем в регистры, соответствующие установленным битам, и если доберемся до битов 17-24, и порты им соответствующие, должны быть в VLAN группе вместет с портами, например, 1-4, то в регистры портов reg1-2, reg2-2, reg3-2 и пр. ничего не пишется (см. пример выше).
Надеюсь понятно изложил

Код, само собой не идеален, но мне скорее нужна идея реализации, алгоритм.