Страниц: [1] 2 3
  Печать  
Автор Тема: аналог setpci ?  (Прочитано 15158 раз)
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« : Мая 14, 2013, 04:34:21 pm »

Здравствуйте!
Имеется PCI плата, с которой раньше работали в Линуксе. Работа осуществлялась исключительно коммандами inb/outb .

Т.е. сначала я узнавал адрес с помощью lspci, потом выставлял нужный бит в регистре command c помощью setpci, и потом уже общался с платой командами записи/чтения порта.

Вместо lspci в QNX я могу использовать просто pci, а есть ли такая же простая альтернатива setpci для установки нужного бита в регистре command ?

PS пробовал на скорую руку использовать в программе функции pci_attach(), pci_attach_device() и т.д. но из-за них почему-то система начинает безбожно тормозить. А мне надо просто у известного девайса постваить нужный бит в регистр. Хотелось чего по-проще (если такое существует).   
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #1 : Мая 14, 2013, 10:53:29 pm »

На скорую руку лучше использовать pci_write_config32() сразу после pci_attach().
Ну или предварительно цикл сделать с pci_read_config32() по всем шинам и девфункам, чтобы найти свою плату, а не из командной строки выискивать в выводе 'pci -vvv'

Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #2 : Мая 14, 2013, 11:29:29 pm »

На скорую руку лучше использовать pci_write_config32() сразу после pci_attach().
Ну или предварительно цикл сделать с pci_read_config32() по всем шинам и девфункам, чтобы найти свою плату, а не из командной строки выискивать в выводе 'pci -vvv'


Спасибо за совет! Завтра попробую.
А почему именно pci_write_config32() , мне же всего один бит поправить надо, не лучше pci_write_config8() ?
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #3 : Мая 15, 2013, 02:22:15 am »

Ну если один бит то да рид 8 , подправить бит и потом райт 8.
Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #4 : Мая 15, 2013, 05:41:48 pm »

Как-то работает через раз.
Если после загрузке компа порты оказываются enabled и в регистре command уже стоит 3h, то всё исправно работает, при желании можно с помощью pci_write_config8 изменить нужный бит (хотя еслитам уже стоит 3-ка, то менять ничего не надо).
А вот если после включения компьютера в command стоит 0h. То при использовании функции pci_attach_device компьютер зависает.
Так работает:

Код:
#include <stdio.h>
#include <hw/pci.h>
#include <string.h>

int main ()
{
int pci_server_handle = pci_attach(0);

printf("PCI server handle: %d\n", pci_server_handle);


void* PLXhandle;
uint32_t a_flags = PCI_SEARCH_VENDEV | PCI_INIT_ALL | PCI_SHARE;
uint32_t a_idx = 0;

struct pci_dev_info a_info;
memset( &a_info, 0, sizeof(a_info) );
a_info.DeviceId = 0x9050;
a_info.VendorId = 0x10b5;

//PLXhandle = pci_attach_device( NULL, a_flags, a_idx, &a_info);
//printf("PLX device handle: %d\n", PLXhandle );


pci_detach( pci_server_handle );
}

А так уже зависает (раскомментировал одну строчку):
Код:
#include <stdio.h>
#include <hw/pci.h>
#include <string.h>

int main ()
{
int pci_server_handle = pci_attach(0);

printf("PCI server handle: %d\n", pci_server_handle);


void* PLXhandle;
uint32_t a_flags = PCI_SEARCH_VENDEV | PCI_INIT_ALL | PCI_SHARE;
uint32_t a_idx = 0;

struct pci_dev_info a_info;
memset( &a_info, 0, sizeof(a_info) );
a_info.DeviceId = 0x9050;
a_info.VendorId = 0x10b5;

PLXhandle = pci_attach_device( NULL, a_flags, a_idx, &a_info);
//printf("PLX device handle: %d\n", PLXhandle );


pci_detach( pci_server_handle );
}

Может тут проблема быть в программе? Или тут скорее плохой компьютер или плата? (пока попробовать другой комп или плату возможности нет)
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #5 : Мая 15, 2013, 07:48:00 pm »

У вас с платой что-то не так, если вы еще не догадались. Если все с платой так, то биос дает ей ресурсы и разрешает порты в командном регистре. И в линухе не надо приседать с setpci. Да.

Если биос не разрешил портовый ввод-вывод в командном регистре, то а адреса портов скорее всего не выделил.

  Pci_attach_device() скорее всего зависает по той же причине, по которой биос не разрешил порты.
Записан
mv
Full Member
***
Offline Offline

Сообщений: 153


Просмотр профиля
« Ответ #6 : Мая 16, 2013, 11:19:04 am »

Плата, конечно, странная.

Попробуйте сначала без PCI_INIT_ALL подключиться, поставить свой бит и потом PCI_INIT_ALL выполнить.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #7 : Мая 16, 2013, 04:22:09 pm »

А вообще что это за плата такая? Нашел гуглем что это pci - iobus bridge. Также в одном месте пишут рassive pc/can interface. Если это мост, то возможно вам нужно pci server с опцией B запускать.
 pci-bios -B
« Последнее редактирование: Мая 16, 2013, 05:02:32 pm от ed1k » Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #8 : Мая 16, 2013, 05:07:47 pm »

А вообще что это за плата такая? Нашел гуглем что это pci - iobus bridge. Также в одном месте пишут рassive pc/can interface. Если это мост, то возможно вам нужно pci-server с опцией b запускать. Поищите тут поиском по форуму.
Плата - самодельный АЦП на основе контроллера  PLX PCI 9052, всё что осталось от тех, кто её делал - это алгоритм обмена информацией через ввод-вывод в порт. Изнчально она работала ещё в MS-DOS'е. Потом я переписал ПО снчала для тогдашней версии Убунту, а теперь вот пытаюсь для QNX.

У вас с платой что-то не так, если вы еще не догадались. Если все с платой так, то биос дает ей ресурсы и разрешает порты в командном регистре. И в линухе не надо приседать с setpci. Да.

Если биос не разрешил портовый ввод-вывод в командном регистре, то а адреса портов скорее всего не выделил.

  Pci_attach_device() скорее всего зависает по той же причине, по которой биос не разрешил порты.
Я тоже подозреваю, что проблемы в плате. Но тогда встаёт другой ворпос, чего такого делает линукс, что она не смотря на ошибки работает (после setserial'a), чего я не делаю в QNX.

Плата, конечно, странная.

Попробуйте сначала без PCI_INIT_ALL подключиться, поставить свой бит и потом PCI_INIT_ALL выполнить.


Попробовал. Сначала считываю регистры status и command, потом записываю значения с нужными битами, потом ещё раз считываю регистры. Регистры меняются.
Но если раскомментровать три строчки внизу и попробовать со второй попытки считать PCI_INIT_ALL, то точно такое же заисание Sad

Код:
#include <stdio.h>
#include <hw/pci.h>
#include <string.h>

int main ()
{
int pci_server_handle = pci_attach(0);

printf("PCI server handle: %d\n", pci_server_handle);

void* PLXhandle;
uint32_t a_flags = PCI_SEARCH_VENDEV  ;
uint32_t a_idx = 0;

struct pci_dev_info a_info;
memset( &a_info, 0, sizeof(a_info) );
a_info.DeviceId = 0x9050;
a_info.VendorId = 0x10b5;

PLXhandle = pci_attach_device( NULL, a_flags, a_idx, &a_info);
printf("PLX device handle: %d\n", PLXhandle );

printf("Bus number:0x%X,  DevFunc:0x%X\n", a_info.BusNumber, a_info.DevFunc );
printf("Base addr :0x%X,  0x%X\n", a_info.CpuBaseAddress[0], a_info.CpuBaseAddress[1] );

uint32_t reg = 0;
int retval = pci_read_config32( a_info.BusNumber, a_info.DevFunc, 0x04, 1, &reg);
printf("pci_read_config32() returned 0x%X\n", retval);
printf("  %X", reg );
printf("\n");

reg = 0x02800003;
retval = pci_write_config32( a_info.BusNumber, a_info.DevFunc, 0x04, 1, &reg);
printf("pci_write_config32() returned 0x%X\n", retval);
printf("  %X", reg );
printf("\n");

reg = 0;
retval = pci_read_config32( a_info.BusNumber, a_info.DevFunc, 0x04, 1, &reg);
printf("pci_read_config32() returned 0x%X\n", retval);
printf("  %X", reg );
printf("\n");


//void* attach2;
//attach2 = pci_attach_device( PLXhandle, PCI_INIT_BASE0, a_idx, &a_info);
//printf("Tried PCI_INIT_ALL: %d\n", attach2 );

pci_detach( pci_server_handle );
}

Вывод:
Код:
# ./plx_scan
PCI server handle: 3
PLX device handle: 134674408
Bus number:0x2,  DevFunc:0x18
Base addr :0x0,  0x0
pci_read_config32() returned 0x0
  2800003
pci_write_config32() returned 0x0
  2800003
pci_read_config32() returned 0x0
  2800003
 
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #9 : Мая 16, 2013, 05:47:04 pm »

Я не совсем понимаю зачем вам надо pci_attach_device() делать. Но чтобы разобраться почему оно зависает надо взять в руки pci local bus specification chapter configuration space и сделать дамп конфиг спейса вашего устройства. Если в нем вид-дид от балды прописаны, то наверняка есть и другие поля не правильно указанные. Вероятнее всего это приводит к зависанию.

А зачем вы печатаете CpuBaseAddress? Если вам надо PciBaseAddress.
Записан
mv
Full Member
***
Offline Offline

Сообщений: 153


Просмотр профиля
« Ответ #10 : Мая 16, 2013, 06:02:25 pm »

Такая конфигурация с BAR0=0 и включённым доступом к памяти и портам это сразу после запуска или уже после вызова вашей утилиты?
И всё-таки, работа с устройством идёт через память или IO?

Вы писали, что после BIOS'а порты (или память?) могут быть как включены, так и выключены. Это от чего зависит? Меняется конфигурация, настройки BIOS?
Интересно глянуть вывод pci -vvv в обоих случаях. И вывод lspci -vvv из linux, кстати, тоже интересно глянуть.

Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #11 : Мая 16, 2013, 07:24:24 pm »

Я не совсем понимаю зачем вам надо pci_attach_device() делать. Но чтобы разобраться почему оно зависает надо взять в руки pci local bus specification chapter configuration space и сделать дамп конфиг спейса вашего устройства. Если в нем вид-дид от балды прописаны, то наверняка есть и другие поля не правильно указанные. Вероятнее всего это приводит к зависанию.

Vendor ID и Device ID вроде бы правильные - http://www.pcidatabase.com/vendor_details.php?id=565 - как раз PLX PCI 9050. Дамп всего конфиг спейса сделаю завтра.

Цитировать
А зачем вы печатаете CpuBaseAddress? Если вам надо PciBaseAddress.

Тут http://www.qnx.com/developers/docs/6.4.1/neutrino/lib_ref/p/pci_attach_device.html пишут, что для x86 это одно и тоже. Но на всякий случай попробую.


Такая конфигурация с BAR0=0 и включённым доступом к памяти и портам это сразу после запуска или уже после вызова вашей утилиты?

Это я неудачно запостил(( Это вывод после второго запуска, в при первом запуске в регистре command был ноль:
 
Код:
# ./plx_scan
PCI server handle: 3
PLX device handle: 134674408
Bus number:0x2,  DevFunc:0x18
Base addr :0x0,  0x0
pci_read_config32() returned 0x0
  2800000
pci_write_config32() returned 0x0
  2800003
pci_read_config32() returned 0x0
  2800003

BAR0=0 в обоих случаях.


Цитировать
И всё-таки, работа с устройством идёт через память или IO?
Через IO. Но при удачном при рабочем состоянии платы в регистре command 3-ка, я на всякий случай тоже тройку пишу.

Цитировать
Вы писали, что после BIOS'а порты (или память?) могут быть как включены, так и выключены. Это от чего зависит? Меняется конфигурация, настройки BIOS?
Интересно глянуть вывод pci -vvv в обоих случаях. И вывод lspci -vvv из linux, кстати, тоже интересно глянуть.
Не знаю от чего зависит(( в БИОСе ничего не меняю. иногда плату переставляю в другой слот, но на статистике удачных-неудачных запусков это не сказывается.
Вообще, имхо, это ОЧЕНЬ похоже на неполадки с железом. Перегрев какой-нибудь, или блок питания барахлит. Но если железо, то не понятно, что такого делает линукс, что плата всё равно работает.
Выводы lspci и pci сделаю завтра.
Записан
ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #12 : Мая 16, 2013, 08:10:09 pm »

Ну если у вас бар0 и бар1 не прописаны, то не только тройку в коммандный регист _орить_ надо, но и адреса назначить. Линукс возможно назначает адреса, даже если запрещает устройство. Адреса в бары пишутся также как и командный регистр. (смещение в конфиг спейсе  и младшие биты, чтобы полючить Ио смотрите в спеке на pci шину)
Записан
mv
Full Member
***
Offline Offline

Сообщений: 153


Просмотр профиля
« Ответ #13 : Мая 17, 2013, 11:48:44 am »

Кстати, да, тоже интересно, что в линуксовом коде делаете. BIOS ведь просто так не будет устройство отключать. И lspci -vvv до и после вызова утилиты тоже интересно.

Попробуйте еще, как ed1k советовал, запустить PCI сервер с ключем -B. Если устройство себя как мост типа OTHER заявляет то это может повлиять. Еще, флажок -x можно попробовать с и без -B, чтобы он не включал-выключал доступ к памяти.


Для PCI адресов обертки PCI_* есть:
Код:
if (PCI_IS_IO(pci_info.CpuBaseAddress[i]) )
{
printf("IO space at %#llx for %#x bytes\n",
                PCI_IO_ADDR(pci_info.CpuBaseAddress[i]), pci_info.BaseAddressSize[i] );
}
else if (PCI_IS_MEM( pci_info.CpuBaseAddress[i] ) )
{
printf("Memory space at %#llx for %#x bytes\n",
                PCI_MEM_ADDR(pci_info.CpuBaseAddress[i]), pci_info.BaseAddressSize[i] );
}
Записан
Белый пони
Участник
*
Offline Offline

Сообщений: 13


Просмотр профиля
« Ответ #14 : Мая 17, 2013, 05:25:47 pm »

Теперь совсем старнно Sad
Линукс включает порты как и раньше. А QNX теперь удачно открывает изначально не открытые порты. Ничего не понимаю. Всё что я сделал это поставил свежую батарейку в материнскую плату(

Вот вывод lspci с конфигурационным пространством до и после включения в Ubuntu:

Код:
root@serg-desktop:~# lspci -vvvxxx -d 10b5:9050
02:04.0 DPIO module: PLX Technology, Inc. PCI <-> IOBus Bridge (rev 02)
Subsystem: Device ddd1:0002
Control: I/O- Mem- BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 11
Region 1: I/O ports at a000 [disabled] [size=128]
Region 2: I/O ports at a400 [disabled] [size=256]
Region 3: Memory at fa000000 (32-bit, non-prefetchable) [disabled] [size=256]
Region 4: [virtual] I/O ports at a800 [size=256]
Region 5: Memory at fa000100 (32-bit, non-prefetchable) [size=256]
Kernel modules: hisax
00: b5 10 50 90 00 00 80 02 02 00 00 11 00 00 00 00
10: 00 00 00 00 01 00 00 00 01 a4 00 00 00 00 00 fa
20: ff ff ff ff 00 01 00 fa ff ff ff ff d1 dd 02 00
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Код:
root@serg-desktop:~# setpci -d 10b5:9050 command=3
root@serg-desktop:~# lspci -vvvxxx -d 10b5:9050
02:04.0 DPIO module: PLX Technology, Inc. PCI <-> IOBus Bridge (rev 02)
Subsystem: Device ddd1:0002
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Interrupt: pin A routed to IRQ 11
Region 1: I/O ports at a000 [size=128]
Region 2: I/O ports at a400 [size=256]
Region 3: Memory at fa000000 (32-bit, non-prefetchable) [size=256]
Region 4: [virtual] I/O ports at a800 [size=256]
Region 5: Memory at fa000100 (32-bit, non-prefetchable) [size=256]
Kernel modules: hisax
00: b5 10 50 90 03 00 80 02 02 00 00 11 00 00 00 00
10: 00 00 00 00 01 00 00 00 01 a4 00 00 00 00 00 fa
20: ff ff ff ff 00 01 00 fa ff ff ff ff d1 dd 02 00
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

А вот pci -vvv до и после дампа конфиг спейса:

Код:
Class          = Data Acquisition (DPIO)
Vendor ID      = 10b5h, PLX Technology, Inc.
Device ID      = 9050h,  PCI <-> IOBus Bridge
PCI index      = 0h
Class Codes    = 110000h
Revision ID    = 2h
Bus number     = 2
Device number  = 4
Function num   = 0
Status Reg     = 8280h
Command Reg    = 0h
        I/O space access disabled
        Memory space access disabled
        Bus Master disabled
        Special Cycle operations ignored
        Memory Write and Invalidate disabled
        Palette Snooping disabled
        Parity Error Response disabled
        Data/Address stepping disabled
        SERR# driver disabled
        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= 0h
BAR - 1 [I/O]  = a000h length 128 disabled
BAR - 2 [I/O]  = 0h length 256 disabled
BAR - 3 [Mem]  = 0h 32bit length 256 disabled
BAR - 4 [I/O]  = 0h length 256 disabled
BAR - 5 [Mem]  = 0h 32bit length 256 disabled
Subsystem Vendor ID = ddd1h
Subsystem ID        = 2h
Max Lat        = 0ns
Min Gnt        = 0ns
PCI Int Pin    = INT A
Interrupt line = 0
CPU Interrupt  = 0h
Device Dependent Registers:
0x040:  0000 0000 0000 0000   0000 0000 0000 0000
...
0x0f0:  0000 0000 0000 0000   0000 0000 0000 0000


Код:
# /c/dumb_config
PCI server handle: 3
PLX device handle: 134674408
Bus number:0x2,  DevFunc:0x20
Base addr :  0x0  0xA001  0xA201  0xFA000000  0xA301  0xFA000100

  B5  10  50  90   3   0  80   2   2   0   0  11   0   0   0   0
   0   0   0   0   1  A0   0   0   1  A2   0   0   0   0   0  FA
  FF  FF  FF  FF   0   1   0  FA  FF  FF  FF  FF  D1  DD   2   0
   0   0   0   0   0   0   0   0   0   0   0   0   6   1   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
#


Код:
Class          = Data Acquisition (DPIO)
Vendor ID      = 10b5h, PLX Technology, Inc.
Device ID      = 9050h,  PCI <-> IOBus Bridge
PCI index      = 0h
Class Codes    = 110000h
Revision ID    = 2h
Bus number     = 2
Device number  = 4
Function num   = 0
Status Reg     = 280h
Command Reg    = 3h
        I/O space access enabled
        Memory space access enabled
        Bus Master disabled
        Special Cycle operations ignored
        Memory Write and Invalidate disabled
        Palette Snooping disabled
        Parity Error Response disabled
        Data/Address stepping disabled
        SERR# driver disabled
        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= 0h
BAR - 1 [I/O]  = a000h length 128 enabled
BAR - 2 [I/O]  = a200h length 256 enabled
BAR - 3 [Mem]  = fa000000h 32bit length 256 enabled
BAR - 4 [I/O]  = a300h length 256 enabled
BAR - 5 [Mem]  = fa000100h 32bit length 256 enabled
CardBus CIS Pointer = ffffffffh
Subsystem Vendor ID = ddd1h
Subsystem ID        = 2h
Max Lat        = 0ns
Min Gnt        = 0ns
PCI Int Pin    = INT A
Interrupt line = 6
CPU Interrupt  = 6h
Device Dependent Registers:
0x040:  0000 0000 0000 0000   0000 0000 0000 0000
...
0x0f0:  0000 0000 0000 0000   0000 0000 0000 0000


Дампил конфиг спейс вот так (в этот раз почему-то флаг PCI_INIT_ALL не приводил к зависанию):
Код:
#include <stdio.h>
#include <hw/pci.h>
#include <string.h>

int main ()
{
int pci_server_handle = pci_attach(0);

printf("PCI server handle: %d\n", pci_server_handle);

void* PLXhandle;
uint32_t a_flags = PCI_SEARCH_VENDEV | PCI_INIT_ALL ;
uint32_t a_idx = 0;

struct pci_dev_info a_info;
memset( &a_info, 0, sizeof(a_info) );
a_info.DeviceId = 0x9050;
a_info.VendorId = 0x10b5;

PLXhandle = pci_attach_device( NULL, a_flags, a_idx, &a_info);
printf("PLX device handle: %d\n", PLXhandle );

printf("Bus number:0x%X,  DevFunc:0x%X\n", a_info.BusNumber, a_info.DevFunc );
printf("Base addr :");
int i = 0;
for( i = 0; i< 6; i++)printf("  0x%X", a_info.PciBaseAddress[i] ); printf("\n");

//dumb 256 bytes config space

unsigned char c[256];
pci_read_config8(a_info.BusNumber, a_info.DevFunc, 0x00, 256, c);
for( i = 0; i <256; i++)
{
if( (i%16) == 0) printf("\n");
printf("  %2X", c[i]);
}
printf("\n");

pci_detach( pci_server_handle );
}

Не знаю почему так. То ли из-за батарейки, то ли просто "удачный" день...


Для PCI адресов обертки PCI_* есть:
Код:
if (PCI_IS_IO(pci_info.CpuBaseAddress[i]) )
{
printf("IO space at %#llx for %#x bytes\n",
                PCI_IO_ADDR(pci_info.CpuBaseAddress[i]), pci_info.BaseAddressSize[i] );
}
else if (PCI_IS_MEM( pci_info.CpuBaseAddress[i] ) )
{
printf("Memory space at %#llx for %#x bytes\n",
                PCI_MEM_ADDR(pci_info.CpuBaseAddress[i]), pci_info.BaseAddressSize[i] );
}

А в чём разница? В обоих же случаях просто цело число, нет?
« Последнее редактирование: Мая 17, 2013, 05:28:11 pm от Белый пони » Записан
Страниц: [1] 2 3
  Печать  
 
Перейти в: