В общем, "если гора не идёт к Магомеду..."...
На основе официального мануала ug585-Zynq-7000-TRM.pdf создан набор заголовочных файлов с описаниями memory-mapped registers (MMRs). Регистры и описания их битовых полей распределены по файлам на основе модулей. Zynq7000 содержит 31 тип модулей, соответственно создан 31 файл с описаниями регистров. Плюс к этому добавлены ещё два файла: один просто включает в себя для удобства все остальные (ps7mmrs.h), и один содержит адреса модулей (ps7modmap.h), он используется в других файлах.
Взять можно
тут.
Подробности.Набор файлов не один, а три - в разных стилях, на основе :
- констант (const int, const uintptr);
- перечислений (enum);
- макросов (#define), это традиционный стиль.
Тут уж кому что больше нравится.
Описания регистров в комментариях содержат полную справочную информацию из оригинального документа, т.е. открыв тот или иной заголовочный файл, нет необходимости смотреть pdf - вся информация доступна по месту.
Вообще, в pdf'нике описание сделано по единому формату - зачёт редактору документа, но вот описания модулей делались, очевидно, разными людьми, тут полный разнобой и по стилям, по объёму информации, и по именованию регистров/полей, и т.д. и т.п. Из-за этого пришлось поредактировать.
Итого:
- Все имена приведены к единому стилю - в верхнем регистре с символами подчёркивания в качестве разделителей.
- Имена регистров выполнены по формату <MODULE_NAME>_<REGISTER_NAME>_REG. Исключение составляют регистры контроллера прерываний - GIC, там именование достаточно традиционное, почти все имена заканчиваются на R, что означает "регистр", поэтому суффикса _REG к ним не добавлено.
- Если модуль имеет два или более экземпляров, то после суффикса _REG в имени регистра следует ещё суффикс экземпляра модуля - например, регистры управления UART'ов имеют вид UART_CTRL_REG0 и UART_CTRL_REG1.
- Для каждого битового поля введены два макроса в формате <BITFIELD_NAME>_MASK (маска) <BITFIELD_NAME>_BPOS (позиция битового поля).
- Исходные имена, которые были в CaMeL стиле приведены к виду CA_ME_L.
- Немало было мест, где имена регистров и особенно битовых полей были идентичными.
- У некоторых битовых полей имён вообще не было, пришлось добавить.
- Отдельные имена регистров были очень длинными - фактически состояли из строки, описывающей все поля регистра, - заменены более короткими.
- В именах регистров и их полей общеупотребительные CONTROL, STATUS, INTERRUPT заменены на более короткие CTRL, STS, INT соответственно.
- Ну, и ещё кое-что по мелочи.
Соответственно, имена в документации не имеют точного соответствия реальным программным именам - тут, чтобы использовать имя регистра, нужно смотреть в заголовочный файл. Но этот процесс достаточно простой. Порядок описания соответствует документации.
В общем, пока "первый блин". Но компилятор не ругается, т.е. синтаксически всё нормально и конфликта имён тоже нету.
Надеюсь, ещё кому-нибудь будет полезно. Замечания приветствуются.
Статистика ( Per Mod - количество регистров в модуле, Total - всего регистров в модулях данного типа, Bit Fields - количество битовых полей в регистрах модуля, внизу сумма):
CODE
--------------------------------------------------------------------------------
# Module Per Mod Total Bit Fields
--------------------------------------------------------------------------------
1 AXI_HP 10 40 35
2 CAN 33 66 179
3 DDRC 113 113 343
4 CTI 55 220 71
5 CORTEXA9_PMU 21 42 21
6 PTM 77 154 186
7 DAP 28 28 63
8 ETB 37 37 72
9 FTM 43 43 72
10 FUNNEL 26 26 57
11 ITM 62 62 79
12 TPIU 39 39 100
13 DEVCFG 20 20 172
14 DMAC 92 184 390
15 GEM 97 194 366
16 GPIO 52 52 61
17 QOS301 9 27 19
18 GPV_TRUSTZONE 2 2 2
19 I2C 11 22 69
20 L2CACHE 47 47 198
21 MPCORE 125 125 335
22 OCM 4 4 17
23 QSPI 19 19 92
24 SDIO 25 50 191
25 SLCR 162 162 1237
26 SMCC 27 27 170
27 SPI 13 26 59
28 SWDT 4 4 13
29 TTC 33 66 81
30 UART 16 32 119
31 USB 51 102 273
--------------------------------------------------------------------------------
Summary: 1353 2035 5142
********************************************************************************
«Отыщи всему начало, и ты многое поймёшь» К. Прутков