Лабораториялық жұмыс №12.

Тақырып: USB интерфейсі арқылы құрылғылармен жұмыс. PCI құрылғыларының анықтамасы.

Жұмыс мақсаты: бағдарламалық деңгейде құрылғылары анықтау студенттерді үйрету .

Теориялық мәліметтер:

Алдымен, PCI (PCI configuration space) конфигурация кеңістігінің берік ұғым енгіземіз.

Әрбір PCI құрылғыда регистрлер массиві деп аталатын болады, олар арқылы әртүрлі параметрлер сұраалады (құрылғыға арналған үзулер нөмірлері және т.б.). PCI құрылғылармен қатынас негізінде 2 арқылы 32-битті порт 0CF8h және 0CFCh болады. Олар арқылы бұл берілген құрылғының конфигурация кеңістігін оқу және жазуға болады.

Бұл процес келесі үлгіде болады:

0CF8h регистрінде шинада құрылғы адресі сұралады, кейін 0CFCh берілгендер оқылады (жазылады).

Шинадағы (формат 0CF8h) құрылғы координаталары былай көрінеді:

31-ші бит регистрде ақпараттың анықтығын көрсетеді, онда 1 болу тиісті.

Bus Number - PCI шинасының нөмірі. (олар бірнеше болуы мүмкін, мысалы AGP порты PCI слоттары қосылған шинаны қолданады).

Device Number - шинадағы құрылғы нөмірі.

Function Number - құрылғы функциясының нөмірі (осында көбінесе терминологиямен анықталады, функция астында құрылғы түсіндіріледі, сол уақытта (device) құрылғы астында шина абоненті түсіндіріледі, яғни , егер мысалы, картада қандай болмасын 2 құрылғы бірлескен, онда ол екі функциялармен бір құрылғы ретінде қабылданады, және де тіпті сондай « бірфункционалды» құрылғы сияқты видеокарта көп функцияларға ие бола алады). Бұл құрылғыларға бөлу және функцияның көп жағдайда таза логикалық, « негізгі» құрылғы 0 функцияларға сәйкес келеді.

Register Number - конфигурафиялы кеңістік регистр нөмірі, оны оқу (жазу) керек. (Жалпы 0 бит дейін барлық өрістер қолданылады, бірақ сондықтан айырбас екі есе сөздермен шығарылады (4 байт), онда кіші 2 бит әрқашан нөлдер болып шығады).

Бізге қазір құрылғы өндірушісінің типін қалай білуге болатыны қызықтырады. Конфигурациялы кеңістік картасына қараймыз:

Сары түспен көрсетілген өрістер барлық құрылғыларда болуға тиісті, нақ осында бұл не қылған құрылғының және кім оның өндірушісі туралы ақпарат сақталады. Бізге 2 өріс қызықтырады:

VendorID – өндіруші коды

DeviceID – құрылғы коды

Өте маңызды сұраққа жауап беру уақыт келді «Ал егер конфигурация кеңістігінен бірдене оқысақ, нақты пайда болмаған құрылғы туралы?»

Жауап: бұл мақсатқа арналған 0FFFFFFFFh мағынасы арнайы кейінге сақталған оқылады (бірақ егер бұны win астында істесе, онда ОЖ оған кез келгенді қоя салады).

Осының барлығынан мынадай қорытынды шығаруға болады: циклда керек құрылғының барлық табу үшін (Bus өзгертіп нөлден 255дейін, dev 0-ден 31 дейін, func нөлден 7 дейін) конфигуарциялы кеңістігін оқу керек, егер 0FFFFFFFFh мағынасы оқылса, онда құрылғы жоқ, егер басқа бірдене оқылса - құрылғы бар.

Міне, PCI конфигурациялы кеңістікте оқылатын процедура мысалы.

Функция нөмірі - BL, құрылғы нөмірі - BH, функция - CL, және қызметтен алу (регистр нөмірі) - CH сұралады.

    ;BL - bus, BH - device, CL - function, CH - register

    RD_PCI PROC NEAR

     mov dx,0CF8h

     xor eax,eax

     mov al,bl

     or ah,80h ;Бит анықтығы 1

     shl eax,16

     mov ah,bh

     shl ah,3

     or ah,cl

     mov al,ch

     and al,0FCh ;2 кіші битті лақтыру

     out dx,eax

     mov dx,0CFCh

     in eax,dx

     ret

    RD_PCI ENDP

; Ал міне қалай барлық құрылғылардың табуына арналған код көріне алады:

    mov bl,0;bus

    mov bh,0;device

    mov cl,0;function

    mov ch,0;register

    label1:

    call rd_pci                    ;Регистрді оқимыз

    cmp eax,0ffffffffh       ;Егер барлық бірліктер оқылса – құрылғы жоқ

    jnz device_found        ; Егер барлық бірліктер оқылмас – «онда бірдене бар»

    label2:

    ;inc cl            ;Егер бұл блокті өзертсе онда тек қана құрылғылар емес,

    ;cmp cl,8                      ; олардың барлық  функциялары да шығарылады

    ;jnz label1

    ;mov cl,0

    inc bh                                          ;Құрылғы циклі

    cmp bh,32

    jnz label1

    mov bh,0

    inc bl                                           ;PCI шинасының циклі

    cmp bl,255

    jz exit

    jmp label1

    device_found:

; оқылған мағыналардың символдық түріне өзгерту және экранға шығару

; оқылған мағыналардың символдық түріне өзгерту және экранға шығару

Тапсырма:

1. PCI шина нөмірін анықтау.

2. Шинада құрылғы нөмірін анықтау.

3. Құрылғыда функция нөмірін анықтау .

4. PCI шинасында құрылғы өндіруші кодын анықтау.

5. PCI шина құрылғы кодын анықтау.

Әдебитет: 10, бет. 49-68; 17, бет. 35- 39

Бақылау сұрақтар

1. «PCI конфигуарциялы кеңістік» ұғымын түсіндіріңіздер.

2. Register Number конфигуарциялы кеңістік не орындайды?

3. Конфигуарциялы кеңістік егер бірдене оқыса нақты пайда болмаған құрылғы, онда не болады?