vova65 Читай стандарт там всё написано. А так давай по порядку что именно ты не понимаешь? Что такое электричество рассказывать?
В регистр 0xCF8 записывается адрес устройства. Из 0хСFC читаешь данные. Данные читаются и пишутся по 32 бита за раз. Поэтому младшие 2 бита в описании порта равны 0. Поэтому 1 байт из конфигурационного пространства читается из 0 индекса. mov eax, адрес ; тут адрес устройства add eax, 0 ; прибавляем индекс or eax,80000000h ; устанавливаем 31 бит mov dx,0CF8h out dx,eax ; отправляем в порт полный адрес из которого будем читать. mov dx,0CFCh in eax,dx ; Читаем данные, один регистр ; так как в конфигурационном пространстве байты считаются от 0. ; То выделяем 1 байт and eax, 000000FF00h; shr eax, 8
что-то я туплю и не могу вехать в какие биты порта 0хCF8 записывать регистр 00D8h.. суда по таблице.. +---+---------+-------+-----------+--------+----------------+-+-+ |31 |30 24 |23 16|15 11|10 8|7 2|1|0| +---+---------+-------+-----------+--------+----------------+-+-+ | с | резерв |шина |устройство|функция|Индекс регистра|0|0| +---+---------+-------+-----------+--------+----------------+-+-+ то регистр должен помещаться в биты 2-7... а индекс регистра состоит из 8 бит.. как его впихнуть в пять бит???? или я тупой и не так все понял....
vova65 Это потому что ты путаешь регистр и байт в конфигурационном пространстве. Четыре байта это один регистр.
приведите пожалуйста пример как пример как изменить значение регистра 00D8h через порты I/О... в примере используйте любой номер шины, устройства и функции того девайса и любое значение для записи в регистр 00D8h....
Phantom_84 Вовсе нет... просто после прочтения нескольких книг по работе PCI я немного не вехал... а спросить неукого...
как прочитать конфигурационное пространство PCI я понял... а от как работать с регистрами PCI устройства нет Подскажите как это делается.. или где почитать (так чтоб и чайник понял)
Подскажите пожалуйста!!! почему при запуске scan_bus неотправляется ARP пакет???? tx_buff dw 0FFFFh, 0FFFFh, 0FFFFh, 940Ch , 6DA4h, 7283h , 0806h dw 0001h , 0800h , 0604h , 0001h , 940Ch , 6DA4h, 7283h dw 0C0A8h, 0203h , 0000h , 0000h , 0000h, 0C0A8h, 026Eh Код (Text): scan_bus: mov [ds:pci_bus],0B801h mov ebx,2 xor ecx,ecx mov edx,04h mov esi,2 call pci_read_reg ;меняем значенние регистра or al, (1 shl 2) or (1 shl 0) and al, not (1 shl 1) ;Записываем в конфигурацыоное пространство mov edx,04h call pci_write_reg ;Сброс сетивого адаптера mov edx,[ds:pci_bus] add edx,37h mov al,1 shl 4 out dx,al mov cx,1000 ; ждать уже не для сброса @@: in al,dx test al, 1 shl 4 jz @f ; RST остается 1 во время сброса dec cx jns @b mov eax,ecx @@: ; включение Tx ;mov al,00001100b mov al,00000100b mov edx,[ds:pci_bus] add edx, 37h out dx, al ;Отправка пакета lea eax,[tx_buff] mov edx,[ds:pci_bus] add edx,20h out dx,eax ; установите размер и ранний порог ;pop eax ; pick up the size mov eax,28 add eax, (2 * 6 + 2) cmp eax, 60h jnc @f mov eax, 60h @@: or eax, (8 shl 16) or (1 shl 13) add edx,10h - 20h out dx, eax ret
Подскажите почему при запуске pciS не происходят приревания от rtl8139??? Код (Text): pciS: mov ebx,2 xor ecx,ecx mov edx,3Ch mov esi,2 call pci_read_reg mov al,35h ; mov edx,3Ch call pci_write_reg ;32 k Rxbuffer, неограниченного пакета dma, никакого обертывания, никакого rx порога ; примите широковещательные пакеты, примите физические пакеты соответствия mov ax,0000E7BEh mov edx,[ds:pci_bus] add edx,44h out dx, ax ; включение Rx/Tx mov al,00001100b mov edx,[ds:pci_bus] add edx, 37h out dx, al ; включите все прерывания mov edx,[ds:pci_bus] add edx,3Ch ;mov ax,0FFFFh mov ax,0000h out dx,ax ret Часть таблицы irq ....... dw exit, 08h,1000111000000000b,0;31 dw timer, 08h,1000111000000000b,0;32 IRQ(0) dw exit4, 08h,1000111000000000b,0;33 IRQ(1) dw exit, 08h,1000111000000000b,0;34 IRQ(2) dw exit1, 08h,1000111000000000b,0;35 IRQ(3) dw exit, 08h,1000111000000000b,0;36 IRQ(4) ....... функции pci_read_reg и pci_write_reg работают и значение 35h записывается в регистр 3Ch конфигурационного пространства PCI...
Это поле информационное. Оно не определяет номер прерывания. BIOS для нашего удобства записывает нужный вектор. Но не более того.