Перейти к содержанию

Всем привает.

 

Есть плата с 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 байт. От времени между чтениями не зависит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может глупость сморожу, но может там какая-то синхронизация нужна? Некий sync дернуть? Какая ОС?

Был ли опыт написания драйвера для PCI до этого?

 

А может Linux попробовать - повторится ли ошибка? В Linux проще PCI драйвер писать, и быть может легче будет отладить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На компе линукс крутится. Драйвер самодельный. Раньше под виндой на windriver такого глюка не было.

 

 

Некий sync дернуть?

А конкретнее, что там можно дернуть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

 

Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?) и наверно что-что не так с логикой чтения при адресах не кратных 4 или 8. Может не сбрасывается шина корректно по ресету и остаются "старые данные" дающие сдвижку.

Ну и наверное WinDrv мог имитировать чтение байта с невыровненым адресом через чтение слова а Вы наверное в своем драйвере пытаетесь читать байт напрямую.

 

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
...

3) вычитаем байт со смещением В 8 раз - каждый раз получим то же значение А1

...

А что видно на портах корки в этой время?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
а Вы наверное в своем драйвере пытаетесь читать байт напрямую.

Да, мы читаем байты напрямую.

 

Судя по всему у Вас внутри шина данных из PCIe 64 бита (что там - Avalon?)

А что видно на портах корки в этой время?

Да, авалон, но на нем все выглядит как надо во время чтения. Даже ресет, который генерит PCIe заведен на модули к ней подключенные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Сделали чтение через BAR0 исключительно 64битными словами. Все равно не помогло.

Ваш драйвер в зачаточном состоянии? Нет там ничего секретного? Тогда предлагаю его вывалить сюда напосмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых - заказчик категорически против)))

Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Во-первых - заказчик категорически против)))

Во-вторых - запаришься смотреть исходники, там очень много специфических вещей, не имеющих отношения непосредственно к обмену...

Тогда совет номер 1: сделать минимальный драйвер-пример для отладки данной конкретной проблемы, и выложить его для всех. Тем более речь про такую ерунду как BARы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Тогда совет номер 1

Попробуем.

 

 

У альтеры есть пример драйвера под линукс?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
У альтеры есть пример драйвера под линукс?

Причем тут альтера? Простейший драйвер для PCI он и в африке таковой, от производителя ПЛИС не зависит.

Готового примера не встречал, разве что очень устаревшее и переусложненное.

Могу мою заготовку предоставить вечером (сейчас нет возможности).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
При загрузке драйвера:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нужен компилируемый пример. Пусть Vendor ID там будет исправлен на AAAA, чтоб враги не догадались.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
... пример драйвера под линукс?

Вот примеры от 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

 

К сожалению именно с авалоновской версией корки не работал потому вряд ли что смогу по делу подсказать..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация