torik 0 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба Всем привает. Есть плата с Cyclone V. К плисине подключен компьютер стандарта COM Express. Плисина - endpoint. Сперва включается плисина, затем она включает комп. Все работает. Затем, если перезагружаем комп (линукс, через консоль), то после его загрузки чтение данных из BAR0 идет с ошибкой, смещение какое-то нелепое. Опять перезагрузить - ошибка может уйти, а может остаться. Такое впечатление, что проблема в корке PCIe. Запись в BAR0 из компа проходит без ошибок. Но и при чтении смотрю шину корки PCIe, там все нормально, а комп получает другие данные! Когда комп перезагружается, он дергает nreset для корки PCI, с нее тоже ресет выходит, но ошибка возникает. Можно ли еще какую-то переинициализацию дли корки замутить? Настройки PCIe корки менял на все возможные варианты, не помогает... Описание логики ошибки: Проводится вычитка по одному байту с двух смещений, А и В, с ожидаемыми значениями А1 и В1. Если смещения находятся в пределах одного 64-битного слова - всё хорошо, результаты идентичны ожидаемым. Если же нет, то: 1) вычитаем байт со смещения А тысячу раз 2) вычитаем байт со смещением А 30 раз - каждый раз получим значение А1 3) вычитаем байт со смещением В 8 раз - каждый раз получим то же значение А1 4) вычитаем байт со смещением В - получим значение В1 5) вычитаем байт со смещением В 30 раз - каждый раз получим В1 6) вычитаем байт со смещением А 8 раз - каждый раз получим то же значение В1 7) вычитаем байт со смещением А - получим значение А1 8) вычитаем байт со смещением А 30 раз - каждый раз получим А1 Итого - задержка на 8 байт. От времени между чтениями не зависит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба Может глупость сморожу, но может там какая-то синхронизация нужна? Некий sync дернуть? Какая ОС? Был ли опыт написания драйвера для PCI до этого? А может Linux попробовать - повторится ли ошибка? В Linux проще PCI драйвер писать, и быть может легче будет отладить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба На компе линукс крутится. Драйвер самодельный. Раньше под виндой на windriver такого глюка не было. Некий sync дернуть? А конкретнее, что там можно дернуть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 33 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба Приветствую! Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?) и наверно что-что не так с логикой чтения при адресах не кратных 4 или 8. Может не сбрасывается шина корректно по ресету и остаются "старые данные" дающие сдвижку. Ну и наверное WinDrv мог имитировать чтение байта с невыровненым адресом через чтение слова а Вы наверное в своем драйвере пытаетесь читать байт напрямую. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба ... 3) вычитаем байт со смещением В 8 раз - каждый раз получим то же значение А1 ... А что видно на портах корки в этой время? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 29 мая, 2018 Опубликовано 29 мая, 2018 · Жалоба а Вы наверное в своем драйвере пытаетесь читать байт напрямую. Да, мы читаем байты напрямую. Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?) А что видно на портах корки в этой время? Да, авалон, но на нем все выглядит как надо во время чтения. Даже ресет, который генерит PCIe заведен на модули к ней подключенные. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло. Ваш драйвер в зачаточном состоянии? Нет там ничего секретного? Тогда предлагаю его вывалить сюда напосмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Во-первых - заказчик категорически против))) Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Во-первых - заказчик категорически против))) Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену... Тогда совет номер 1: сделать минимальный драйвер-пример для отладки данной конкретной проблемы, и выложить его для всех. Тем более речь про такую ерунду как BARы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Тогда совет номер 1 Попробуем. У альтеры есть пример драйвера под линукс? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба У альтеры есть пример драйвера под линукс? Причем тут альтера? Простейший драйвер для PCI он и в африке таковой, от производителя ПЛИС не зависит. Готового примера не встречал, разве что очень устаревшее и переусложненное. Могу мою заготовку предоставить вечером (сейчас нет возможности). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
torik 0 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба При загрузке драйвера: int init_mmio(struct pci_dev* pdev, u8 __iomem **bar) { int ret = -EINVAL; u64 resource_flags = 0; resource_flags = pci_resource_flags(pdev, BAR_OFFSET); dev_info(&pdev->dev, "pci_resource_flags: 0x%llX", resource_flags); if (!(resource_flags & IORESOURCE_MEM)) { dev_err(&pdev->dev, "No IORESOURCE_MEM"); goto error; } ret = pci_request_regions(pdev, "electronix_sample"); if (ret != 0) { dev_err(&pdev->dev, "pci_request_regions failed"); goto error; } *bar = pcim_iomap(pdev, BAR_OFFSET, BAR_SIZE); if (!*bar) { dev_err(&pdev->dev, "pcim_iomap failed"); goto pci_release_regions; } dev_info(&pdev->dev, "init_mmio succeed"); return 0; pci_release_regions: pci_release_regions(pdev); error: return ret; } При выгрузке драйвера: pci_release_regions(); pci_disable_device(); devres_release_group(); Чтение данных: readb(bar[offset]); readw(bar[offset]); readl(bar[offset]); readq(bar[offset]); pci_resource_flags возвращает: IORESOURCE_MEM_64 IORESOURCE_SIZEALIGN IORESOURCE_PREFETCH IORESOURCE_MEM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба Нужен компилируемый пример. Пусть Vendor ID там будет исправлен на AAAA, чтоб враги не догадались. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kuzmi4 0 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба ... пример драйвера под линукс? Вот примеры от Xilinx: AR#65444: Xilinx PCI Express DMA Drivers and Software Guide Что касается именно Altera - вот нашёл: https://github.com/a4a881d4/sgdma-pcie-driver-demo На сколько я понял это "4.2.1 Linux Driver" отсюда : PCI Express in Qsys Example Designs К сожалению именно с авалоновской версией корки не работал потому вряд ли что смогу по делу подсказать.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться