diff --git a/programs/system/pcidev/trunk/PCIDEV.ASM b/programs/system/pcidev/trunk/PCIDEV.ASM index 1a1fe80cf2..9035a13524 100644 --- a/programs/system/pcidev/trunk/PCIDEV.ASM +++ b/programs/system/pcidev/trunk/PCIDEV.ASM @@ -2,26 +2,61 @@ ; project name: PCI Device Enumeration ; target platform: KolibriOS ; compiler: flat assembler 1.68 -; version: 2.21 -; last update: December 2007 +; version: 2.3 +; last update: June 2011 ; maintained by: Jason Delozier (cordata51@hotmail.com) ; Sergey Kuzmin (kuzmin_serg@list.ru) ; Mihailov Ilia (ghost.nsk@gmail.com) +; Marat Zakiyanov ; Artem Jerdev (art_zh@yahoo.com) -; project site: http://www.coolthemes.narod.ru/pcidev.html +; Evgeny Grechnikov +; Veroniņa (Clever Mouse) +; Yogev Ezra +; old project site: http://www.coolthemes.narod.ru/pcidev.html +; new project site: http://board.kolibrios.org/viewtopic.php?f=42&t=73 ;*************************************************************** ;Summary: This program will attempt to scan the PCI Bus ; and display basic information about each device ; connected to the PCI Bus. ;*************************************************************** +;----------------------------------------------------------------------------- include '../../../macros.inc' -;include 'macros.inc' -MEOS_APP_START -CODE +include '../../../develop/libraries/box_lib/load_lib.mac' +;----------------------------------------------------------------------------- + use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd IM_END ; size of image + dd I_END ; memory for app + dd stacktop ; esp + dd 0 ; I_Param + dd path ; APPLICATION PACH +;----------------------------------------------------------------------------- +@use_library ; load_lib macro +;----------------------------------------------------------------------------- +START: + mcall 68,11 + mcall 66,1,1 +;----------------------------------------------------------------------------- +load_libraries l_libs_start,end_l_libs +;----------------------------------------------------------------------------- +;OpenDialog initialisation + push dword OpenDialog_data + call [OpenDialog_Init] + + mov edi,filename_area + mov esi,start_temp_file_name + call copy_file_name_path +;----------------------------------------------------------------------------- + mcall 68,12,4096 + mov [store_text_area_start],eax +;----------------------------------------------------------------------------- call draw_window - -still: mcall 10 ; wait here for event +still: + mcall 10 ; wait here for event dec eax ; redraw request ? jz red dec eax ; key in buffer ? @@ -29,7 +64,7 @@ still: mcall 10 ; wait here for event dec eax ; button in buffer ? jz button jmp still - +;----------------------------------------------------------------------------- red: ; redraw mcall 9, Proc_Info, -1 ; window redraw requested so get new window coordinates and size mov eax, [Proc_Info.box.left]; store the window coordinates into the Form Structure @@ -42,21 +77,112 @@ red: ; redraw mov [Form + 4] ,ax ; window height call draw_window ; go redraw window now jmp still - +;----------------------------------------------------------------------------- key: ; key mcall 2 ; just read it and ignore + cmp [extended_key],1 + je .extended_key + test al, al + jnz still + cmp ah, 0xE0 + jne @f + mov [extended_key],1 jmp still +@@: + cmp ah,129 ; Esc + je button.exit + cmp ah,159 + je call_OpenDialog + jmp still +.extended_key: + mov [extended_key],0 + cmp ah,129 ; Esc + je button.exit + cmp ah,159 + je call_OpenDialog + jmp still +;----------------------------------------------------------------------------- button: ; button mcall 17 ; get id + cmp ah,2 + je call_OpenDialog cmp ah, 1 ; button id = 1 ? jne still +.exit: mcall -1 ; close this program +;----------------------------------------------------------------------------- +call_OpenDialog: + mov [OpenDialog_data.type],1 ; Save + + push dword OpenDialog_data + call [OpenDialog_Start] + cmp [OpenDialog_data.status],2 ; OpenDialog does not start + je .save_file_default_path + + cmp [OpenDialog_data.status],1 + jne still + + call store_data + jmp still +;---------------------------------------- +.save_file_default_path: + mov edi,file_name + mov esi,file_default_path + call copy_file_name_path + call store_data + jmp still +;---------------------------------------- +copy_file_name_path: + xor eax,eax + cld +@@: + lodsb + stosb + test eax,eax + jnz @r + ret +;----------------------------------------------------------------------------- +prepare_text_area: + mov edi,[store_text_area_start] + + push edi + mov ecx,4096/4 ; I hope this will be enough for store of data + mov eax,dword ' ' + cld + rep stosd + pop edi + + mov esi,PCIWin + xor ecx,ecx +@@: + mov cl,[esi] + inc esi + rep movsb + mov al,0Ah ; CR - carriage return + stosb + cmp [esi],byte 0xFF + jne @r + + mov [store_text_area_end],edi + + xor edi,edi + ret +;----------------------------------------------------------------------------- draw_window: + call prepare_text_area + mov byte [total], 0 mcall 12, 1 ; start of draw ; DRAW WINDOW - mcall 0, dword [Form], dword [Form + 4], 0x13ffffff, 0x805080d0, title + mcall 0,dword [Form],dword [Form + 4],0x13ffffff,0x805080d0,title + mcall 8,<450,100>,<25,25>,2,0xC0C0C0 + shr ecx,16 + mov bx,cx + add ebx,13 shl 16+4 + mcall 4,,0x80000000,text_save_button + add bx,11 + mcall ,,,text_save_button.1 ; Insert horizontal bars in list area mov eax, 13 ; draw bar system function mov ebx, 18 ; set Xstart position of bar @@ -75,6 +201,7 @@ again: ;begin draw bar loop shl ecx, 16 ; set that values as Ystart add ecx, 10 ; Bar Height is always 10 pixels jmp again ; draw another bar +;----------------------------------------------------------------------------- nomo: ;done drawing bars here ; start PCI stuff call Get_PCI_Info ; get pci version and last bus, scan for and draw each pci device @@ -96,7 +223,8 @@ nomo: ;done drawing bars here mov ebx, 20 * 65536 + 25 ; x start, ystart of text mov ecx, 0x224466 ; color of text mov eax, 4 -@@: movzx esi, byte[edx] +@@: + movzx esi, byte[edx] inc edx mcall add ebx, 10 @@ -118,8 +246,17 @@ nomo: ;done drawing bars here @@: mcall 12, 2 ; end of draw ret - -;------------------------------------------------------------------ +;----------------------------------------------------------------------------- +store_data: + mov eax,[store_text_area_start] + mov [fileinfo.return],eax + mov ebx,[store_text_area_end] + sub ebx,eax + inc ebx + mov [fileinfo.size],ebx + mcall 70,fileinfo + ret +;----------------------------------------------------------------------------- ;* Gets the PCI Version and Last Bus Get_PCI_Info: mcall 62, 0 @@ -131,6 +268,7 @@ Get_PCI_Info: cmp al, 0xff ; 0xFF means no pci bus found jne Pci_Exists ; ret ; if no bus then leave +;----------------------------------------------------------------------------- Pci_Exists: mov byte [V_Bus], 0 ; reset varibles mov byte [V_Dev], 0 ; @@ -144,6 +282,7 @@ Start_Enum: cmp ax, 0 ; Vendor ID should not be 0 or 0xFFFF je nextDev ; check next device if nothing exists here + cmp ax, 0xffff ; je nextDev ; @@ -155,6 +294,7 @@ Start_Enum: mov ch, byte [V_Dev] ; Device # on bus mov cl, 0x08 ; Register to read (Get Revision) mcall 62 ; Read it + mov byte [PCI_Rev], al ; Save it mov cl, 0x0b ; Register to read (Get class) mcall 62 ; Read it @@ -166,15 +306,19 @@ Start_Enum: ; by Mario79 august 2006 mov cl, 0x09 ; Register to read (Get Interface) mcall 62 ; Read it + mov [PCI_Interface], al ; Save it ; ; by Ghost april 2007 mov cl, 0x3c ; Register to read (Get IRQ) -@@: mcall 62 ; Read it +@@: + mcall 62 ; Read it + mov [PCI_IRQ], al ; Save it ; by CleverMouse juny 2011 mov cl, 0x0e mcall 62 + push eax inc byte [total] ; one more device found call Print_New_Device ; print device info to screen @@ -182,8 +326,10 @@ Start_Enum: pop eax test al, al js nextDev + test byte [V_Dev], 7 jnz nextDev + or byte [V_Dev], 7 nextDev: inc byte [V_Dev] ; next device on this bus @@ -195,7 +341,7 @@ nextDev: cmp byte [V_Bus], al ; was it last bus jbe Start_Enum ; if not jump to keep searching ret - +;----------------------------------------------------------------------------- no_ummio_allowed: xor al,al mov [MMIO_allowed],al ; re-enter the subroutine @@ -210,13 +356,17 @@ Print_New_Device: mov ch, byte [V_Bus] mov cl, byte [V_Dev] mcall 62, 11 ; detect uMMIO + and ax,0x7fff inc ax ; -1 returned? jo no_ummio_allowed + inc ax ; -2 returned? jo no_ummio_here + inc ax ; -3 returned? jo no_ummio_here + mov esi, 0x990033 ; highlighted text color mov bh, byte [V_Bus] mov bl, byte [V_Dev] @@ -237,52 +387,81 @@ Print_New_Device: no_ummio_here: movzx ecx,word [PCI_Vendor] ; Pointer to number to be written mcall 47, 0x00040100 ; Write Vendor ID + + call store_4_digits + and edx, 0xFFFF ;***************************************** or edx, 54 * 65536 ; X start becomes 54 movzx ecx, word [PCI_Device] ; get Vendor ID mcall ; Draw Vendor ID to Window + + call store_4_digits + and edx, 0xFFFF ;***************************************** or edx, 98 * 65536 ; X start becomes 98 movzx ecx, byte [V_Bus] ; get bus number mcall ,0x00020100 ; draw bus number to screen + + call store_2_digits + and edx, 0xFFFF ;***************************************** or edx, 128 * 65536 ; X start becomes 128 movzx ecx, byte [V_Dev] ; get device number shr ecx, 3 ; device number is bits 3-7 mcall ; Draw device Number To Window + call store_2_digits + and edx, 0xFFFF ;***************************************** or edx, 155 * 65536 ; X start becomes 155 movzx ecx, byte [V_Dev] ; get Function number and ecx, 7 ; function is first 3 bits mcall ; Draw Function Number To Window + + call store_2_digits + and edx, 0xFFFF ;***************************************** or edx, 179 * 65536 ; X start becomes 179 movzx ecx, byte [PCI_Rev] ; get revision number mcall ; Draw Revision to screen + + call store_2_digits + and edx, 0xFFFF ;***************************************** or edx, 215*65536 ; X start becomes 215 movzx ecx, byte [PCI_Class] ; get PCI_Class mcall ; Draw Class to screen + + call store_2_digits + and edx, 0xFFFF ;***************************************** or edx, 250*65536 ; X start becomes 250 movzx ecx, byte [PCI_SubClass]; get sub class mcall ; Draw Sub Class to screen + + call store_2_digits + ; from Mario79 august 2006 and edx, 0xFFFF ;***************************************** or edx, 280 * 65536 ; X start becomes 280 movzx ecx, [PCI_Interface] ; get Interface mcall + + call store_2_digits + ; ; from Ghost april 2007 ;***************************************** movzx ecx, [PCI_IRQ] ; get Interface cmp cl, 0x0f ; IRQ between 0..15 ja @f + and edx, 0xFFFF or edx, 310 * 65536 ; X start becomes 310 mcall + + call store_2_digits + @@: -; ;Write Names movzx ebx, dx ; Set y position or ebx, 340 * 65536 ; set Xposition to 340 @@ -295,15 +474,21 @@ no_ummio_here: mov edx, VendorsTab mov cx, word[PCI_Vendor] -.fn: mov ax, [edx] +.fn: + mov ax, [edx] add edx, 6 test ax, ax jz .find + cmp ax, cx jne .fn -.find: mov edx, [edx - 4] + +.find: + mov edx, [edx - 4] mcall 4,, 0x80000000 ; lets print the vendor Name - + + mov [store_text_size],42 + call store_text ;------------------------------------------------------------------ ; Get description based on Class/Subclass ; @@ -313,26 +498,39 @@ no_ummio_here: and eax, 0xffffff xor edx, edx xor esi, esi -.fnc: inc esi +.fnc: + inc esi mov ecx, [Classes + esi * 8 - 8] cmp cx, 0xffff je .endfc + cmp cx, ax jne .fnc + test ecx, 0xff000000 jz @f + mov edx, [Classes + esi * 8 - 4] jmp .fnc -@@: cmp eax, ecx +@@: + cmp eax, ecx jne .fnc + xor edx, edx -.endfc: test edx, edx +.endfc: + test edx, edx jnz @f + mov edx, [Classes + esi * 8 - 4] @@: and ebx, 0x0000FFFF ; clear X position or ebx, 0x24E0000 ; set X position to 590 pixels mcall 4,, 0x80000000,, 32 ; draw the text + + mov [store_text_size],0 + call store_text + call store_CR + movzx edx, bx ; get y coordinate add edx, 0x0014000A ; add 10 to y coordinate and set x coordinate to 20 mov [gr_pos], edx @@ -349,15 +547,18 @@ Try_MMIO: or bx, 12 ; function 12 mov ecx, 4096 ; =1 page to map mcall 62 + mov [MMIO_Map], eax ; store MMIO lin.addr. mov ecx, 0x80990022 ; print color : red add bh, '0' cmp eax, -3 jne @f + mov [bar_um+3], bh mov ebx, [gr_pos] mov edx, bar_um mcall 4 + jmp mmio_next_bar @@: cmp eax, -4 @@ -366,6 +567,7 @@ Try_MMIO: mov ebx, [gr_pos] mov edx, bar_io mcall 4 + jmp mmio_next_bar @@: cmp bh, '6' ; expansion ROM ? @@ -374,7 +576,9 @@ Try_MMIO: mov ebx, [gr_pos] mov edx, bar_ram mcall 4 + jmp mmio_dump +;----------------------------------------------------------------------------- @@: mov ebx, [gr_pos] mov edx, bar_rom @@ -387,6 +591,7 @@ mmio_dump: add ebx, 10 mov [gr_pos], ebx mcall 4 + mov ecx, [MMIO_Map] ; release the tried page mcall 62,13 @@ -395,28 +600,106 @@ mmio_next_bar: inc bh cmp bh,7 je @f + mov [MMIO_BAR], bh add [gr_pos], 10 jmp Try_MMIO - +;----------------------------------------------------------------------------- @@: xor bh,bh mov [MMIO_BAR], bh ret +;----------------------------------------------------------------------------- +store_CR: + pusha + mov edi,[store_text_area_end] + mov [edi],word 0A20h ; CR (carriage return) + SPACE + add dword [store_text_area_end],2 + popa + ret +;----------------------------------------------------------------------------- +store_text: + pusha + inc dword [store_text_area_end] + mov esi,edx + mov edi,[store_text_area_end] + push edi + xor eax,eax + cld +@@: + lodsb + test eax,eax + jz @f + stosb + inc dword [store_text_area_end] + jmp @r +@@: + pop esi + mov eax,[store_text_size] + test eax,eax + jz @f + sub edi,esi + sub eax,edi + add [store_text_area_end],eax +@@: + popa + ret +;----------------------------------------------------------------------------- +store_4_digits: + pusha + mov ebx,ecx + mov ecx,4 + mov edi,[store_text_area_end] + call binary_to_hex_string + add [store_text_area_end],dword 6 + popa + ret +;----------------------------------------------------------------------------- +store_2_digits: + pusha + inc [store_text_area_end] + mov ebx,ecx + mov ecx,2 + mov edi,[store_text_area_end] + call binary_to_hex_string + add [store_text_area_end],dword 4 + popa + ret +;----------------------------------------------------------------------------- +; ebx - value +; ecx - digits +; edi - output string +binary_to_hex_string: + add edi,ecx + dec edi + std +.1: + mov al,bl + and al,0xf + shr ebx,4 + cmp al,9 + jbe @f - + add al,0x27 +@@: + add al,0x30 + stosb + dec ecx + jnz .1 + cld + ret +;----------------------------------------------------------------------------- include 'vendors.inc' -;------------------------------------------------------------------ +;----------------------------------------------------------------------------- ; DATA AREA DATA - Form: dw 800 ; window width (no more, special for 800x600) dw 100 ; window x start dw 620 ; window height dw 20 ; window y start -title db 'PCI Device Enumerator v 2.21 by J.Delozier, S.Kuzmin, V.Hanla, M.Zakiyanov, A.Jerdev', 0 +title db 'PCI Device Enumerator v 2.3 by J.Delozier, S.Kuzmin, V.Hanla, M.Zakiyanov, A.Jerdev, E.Grechnikov, V.Clever Mouse, Y.Ezra', 0 PCIWin mls \ ' Don`t forget to enable PCI Access to Applications in Setup Menu.',\ @@ -427,17 +710,97 @@ PCIWin mls \ '',\ 'VenID DevID Bus# Dev# Fnc Rev Class Subclass/ IRQ Company Description',\ ' Interface',\ - '----- ----- ---- ---- --- --- ----- --------- --- ------------------------------------------ ----------------' + '----- ----- ---- ---- --- --- ----- --------- --- ------------------------------------------ --------------------------------' bar_ram db 'BARx: MMIO block', 0 bar_io db 'BARx: IO ports',0 bar_um db 'BARx: unmapped',0 bar_rom db 'BAR6: Expansion ROM', 0 -;------------------------------------------------------------------ -; UNINITIALIZED DATA AREA -UDATA +text_save_button: + db 'Save PCI list',0 +.1: db '(Press S key)',0 +;--------------------------------------------------------------------- +system_dir_ProcLib db '/sys/lib/proc_lib.obj',0 +err_message_found_lib2 db 'proc_lib.obj - Not found!',0 + +err_message_import2 db 'proc_lib.obj - Wrong import!',0 + +head_f_i: +head_f_l db 'error',0 +;--------------------------------------------------------------------- +l_libs_start: + +library02 l_libs system_dir_ProcLib+9, path, library_path, system_dir_ProcLib, \ +err_message_found_lib2, head_f_l, ProcLib_import, err_message_import2, head_f_i + +end_l_libs: +;--------------------------------------------------------------------- +align 4 +ProcLib_import: +OpenDialog_Init dd aOpenDialog_Init +OpenDialog_Start dd aOpenDialog_Start +;OpenDialog__Version dd aOpenDialog_Version + dd 0 + dd 0 +aOpenDialog_Init db 'OpenDialog_init',0 +aOpenDialog_Start db 'OpenDialog_start',0 +;aOpenDialog_Version db 'Version_OpenDialog',0 +;--------------------------------------------------------------------- +align 4 +OpenDialog_data: +.type dd 0 +.procinfo dd Proc_Info ;+4 +.com_area_name dd communication_area_name ;+8 +.com_area dd 0 ;+12 +.opendir_pach dd temp_dir_pach ;+16 +.dir_default_pach dd communication_area_default_pach ;+20 +.start_path dd open_dialog_path ;+24 +.draw_window dd draw_window ;+28 +.status dd 0 ;+32 +.openfile_pach dd file_name ;+36 +.filename_area dd filename_area ;+40 +.filter_area dd Filter +.x: +.x_size dw 420 ;+48 ; Window X size +.x_start dw 10 ;+50 ; Window X position +.y: +.y_size dw 320 ;+52 ; Window y size +.y_start dw 10 ;+54 ; Window Y position + +communication_area_name: + db 'FFFFFFFF_open_dialog',0 +open_dialog_path: + db '/sys/File Managers/opendial',0 +communication_area_default_pach: + db '/sys',0 +Filter: +dd Filter.end - Filter.1 +.1: +db 'TXT',0 +db 'LOG',0 +.end: +dd 0 + +file_default_path: + db '/sys/' +start_temp_file_name: + db 'pcidev.txt',0 +;--------------------------------------------------------------------- +align 4 +fileinfo: +.subfunction dd 2 +.Offset dd 0 +.Offset_1 dd 0 +.size dd 4096 +.return dd 0 + db 0 +.name: dd file_name +;----------------------------------------------------------------------------- + +; UNINITIALIZED DATA AREA +IM_END: total db ? V_Bus db ? V_Dev db ? @@ -463,6 +826,34 @@ MMIO_Map rd 8 gr_pos dd ? -Proc_Info process_information -MEOS_APP_END +store_text_area_start dd ? +store_text_area_end dd ? +store_text_size dd ? +extended_key rb 1 +;--------------------------------------------------------------------- +library_path: + rb 4096 +;--------------------------------------------------------------------- +path: + rb 4096 +;--------------------------------------------------------------------- +temp_dir_pach: + rb 4096 +;--------------------------------------------------------------------- +file_name: + rb 4096 +;--------------------------------------------------------------------- +file_name_1: + rb 4096 +;--------------------------------------------------------------------- +filename_area: + rb 256 +;--------------------------------------------------------------------- + rb 4096 +stacktop: +;--------------------------------------------------------------------- +Proc_Info process_information +;--------------------------------------------------------------------- +I_END: +;----------------------------------------------------------------------------- diff --git a/programs/system/pcidev/trunk/build.bat b/programs/system/pcidev/trunk/build.bat index 267e63ea18..6a31818790 100644 --- a/programs/system/pcidev/trunk/build.bat +++ b/programs/system/pcidev/trunk/build.bat @@ -1,2 +1,3 @@ @fasm pcidev.asm pcidev +@kpack pcidev @pause \ No newline at end of file diff --git a/programs/system/pcidev/trunk/history.txt b/programs/system/pcidev/trunk/history.txt index bdc0e7f7a3..dc70e33ed2 100644 --- a/programs/system/pcidev/trunk/history.txt +++ b/programs/system/pcidev/trunk/history.txt @@ -9,11 +9,42 @@ to-do: Full device detection (like "ATI Radeon 9200") will increase app size a lot and probably it is function of particular drivers ----------------------------------------------------------------- -2.21: PCIDEV 03/06/2011 -Author: CleverMouse -Features: don't scan for other functions on single-function devices ----------------------------------------------------------------- +;----------------------------------------------------------------------------- +2.3: PCIDEV 26/06/2011 +Author: Marat Zakiyanov aka Mario79 +Features: + added + * Save PCI devices list to disk + * Using OpenDialog for select of path + +;------------------------------------ +Author: Veronica aka Clever Mouse +Features: + fixed + * Don't scan for other functions on single-function devices + * Some little bugs + +;------------------------------------ +Author: Artem Jerdev aka art_zh +Features: + fixed + * pcidev post-enumeration bug fixed + optimized + * pci vendors database splitted to reduce PCIDEV code downto 10kB. + +;------------------------------------ +Author: Yogev Ezra +Features: + added + * HDA controller recognition and 17F3 RDC Semiconductor vendor + +;------------------------------------ +Author: Evgeny Grechnikov aka Diamond +Features: + fixed + * Some little bugs + +;----------------------------------------------------------------------------- 2.2: PCIDEV 03/01/2010 Author: Artem Jerdev Features: