xxxmatrixxx 0 16 января, 2018 Опубликовано 16 января, 2018 (изменено) · Жалоба Всем добрый вечер!!! Есть плата с шиной Pci Express, в данной плате реализована работа MSI прерываний я написал драйвер под Linux, разрешение MSI прерываний осуществляется через функцию pci_msi_anable и все хорошо работало, пока не появилась потребность переписать драйвер под QNX 6.5.0 по документации на pci server(стандартный, что устанавливается вместе с QNX), достаточно просто передать флаг PCI_USE_MSI в функцию pci_attach_device и все само настроится... но вот только не работает... вот таким образом я получаю дескриптор на устройство: pci_dev_hndl = pci_attach_device(NULL,( PCI_SEARCH_VENDEV | PCI_INIT_ALL | PCI_INIT_IRQ | PCI_MASTER_ENABLE | PCI_USE_MSI),minor,&pci_info); результат так же сохраняется в структуре pci_dev_info pci_info, одним из полей которой является: uint8_t msi; данное поле всегда равно нулю при считывании после выполнения pci_attach_device, мне казалось, там должен быть сохранен номер msi прерывания, информации по данному полю я не смог найти если набрать команду pci -vvv до загрузки драйвера и после, то ничего не меняется в адресном пространстве pci, самое главное, что я смотрю, это capability регистр с id 0x05, там видно, что msi прерывания запрещены, адреса в нулях и данные... Class = Communication (Other) Vendor ID = a203h, Unknown Device ID = 9472h, Unknown Unknown PCI index = 0h Class Codes = 078000h Revision ID = 3h Bus number = 3 Device number = 0 Function num = 0 Status Reg = 10h Command Reg = 107h I/O space access enabled Memory space access enabled Bus Master enabled Special Cycle operations ignored Memory Write and Invalidate disabled Palette Snooping disabled Parity Error Response disabled Data/Address stepping disabled SERR# driver enabled Fast back-to-back transactions to different agents disabled PCI INTx enabled Header type = 0h Single-function BIST = 0h Build-in-self-test not supported Latency Timer = 0h Cache Line Size= 8h un-cacheable BAR - 0 [Mem] = f7d80000h 64bit length 524288 enabled Subsystem Vendor ID = a203h Subsystem ID = 9472h Max Lat = 0ns Min Gnt = 0ns PCI Int Pin = INT A Interrupt line = 5 CPU Interrupt = 5h Capabilities Pointer = 40h Capability ID = 1h - Power Management Capabilities = 7e03h - 8h Capability ID = 5h - Message Signaled Interrupts Capabilities = 80h - 0h Capability ID = 10h - PCI Express Capabilities = 1h - 288fc0h Device Dependent Registers: 0x040: 0148 037e 0800 0000 0558 8000 0000 0000 0x050: 0000 0000 0000 0000 1000 0100 c08f 2800 0x060: 1028 0b00 11f4 0300 0000 1110 0000 0000 0x070: 0000 0000 0000 0000 0000 0000 0000 0000 ... 0x0f0: 0000 0000 0000 0000 0000 0000 0000 0000 я решил ручками написать функцию, которая активирует MSI прерывания, формально реализовать ту же функцию pci_msi_anable в линукс, но наткнулся на особенную организацию MSI прерываний в архитектуре Intel, настроил адреса вот так: addr_dma_msi_lo = 0xFEE00000; // low part address addr_dma_msi_hi = 0x00000000; // hi part address данные: msi_cap_message_data = 0x4042; Class = Communication (Other) Vendor ID = a203h, Unknown Device ID = 9472h, Unknown Unknown PCI index = 0h Class Codes = 078000h Revision ID = 3h Bus number = 3 Device number = 0 Function num = 0 Status Reg = 10h Command Reg = 507h I/O space access enabled Memory space access enabled Bus Master enabled Special Cycle operations ignored Memory Write and Invalidate disabled Palette Snooping disabled Parity Error Response disabled Data/Address stepping disabled SERR# driver enabled Fast back-to-back transactions to different agents disabled PCI INTx disabled Header type = 0h Single-function BIST = 0h Build-in-self-test not supported Latency Timer = 0h Cache Line Size= 8h un-cacheable BAR - 0 [Mem] = f7d80000h 64bit length 524288 enabled Subsystem Vendor ID = a203h Subsystem ID = 9472h Max Lat = 0ns Min Gnt = 0ns PCI Int Pin = INT A Interrupt line = 5 CPU Interrupt = 5h Capabilities Pointer = 40h Capability ID = 1h - Power Management Capabilities = 7e03h - 8h Capability ID = 5h - Message Signaled Interrupts Capabilities = 81h - fee0000h Enabled Capability ID = 10h - PCI Express Capabilities = 1h - 288fc0h Device Dependent Registers: 0x040: 0148 037e 0800 0000 0558 8100 0000 e0fe 0x050: 0000 0000 4240 0000 1000 0100 c08f 2800 0x060: 1028 0b00 11f4 0300 0000 1110 0000 0000 0x070: 0000 0000 0000 0000 0000 0000 0000 0000 ... 0x0f0: 0000 0000 0000 0000 0000 0000 0000 0000 но мне не получилось зарегистрировать обработчик прерывания на вектор 0x42, что я указал, постоянно InterruptAttach выдавал ошибку уважаемые форумчане, был ли у кого опыт включения MSI прерываний под QNX 6.5.0 X86, поделитесь, пожалуйста опытом, 2 недели уже бьюсь, пока результата никакого???? Изменено 16 января, 2018 пользователем xxxmatrixxx Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xxxmatrixxx 0 17 января, 2018 Опубликовано 17 января, 2018 · Жалоба нашел причину, почему стандартные средства QNX не отрабатывали флаг PCI_USE_MSI - необходимо грузить ядро с pci-bios-v2 вместо простого pci-bios, после пересборки ядра с этим сервером, MSI верно определились всю информацию можно найти в http://www.qnx.com/developers/docs/6.5.0/i...ck_gettime.html вбив в строку поиска msi надеюсь, эта информация кому-нибудь поможет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 1 июля, 2018 Опубликовано 1 июля, 2018 · Жалоба надеюсь, эта информация кому-нибудь поможет Информация любопытная... познавательная... Только вряд ли "кому-нибудь поможет", ... потому как OS QNX на сегодня, на 36-м году своей жизни (с 1982) - абсолютно мёртвое изделие, конченое ... и даже не только в преждних версиях 6.5.Х, а даже в 7.0 от марта 2017 - это всё "потуги". Проторговались, прожлобились... :santa2: ... при активной помощи питерской "СВД Встраиваемые системы" :wacko: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться