В драйвере регистры MAC загружаются примерно так
Код
#define ETH_OCM_MODER 0x00
#define IOWR_ETH_OCM_MODER(base, dat) IOWR(base, ETH_OCM_MODER, dat)
IOWR_ETH_OCM_MODER(ETH_OCM_0_BASE, 0);
Далее IOWR определяется в файле io.h как
#define __IO_CALC_ADDRESS_NATIVE(BASE, REGNUM) \
((void *)(((alt_u8*)BASE) + ((REGNUM) * (SYSTEM_BUS_WIDTH/8))))
#define IOWR(BASE, REGNUM, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)), (DATA))
#define IOWR_ETH_OCM_MODER(base, dat) IOWR(base, ETH_OCM_MODER, dat)
IOWR_ETH_OCM_MODER(ETH_OCM_0_BASE, 0);
Далее IOWR определяется в файле io.h как
#define __IO_CALC_ADDRESS_NATIVE(BASE, REGNUM) \
((void *)(((alt_u8*)BASE) + ((REGNUM) * (SYSTEM_BUS_WIDTH/8))))
#define IOWR(BASE, REGNUM, DATA) \
__builtin_stwio (__IO_CALC_ADDRESS_NATIVE ((BASE), (REGNUM)), (DATA))
Чтобы убедиться, что это все работает попытался перевести такую операцию записи на регистр PIO c базовым адресом 00001000
Надеялся, что если выполнить например это
Код
#define ETH_TEST_ADDR 0x00000100
#define TEST_MODER 0x00
#define IOWR_TEST_MODER(base, dat) IOWR(base, TEST_MODER, dat)
// Test
IOWR_TEST_MODER(ETH_TEST_ADDR, 0x55);
#define TEST_MODER 0x00
#define IOWR_TEST_MODER(base, dat) IOWR(base, TEST_MODER, dat)
// Test
IOWR_TEST_MODER(ETH_TEST_ADDR, 0x55);
то на выходе PIO, к которому подключены светодиоды будет наблюдаться нужный код - 0x55.
Но похоже ничего не работает.
Подскажите пожалуйста в чем загвоздка?
(Функцией типа IOWR_ALTERA_AVALON_PIO_DATA(0x00001000, 0x55) светодиоды управляются)
Я понимаю, что функция IOWR предназначена для записи данных во внутренний регистр и с PIO может не прокатить.
Но как тогда убедиться что она работает?
Пока не вижу, что MAC хоть как-то задышал. Поэтому и начал с самого хвоста.