Таймер никак не хотел выдавать нужную частоту! пока я не удалил из конфига ядра драйвер таймера. Но без него не работает режим Full Realtime. Замкнутый круг.(((
замкнутый, если примеры "влоб" копировать и надеяться что все заработает как Вам надо. Кто вам мешает поменять tc0 например на tc3,4,5 ? вам прерывания от них не нужно генериовать так что никакой проблемы нет подправить.
at91_tc_write(AT91_TC_CMR,
AT91_TC_WAVE | AT91_TC_WAVESEL_UP_AUTO
| AT91_TC_ACPA_SET | AT91_TC_ACPC_CLEAR
| AT91_TC_TIMER_CLOCK1 ); // делитель для MCK, см даташит
at91_tc_write(AT91_TC_RC, 4); // число импульсов на период (делитель входящей частоты)
at91_tc_write(AT91_TC_RA, 2); // половина AT91_TC_RC если импульс/пауза 50/50
at91_tc_write(AT91_TC_IDR, -1);
at91_tc_write(AT91_TC_CCR, AT91_TC_SWTRG | AT91_TC_CLKEN);
iounmap(tc0_base);
return 0;
}
Консоль не выдаёт никаких тревожных сообщений. Но сигнала на ноге нет. В файле борды нога PA27 больше нигде не упоминается.
как же он заработает если вы включаете tc0 :) это у sam9g45 все шесть таймеров сидят на одном прерывании и включаются одним битом в PMC - в 9260 они раздеьно включаются/генерируют прервания. Еще учитывайте что в -rt патче используется не только tc0 но и tc1,tc2 для hrtimer.
clk_get(NULL, "tc0_clk") - получает информацию в виде указателя на структуру для соответствующего периферийного модуля по его наименованию, которое передается вторым аргументом ф-ции
clk_enable(tc1_clk) - устанавливает соответствующий этой периферии бит в регистре PMC Peripheral Clock Enable Register
поэтому для 9260 наименование для каждого таймера должно быть свое, в g45 было бы достаточно одного tc0_clk чтобы включить все таймеры.
на ноге просто ничего нет. Но как вы уже писали, tc1 тоже используется в rt патче. Все остальные таймеры висят на ногах SPI1, который мне позарез нужен.
там масса вариантов - у каждого таймера ,если вы не заметили, два независимых канала - RA/TIOA и RB/TIOB к тому же на 9260 помоему можно выбрать какой из блоков использовать tc0,1,2 или tc3,4,5 в драйвере clocksource через menuconfig.
Some chips provide more than one TC block, so you have the
choice of which one to use for the clock framework. The other
TC can be used for other purposes, such as PWM generation and
interval timing.
так что ставите тут 1 и можете спокойно использовать tc0 который у вас уже работал. Чтобы не было путаницы напомню: TCB0 - tc0,1,2 а TCB1 - tc3,4,5.
at91_tc_write(AT91_TC_CMR,
AT91_TC_WAVE | AT91_TC_WAVESEL_UP_AUTO
| AT91_TC_ACPA_SET | AT91_TC_ACPC_CLEAR
| AT91_TC_TIMER_CLOCK2); // делитель для MCK, см даташит
at91_tc_write(AT91_TC_RC, 125); // число импульсов на период (делитель входящей частоты)
at91_tc_write(AT91_TC_RA, 62); // половина AT91_TC_RC если импульс/пауза 50/50
at91_tc_write(AT91_TC_IDR, -1);
at91_tc_write(AT91_TC_CCR, AT91_TC_SWTRG | AT91_TC_CLKEN);
iounmap(tc3_base);
return 0;
}
На ноге PB0 пусто... Не пойму в чём дело.
я видел в исходниках функции at91_add_device_tc. Эта функция добавляет драйвер таймера в /sys/... Зачем? можно ли через эитот драйвер динамически менять частоту?