Вопрос по pci

Devices programming
  • Привет!
    Голову ты бы себе не морочил с такими изысканиями... такие вещи надо изучить, а потом ваять, а не тыкать пальцем в небо. ТОлько в MeOS несколько кусков исходника посвящены PCI..., я уже как то говорил про кусок отвечающий за Ethernet как пример...
    Ладно, держи готовую прогу COM вида под ДОС, которая выуживает PCI устройства. Все проверено, выверено и сравнено с... массой других.... по ReadPCI. Тебе осталось только проглотить :)


    org 0x100

    call cls
    xor bx, bx ; BH = bus, BL = device
    xor cx, cx ; CH = function, CL = register
    @nextReadPCI:
    call ReadPCI
    cmp eax, 0xFFFFFFFF
    je @nextElementPCI
    call device_found
    @nextElementPCI:
    inc ch ; б«Ґ¤гой п дг­ЄжЁп нв®Ј® гбва®©бвў  PCI
    cmp ch, 8
    jne @nextReadPCI
    xor ch, ch

    inc bl ; б«Ґ¤го饥 гбва®©бвў® PCI ­  н⮬ б®ЄҐвҐ
    cmp bl, 32
    jne @nextReadPCI
    xor bl, bl

    inc bh ; б«Ґ¤гойЁ© б®ЄҐв PCI
    cmp bh, 255 ;
    jne @nextReadPCI

    call @cls
    int 0x20



    device_found:
    pusha
    mov si, PCIbusTxt
    call prtString
    popa
    pusha
    mov al, bh
    call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
    mov si, PCIdevTxt
    call prtString
    popa
    pusha
    mov al, bl
    call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
    mov si, PCIfunTxt
    call prtString
    popa
    pusha
    mov al, ch
    call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
    mov si, PCIregTxt
    call prtString
    popa
    pusha
    mov al, cl
    call ShowHexByte ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
    inc [ScreenString]
    mov [ScreenColumn], 0
    mov si, PCIvendorTxt
    call prtString
    popa
    pusha
    call ShowHexWord ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
    inc [ScreenString]
    mov [ScreenColumn], 0
    mov si, PCIdeviceTxt
    call prtString
    popa
    pusha
    shr eax, 16
    call ShowHexWord ; ЇаҐ®Ўа §гҐ¬ ў бва®Єг Ё ўлўҐ¤Ґ¬ ­  ¤ЁбЇ«Ґ©
    mov [ScreenColumn], 0
    add [ScreenString], 2
    cmp [ScreenString], 24
    jc @nnn
    call @cls
    @nnn: popa
    RET



    ReadPCI:
    ; BH - bus, BL - device, CH - function, CL - register
    xor eax, eax
    mov al, bh
    or ah, 0x80
    shl eax, 16
    mov ah, bl
    shl ah, 3
    or ah, ch
    mov al, cl
    and al, 0xFC
    mov dx, 0x0CF8
    out dx, eax
    mov dl, 0xFC
    in eax, dx
    RET


    PCIbusTxt DB "PCI bus: ", 0
    PCIdevTxt DB " device: ", 0
    PCIfunTxt DB " function: ", 0
    PCIregTxt DB " register: ", 0
    PCIvendorTxt DB "Vendor code: ", 0
    PCIdeviceTxt DB "Device code: ", 0


    INCLUDE 'CVSTRING.INC'
  • А вообще сейчас в ступени 1 АТОМ ОС я применяю следующее...
    Более прозрачно, понятно и оптимально, с "моей колокольни".

    PCI_CFG_ADDR = 0x0CF8

    WriteIdxPCI:
    ; BH - bus, BL - dev, CH - func, CL - register
    push eax
    xor eax, eax
    mov al, bh
    or ah, 0x80
    shl eax, 16
    mov ah, bl
    shl ah, 3
    or ah, ch
    mov al, cl
    and al, 0xFC
    mov dx, PCI_CFG_ADDR
    out dx, eax
    mov dl, 0xFC
    or dl, cl
    pop eax
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    SetCfgSpaceDword:
    push dx
    call WriteIdxPCI
    out dx, eax ;write dword
    pop dx
    RET
    SetCfgSpaceWord:
    push dx
    call WriteIdxPCI
    out dx, ax ;write word
    pop dx
    RET
    SetCfgSpaceByte:
    push dx
    call WriteIdxPCI
    or dl, cl
    out dx, al ;write byte
    pop dx
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    GetCfgSpaceDword:
    push dx
    call WriteIdxPCI
    in eax, dx ;read dword
    pop dx
    RET
    GetCfgSpaceWord:
    push dx
    call WriteIdxPCI
    in ax, dx ;read word
    pop dx
    RET
    GetCfgSpaceByte:
    push dx
    call WriteIdxPCI
    in al, dx ;read byte
    pop dx
    RET
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    Успехов PCI`ях! ;)
  • очень странно: я пробовал даже тупо копировать твой код: НЕ РАБОТАЕТ :shock:
    вероятно у меня тоже все было написано правильно.... есть мысли? :cry:
  • Мыслей вогон и маленькая тележка. Идей тоже.... Тебе какую?
    Программирование любит АБСОЛЮТНУЮ конкретику и точность, а в твоем вопросе сего нет.
    Я тебе дал проверенное и опробованное и .... и конкретно, между прочим. Т.к. указал главное - среду, где живёт код. А ведь сказал ДОС. И это незря. Именно ДОС а не какое то там виртуальное и ли еще какое посредниковое детище. ДОС максимально близок к железу и реалиям жизни аппарата! Он без всяких проволочек и принципов(защита и пр.) позволяет пощупать и попробовать и отладить и выловить, особенно, подчеркиваю, ОСОБЕННО при работе с портами! Т.е. такие темы и темы реальных драйверов, я, как впрочем и многие другие реально мыслящие кодеры железа строгают там...
    Предполагаю, что у тебя рубит "среда". Наверное в PM юзаешь, а политика безопасности и доступа к портам... того... посылает тебя. Или нечно вроде этого. Ищи, думай. Почву я тебе для этого дал, считаю. Успехов!
  • Who is online

    Users browsing this forum: No registered users and 1 guest