Jump to content

    

ovn

Участник
  • Content Count

    55
  • Joined

  • Last visited

Community Reputation

0 Обычный

About ovn

  • Rank
    Участник

Recent Profile Visitors

620 profile views
  1. Под голое железо начинать надо с zynq 7000, и лекций Адама Тейлора. На Гите Xilinx XilinxProcessorIPLib, примеры по работе с железом. От простого к сложному у Ultrascale+ свои заморочки. Советую сразу осваивать Vitis.
  2. Работайте с xil_printf. Вроде проект Hello Word валяется на GITе и там всё просто.
  3. Есть плата ZCU102, для неё ранее был написана библиотека-драйвер в Vivado SDK 2018.3(2019.1), для работы с FLASH на плате по QSPI, использует стандартный xqspipsu.h, просто читалка-писалка по адресу, очистка секторов. Но на Vivado 2020.1 и Vitis тот же самый проект не работает, вернее работает через раз, то пишет и читает нормально, то выводит ерунду. В чём причина, не понятно, но понятно, что другой bsp, другая структура сборки проекта.
  4. Здравствуйте. Есть железка на Zynq 7000, к ПК подключается по UART и для начальной отладки-прошивки используется JTAG. В основном рабочем режиме требуется по UART(по прерыванию) кидать в железку данные и записывать их в память, читать из памяти и отправлять назад, по команде сохранять из памяти в FLASH, управлять реле по GPIO и т. п. Под bare metal надо городить какой то диспетчер-автомат для обработки запросов с ПК, а есть ли в Linux что то стандартное для этих целей?
  5. Код с софтовыми привёл выше, с аппаратными так же. Нужно разобраться с GICом.
  6. Если есть операционка на A53, и хочется работать с R5 без операционки, то надо копать библиотеку OpenAMP, смотреть UG1186.
  7. Нашёл ответ, заработало, помогли на форуме Xilinx надо определять приоритет прерываний #define INTC_DEVICE_INT_ID (0x00) // SGI 0 #define SGI0_INTR_PRI (0x90) // Lowest Priority #define SGI0_INTR_TRIG (0x03) // Rising-edge Sensitive #define INTC_DEVICE_INT_ID1 (0x01) // SGI 1 #define SGI1_INTR_PRI (0x88) #define SGI1_INTR_TRIG (0x03) // Rising-edge Sensitive и т. д. после Xil_ExceptionEnable(); /* Set priority and trigger type for SGI 1 */ XScuGic_SetPriorityTriggerType(&InterruptController, INTC_DEVICE_INT_ID, SGI0_INTR_PRI, SGI0_INTR_TRIG); /* Set priority and trigger type for SGI 2 */ XScuGic_SetPriorityTriggerType(&InterruptController, INTC_DEVICE_INT_ID1, SGI1_INTR_PRI, SGI1_INTR_TRIG);
  8. Пробовал, нулевое 0x0E прерывание обрабатывается, а 0x1E нет, в чём моя ошибка? #include <stdio.h> #include <stdlib.h> #include "xil_io.h" #include "xil_exception.h" #include "xparameters.h" #include "xil_cache.h" #include "xil_printf.h" #include "xil_types.h" #include "xscugic.h" #define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID #define INTC_DEVICE_INT_ID 0x0E #define INTC_DEVICE_INT_ID1 0x1E void DeviceDriverHandler(void *CallbackRef); void DeviceDriverHandler1(void *CallbackRef); XScuGic InterruptController; /* Instance of the Interrupt Controller Экземпляр контроллера прерываний */ static XScuGic_Config *GicConfig; /* The configuration parameters of the */ volatile static int InterruptProcessed = FALSE; int main(void) { //int Status; xil_printf("GIC Example Test\r\n"); GicConfig = XScuGic_LookupConfig(INTC_DEVICE_ID); XScuGic_CfgInitialize(&InterruptController, GicConfig, GicConfig->CpuBaseAddress); XScuGic_SelfTest(&InterruptController); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler) XScuGic_InterruptHandler, &InterruptController); Xil_ExceptionEnable(); XScuGic_Connect(&InterruptController, INTC_DEVICE_INT_ID, (Xil_ExceptionHandler)DeviceDriverHandler, (void *)&InterruptController); XScuGic_Enable(&InterruptController, INTC_DEVICE_INT_ID); XScuGic_Connect(&InterruptController, INTC_DEVICE_INT_ID1, (Xil_ExceptionHandler)DeviceDriverHandler1, (void *)&InterruptController); XScuGic_Enable(&InterruptController, INTC_DEVICE_INT_ID1); XScuGic_SoftwareIntr(&InterruptController, //прерывание INTC_DEVICE_INT_ID, XSCUGIC_SPI_CPU0_MASK); XScuGic_SoftwareIntr(&InterruptController, //прерывание1 INTC_DEVICE_INT_ID1, XSCUGIC_SPI_CPU0_MASK); while (1) { // xil_printf("cycle \r\n"); } xil_printf("Successfully ran GIC Example Test\r\n"); return XST_SUCCESS; } void DeviceDriverHandler(void *CallbackRef) { xil_printf("interrupt \r\n"); InterruptProcessed = TRUE; } void DeviceDriverHandler1(void *CallbackRef) { xil_printf("interrupt1 \r\n"); InterruptProcessed = TRUE; }
  9. Как запустить обработку одного програмного прерывания(SGI), понятно, а как нескольких на одном ядре, всего их 16, как установить приоритет прерываний? простой код для одного програмного прерывания #include <stdio.h> #include <stdlib.h> #include "xil_io.h" #include "xil_exception.h" #include "xparameters.h" #include "xil_cache.h" #include "xil_printf.h" #include "xil_types.h" #include "xscugic.h" #define INTC_DEVICE_ID XPAR_SCUGIC_0_DEVICE_ID #define INTC_DEVICE_INT_ID 0x0E void DeviceDriverHandler(void *CallbackRef); XScuGic InterruptController; /* Instance of the Interrupt Controller Экземпляр контроллера прерываний */ static XScuGic_Config *GicConfig; /* The configuration parameters of the volatile static int InterruptProcessed = FALSE; int main(void) { //int Status; xil_printf("GIC Example Test\r\n"); GicConfig = XScuGic_LookupConfig(INTC_DEVICE_ID); XScuGic_CfgInitialize(&InterruptController, GicConfig, GicConfig->CpuBaseAddress); XScuGic_SelfTest(&InterruptController); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler) XScuGic_InterruptHandler, &InterruptController); Xil_ExceptionEnable(); XScuGic_Connect(&InterruptController, INTC_DEVICE_INT_ID, (Xil_ExceptionHandler)DeviceDriverHandler, (void *)&InterruptController); XScuGic_Enable(&InterruptController, INTC_DEVICE_INT_ID); XScuGic_SoftwareIntr(&InterruptController, //вызываем прерывание INTC_DEVICE_INT_ID, XSCUGIC_SPI_CPU0_MASK); while (1) { // xil_printf("cycle \r\n"); } xil_printf("Successfully ran GIC Example Test\r\n"); return XST_SUCCESS; } void DeviceDriverHandler(void *CallbackRef) // обработчик прерывания { xil_printf("interrupt \r\n"); InterruptProcessed = TRUE; }
  10. Под baremetal пишем в VS, потом перенос в Vitis на А53 с правкой кода, под R5 аппаратные функции непосредственно в Vitis(SDK). Советую Vitis 2020.1 и выше осваивать.
  11. Ещё как вариант решения проблемы, заменить DDR на старую, она там, как в ноутбуках, но экспериментировать не хочется.
  12. К Vivado идут файлы поддержки плат, и там нет этой ревизии. В общем решили проблему https://www.xilinx.com/support/answers/71961.html
  13. На работе имеются отладочные платы ZCU102 rev. 1.0 в которых ранее работали и новые ZCU102 rev. 1.1, там другая память DDR и проекты из под старого Vivado 2018.3 с новыми платами они не запускаются. Кто как решал проблему? Понятно, что можно 2020.1 поставить, но старые проекты нужно переделывать заново.
  14. Vasily_A, я Vivado 2018.3 и 2019.1 использую. Пересобрать проект будет непросто, у вас там наверно ядро MicroBlaze, а в Zynq A9. Вивада такая кака, что из старой версии в более новой проекты не всегда собираются.