AT91RM9200 Шутки GCC или 16 разрядный доступ к 16 разрядной шине? Доброго время суток.
Есть плата на AT91RM9200 и 16 разрядное устройство подключенное через чипселект 6 как статическая память.
Если писать туда 32 разрядное слово,
/*(int *)BASE_ADDR = (int)value;/
то на диаграме видим один чипселект и два сигнала записи, а на шине данных два 16 битных слова. Что полностью соотвецтвует диаграмам от Атмела.
Если же писать 16 битное слово /*(short *)BASE_ADDR = (short)value;/
то на диаграме видим 2 чипселекта и 2 сигнала записи, а на шине данных наблюдаем сначала младший байт (а старших и младших адресах) , а затем старший байт. Что полностью НЕ СООТВЕТСТВУЕТ диаграмам от Атмела.
В ядре по этому поводу сказано:
/*
* Generic virtual read/write. Note that we don't support half-word
* read/writes. We define __arch_*[bl] here, and leave __arch_*w
* to the architecture specific code.
*/
Байт пишется так как и положено байту.
Вопрос: Что делать для того что бы вывести одно и только одно 16 разрядное слово на 16 разрядную шину данных в соответсвии с диаграмами в дата шите.
Так происходит и из под Linux и в загркзчике.
Настройки шины: AT91C_SMC2_WSEN |
AT91C_SMC2_DBW_16 |
AT91C_SMC2_BAT |
(10 & AT91C_SMC2_NWS) |
((7 << 8) & AT91C_SMC2_TDF ) |
((7 << 24) & AT91C_SMC2_RWSETUP) |
((7 << 29) & AT91C_SMC2_RWHOLD) );