Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Ovladače / DEVICE / Struktura všeobecného zařízení DEV

Zdrojový kód: INCLUDE\DRIVERS\DEVICE.INC


Struktura všeobecného zařízení DEV

Od struktury popisovače všeobecného zařízení DEV jsou odvozovány popisovače všech ostatních zařízení.


; ------------- General device descriptor

struc		DEV

		resb	RBNODE_size	; 0: device address list
					;    (sorted by address)

DEV_Hash:	resb	HASHE_size	; 18h: hash list of this class

DEV_DevList:	resb	TREE_size	; 20h: device hierarchy list

DEV_Mutex:	resb	MUT_size	; 30h: device mutex lock

DEV_Lock:	resb	SPINLOCK_size	; 4Ch: device spin-lock

DEV_Resource:	resb	LIST_size	; 50h: device resource list DEVRES

DEV_Ref:	resd	1		; 58h: usage reference counter

DEV_IntList:	resd	1		; 5Ch: pointer to device interface list

DEV_ClassFlags:				;    class and flags as DWORD
DEV_Flags:	resb	1		; 60h: device flags (see below)
DEV_InxSubW:				;    index and sub-class as WORD
DEV_Index:	resb	1		; 61h: device index
DEV_SubClsW:				;    sub-class and class as WORD
DEV_SubClass:	resb	1		; 62h: device sub-class
DEV_Class:	resb	1		; 63h: device class (see below)

DEV_Version:				;    driver version (as DWORD)
DEV_Build:	resw	1		; 64h: build number of driver version
DEV_VerMin:	resb	1		; 66h: minor driver version
DEV_VerMaj:	resb	1		; 67h: major driver version

DEV_Name:	resb	TEXT_size	; 68h: device system name (empty=none)
DEV_Vendor:	resb	TEXT_size	; 6Ch: vendor name
DEV_Short:	resb	TEXT_size	; 70h: device short name
DEV_Full:	resd	1		; 74h: pointer to multi-language string
					;      array of full device name

DEV_Init:	resd	1		; 78h: initialize device
					;	INPUT:	EBX=device descriptor
					;	OUTPUT:	CY=error
					;	Use DevInit function (no lock)

DEV_Deinit:	resd	1		; 7Ch: deinitialize device
					;	INPUT:	EBX=device descriptor
					;	OUTPUT:	CY=error
					;	Use DevDeinit funct. (no lock)

endstruc				; size 80h = 128 bytes

; Device hash: Class AND mask
DEVHASH_SIZE	EQU	256		; size of device hash (hardcoded)
DEVHASH_MASK	EQU	DEVHASH_SIZE-1	; mask of device hash

; ------------- Supported device interface list

; Each entry is 4-byte DWORD (it may be text identifier or random number) which
; identifies supported interfaces. List is terminated with DEV_NUL_ID.

%define DEV_NUL_ID 0			; stop mark of device interface list
%define DEV_GEN_ID "DEV1"		; general device interface identifier

; ------------- Driver flags

DEV_STATIC	EQU	B0		; static descriptor, don't delete it
DEV_INIT_BIT	EQU	1		; bit of DEV_INIT flag
DEV_INIT	EQU	(1 << DEV_INIT_BIT) ; device has been initialized
DEV_ROOT	EQU	B2		; root device, system is its parent

Na začátku struktury se nachází položka stromového seznamu zařízení RBNODE. Seznam je tříděn podle adresy zařízení v paměti a slouží k rychlému vyhledání zařízení podle adresy, která je přijata od uživatelského programu při přístupu k zařízení.

DEV_Hash je hashovaný seznam zařízení s klíčem odvozeným z třídy zařízení. Seznam slouží k rychlému vyhledání zařízení, je-li adresováno pomocí třídy a podtřídy. Konstanta DEVHASH_SIZE představuje počet položek klíče (=256) a DEVHASH_MASK je maska hodnoty klíče (=0FFh).

DEV_DevList je hierarchický seznam zařízení (typu stromový seznam). Zařízení jsou organizována podle vzájemné funkční závislosti.

DEV_Mutex je pomalý zámek k uzamykání zařízení na dlouhé operace (vyžadující čekání). Pokud se uzamyká i rychlý zámek, musí se rychlý zámek uzamknout až po pomalém zámku.

DEV_Lock je rychlý zámek k uzamykání zařízení při přístupu ke sdíleným prostředkům. Pokud se současně uzamyká i pomalý zámek, musí se rychlý zámek uzamknout až po pomalém zámku.

DEV_Resource je seznam systémových prostředků DEVRES používaných zažízením.

DEV_Ref je referenční čítač použití zařízení. Zařízení lze odstranit pouze v případě, že není používáno - tj. čítač je nastaven na nulu.

DEV_IntList je ukazatel na seznam podporovaných rozhraní (interface) zařízení. Seznam rozhraní je posloupnost čísel velikosti DWORD (4 bajty). Každé číslo představuje identifikátor rozhraní - číslo 4 bajty nebo text o délce 4 znaky. Seznam je ukončen číslem 0 (konstanta DEV_NUL_ID). Např. zařízení DMA podporuje rozhraní DEV1 a DMA1.

DEV_Flags jsou příznaky zařízení. Příznak DEV_STATIC označuje statický popisovač zařízení, který při rušení zařízení nesmí být zrušen (nebyl alokován jako paměťový blok). Příznak DEV_INIT indikuje, že zařízení bylo inicializováno (byla zavolána funkce DEV_Init). Příznak DEV_ROOT označuje kořenové zařízení, jehož rodičem je systém (není závislé na jiném zařízení).

DEV_Index je index zařízení jedné třídy a podtřídy (např. číslo pevného disku). DEV_SubClass je podtřída zařízení. DEV_Class je třída zařízení.

DEV_VerMaj, DEV_VerMin a DEV_Build je číslo verze, podverze a číslo překladu ovladače zařízení.

DEV_Name je ukazatel na systémové jméno zařízení (formát TEXT) - používá se k identifikaci zařízení v systému. DEV_Vendor je identifikační jméno poskytovatele (výrobce) zařízení. DEV_Short je krátké jméno zařízení - zobrazuje se v rychlých přehledech. DEV_Full je ukazatel na vícejazykové pole dlouhého jména zařízení - zobrazuje se uživateli.

DEV_Init je adresa funkce sloužící k inicializaci zařízení. Na vstupu obsahuje registr EBX ukazatel na popisovač zařízení DEV. Pokud nastala chyba inicializace zařízení, funkce navrátí příznak chyby CY. Namísto přímého volání funkce je doporučeno použít funkci DevInit, která zajistí provedení inicializace pouze v případě, že inicializace nebyla dosud provedena.

DEV_Deinit je adresa funkce sloužící k deinicializaci zařízení. Na vstupu obsahuje registr EBX ukazatel na popisovač zařízení DEV. Pokud nastala chyba deinicializace zařízení, funkce navrátí příznak chyby CY. Namísto přímého volání funkce je doporučeno použít funkci DevDeinit, která zajistí provedení deinicializace pouze v případě, že deinicializace nebyla dosud provedena.


; ------------- Device resource descriptor

struc		DEVRES

		resb	LIST_size	; 0: resource list
DEVRES_Start:	resd	1		; 8: start of resource
DEVRES_End:	resd	1		; 0Ch: end of resource
DEVRES_TypeFlagDW:			;   type and flags as DWORD
DEVRES_Type:	resb	1		; 10h: type of resource (see below)
DEVRES_Flags:	resb	1		; 11h: flags of resource (see below)
		resw	1		;   ...padding		
DEVRES_Name:	resb	TEXT_size	; 14h: name of resource

endstruc				; size 18h (=24) bytes

; ------------- Device resource type

DEVRES_IRQ	EQU	0		; resource type - IRQ (interrupt)
DEVRES_DMA	EQU	1		; resource type - DMA
DEVRES_PORT	EQU	2		; resource type - port
DEVRES_MEM	EQU	3		; resource type - memory

; ------------- Device resource flags

DEVRES_STATIC	EQU	B0		; static descriptor, don't delete it

; ------------- Macro - Initialized resource descriptor
; %1 = next link, %2 = previous link, %3 = start of resource,
; %4 = end of resource, %5 = resource type, %6 = resource flags
; %7 = pointer to name of resource CTEXTDATA

%macro		DEVRESOURCE 7
        	
		LINKEDLIST %1,%2	; resource list
		dd	%3		; start of resource
		dd	%4		; end of resource
		db	%5		; resource type
		db	%6		; resource flags
		dw	0		;  ...padding
		TEXTSTR	%7		; name of resource
%endmacro

Popisovač zařízení používá popisovač DEVRES k popisu jednoho systémového zdroje. Systémovým zdrojem může být: signál přerušení IRQ, signál přímého přístupu k paměti DMA, port nebo oblast paměti. Popisovače systémových zdrojů jsou připojeny k popisovači zařízení pomocí dvojitě spojeného seznamu LIST. Položka DEVRES_Start udává začátek systémového zdroje. Může jím být počáteční číslo signálu přerušení IRQ, počáteční číslo přímého přístupu k paměti DMA, počáteční adresa portu nebo počáteční adresa v paměti. Položka DEVRES_End označuje konec systémového zdroje. DEVRES_Type je typ zdroje (přerušení, DMA, port, paměť). DEVRES_Flags jsou příznaky - používá se pouze příznak DEVRES_STATIC udávající, že popisovač je statický a nesmí být při rušení dealokován, protože se nejedná o paměťový blok. DEVRES_Name je jméno zdroje - jedná se o textovou proměnnou typu TEXT.

Makro DEVRESOURCE je inicializovaný popisovač systémového zdroje. První a druhý parametr jsou ukazatele na následující a předešlý popisovač. Třetím parametrem je počátek systémového zdroje, čtvrtým konec zdroje, pátým typ zdroje, šestým příznaky a sedmým jméno (ukazatel na CTEXTDATA).


Obsah / Ovladače / DEVICE / Struktura všeobecného zařízení DEV