|
PCIe Cyclone V, ошибка при чтении из BAR0 |
|
|
|
May 29 2018, 10:08
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Всем привает.
Есть плата с 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 байт. От времени между чтениями не зависит.
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
May 29 2018, 13:42
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Цитата а Вы наверное в своем драйвере пытаетесь читать байт напрямую. Да, мы читаем байты напрямую. Цитата Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?) Цитата А что видно на портах корки в этой время? Да, авалон, но на нем все выглядит как надо во время чтения. Даже ресет, который генерит PCIe заведен на модули к ней подключенные.
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
May 30 2018, 14:37
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Код При загрузке драйвера:
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
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|