Я использую порт PCI-e на процессоре Freescale MPC8308 (который основан на архитектуре PowerPC), и у меня есть некоторые проблемы при попытке его использовать. Конечное устройство PCI-e имеет объем памяти, равный 256 МБ. Я могу легко прочитать и записать конфигурационное пространство устройства конечной точки, используя пакет «pciutils».Доступ к памяти в формате PCI-e с mmap
После написания правильных значений в конфигурационных регистрах и получения разрешения на доступ к памяти; Я пытался получить доступ к области памяти, используя «ММАП()» функции в C и используется дескриптор файла, расположенного по адресу:
«/sys/devices/pci0000:00/0000:00:00.0/resource0»
который был ровно 256 МБ (равным памяти пространства конечного устройства), поэтому кажется, что я использую правильный путь для дескриптора файла. здесь вы можете найти свой код, используя «ММАП()», как упомянуто в https://github.com/billfarrow/pcimem:
https://github.com/billfarrow/pcimem/blob/master/pcimem.c
Но, к сожалению, когда я пытаюсь использовать пространство памяти, используя возвращаемый адрес «ттар()» функции; Я не могу правильно считывать регистры только для чтения устройства конечной точки. Кроме того, когда я читаю адреса больше, чем «0x7FFFFFC», MPC8308 перезагружается. Учитывая вышеописанную ситуацию, не могу ли я пропустить какие-либо шаги для инициализации интерфейса PCI-e? Должен ли я что-либо изменить в изображении ядра Linux или кодах U-Boot? Есть ли что-то другое для использования PowerPC PCI-e с mmap()? У вас есть код примера, который может помочь мне прочитать память PCI-e?
Thanks
256 МБ пространства памяти для конечной точки кажется слишком большим. На моем процессоре (i.MX6) я не могу иметь конечную точку размером больше 16 МБ. У вас есть ошибка init при загрузке Linux для PCIe? Каково ваше устройство памяти PCI-e? Это ПЛИС? – FabienM
да, это тоже показалось мне слишком большим, но у меня нет ошибок при загрузке Linux, и он посвятил 256 Мб памяти для устройства, как я могу видеть в/proc/iomem. конечное устройство не является ПЛИС. Его ASIC с интерфейсом PCI-e. –
Другим маршрутом будет поиск физического адреса устройства и его ограничение, а также отображение в/dev/mem. (Честно говоря, это не может гарантировать, что это сработает. Мне интересно, если это так.) – ruthafjord