forked from KolibriOS/kolibrios
VHDL code generator for PCI BIOS extension ROMs
git-svn-id: svn://kolibrios.org@6442 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
227eb8887f
commit
b718363009
108
kernel/branches/Kolibri-A/trunk/bootloader/bios-bev/PCIROM.ASM
Normal file
108
kernel/branches/Kolibri-A/trunk/bootloader/bios-bev/PCIROM.ASM
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
include 'cfg_bios.inc'
|
||||||
|
use16
|
||||||
|
org 0
|
||||||
|
|
||||||
|
rom_header:
|
||||||
|
; PnP Option ROM header
|
||||||
|
rom_signature dw 0xAA55 ; +0 : magic
|
||||||
|
rom_length db 1 ; +2 : number of 512byte blocks
|
||||||
|
rom_entry:
|
||||||
|
jmp init_entry ; +3 : initialization entry point
|
||||||
|
; retf ; +5
|
||||||
|
@@:
|
||||||
|
times (24-$) db 0 ; : left blank
|
||||||
|
rom_pci_struc dw pci_header ; +18h : offset to PCI data structure
|
||||||
|
|
||||||
|
times (32-$) db 0
|
||||||
|
|
||||||
|
; +32
|
||||||
|
pci_header:
|
||||||
|
; PCI Data Structure
|
||||||
|
pci_magic db 'PCIR' ; +0 : magic
|
||||||
|
pci_vendor dw BIOS_PCI_VENDOR ; +4 : 10EE
|
||||||
|
pci_device dw BIOS_PCI_DEVICE ; +6 : 0007
|
||||||
|
pci_vdata dw 0 ; +8 : 0 = no vital product data
|
||||||
|
pci_length dw 0x18 ; +A : PCI data structure length
|
||||||
|
pci_classrev dd BIOS_PCI_CLASS ; +C : rev.00 + class 05.00.00
|
||||||
|
pci_size dw 1 ; +10 : image length (512byte blocks)
|
||||||
|
pci_rev dw 0 ; +12
|
||||||
|
pci_codetype db 0 ; +14 : x86
|
||||||
|
pci_indicator db 0x80 ; +15 : last image
|
||||||
|
pci_maxlen dw 1 ; +16 : max length (512b blocks)
|
||||||
|
pci_hdrptr dw 0; manstr ; +18 : ExROM's config utility code header
|
||||||
|
pci_dmtf_entry dw 0 ; +1A : DMTP CLP entry point
|
||||||
|
|
||||||
|
times (64-$) db 0
|
||||||
|
|
||||||
|
manstr:
|
||||||
|
db 1,'Kolibri-A Operating System',13,10,0
|
||||||
|
; utility code header size = 42 bytes
|
||||||
|
times (64+41-$) db 0 ;
|
||||||
|
db 1 ; ver.1
|
||||||
|
|
||||||
|
utility_entry:
|
||||||
|
jmp boot_failure
|
||||||
|
times (128-$) db 0
|
||||||
|
|
||||||
|
;align 128
|
||||||
|
|
||||||
|
boot_failure:
|
||||||
|
int 18h ; return to BIOS Boot sequence
|
||||||
|
|
||||||
|
align 4
|
||||||
|
init_entry:
|
||||||
|
; note x86 "unreal" mode!
|
||||||
|
; ax = b:d.f
|
||||||
|
; bx = run-time segment
|
||||||
|
; cx = PMM segment
|
||||||
|
; dx = PMM entry offset
|
||||||
|
|
||||||
|
mov dx, 0x0cf8 ; PCI config address
|
||||||
|
; mov eax, 0x80010010 ; BAR0
|
||||||
|
and eax, 0x0FFFF
|
||||||
|
shl eax, 8
|
||||||
|
or eax, 0x80000010 ;BAR0
|
||||||
|
out dx, eax
|
||||||
|
out dx, eax
|
||||||
|
add dl, 4
|
||||||
|
in eax, dx
|
||||||
|
and eax, 0xFFFFFF00
|
||||||
|
add eax, 0x0400 ; LPC control reg
|
||||||
|
mov dword[eax], 0x90050000 ; LED port
|
||||||
|
mov dword[eax+4], 0x055
|
||||||
|
xor eax, eax
|
||||||
|
sub dl, 4
|
||||||
|
out dx, eax
|
||||||
|
mov bx, ax
|
||||||
|
retf
|
||||||
|
|
||||||
|
|
||||||
|
; mov edx,[esp] ; get the origin
|
||||||
|
; and dl, 0xF0
|
||||||
|
; shl ebx, 4 ; correct run-time address
|
||||||
|
; mov cx, 0 ; words counter
|
||||||
|
;@@:
|
||||||
|
; mov ax, word[edx+ecx]
|
||||||
|
; mov [ebx+ecx],ax
|
||||||
|
; inc cx
|
||||||
|
; inc cx
|
||||||
|
; test cx,0x200
|
||||||
|
; jz @b
|
||||||
|
; xor ax, ax
|
||||||
|
; mov bx, ax
|
||||||
|
; mov al, 0x20 ; IPL device's attached
|
||||||
|
|
||||||
|
; retd ; double !
|
||||||
|
|
||||||
|
|
||||||
|
times (0xDF-$) db 0 ; checksum position
|
||||||
|
|
||||||
|
sum = 0
|
||||||
|
repeat $-$$
|
||||||
|
load a byte from $$+% -1
|
||||||
|
sum = a + sum
|
||||||
|
end repeat
|
||||||
|
check = sum mod 256
|
||||||
|
check_byte db (0x100 - check ) mod 256
|
||||||
|
|
||||||
|
times (512-$) db 0
|
@ -0,0 +1,30 @@
|
|||||||
|
; file 'pcirom.bin':0,0x49
|
||||||
|
file 'pcirom.bin'
|
||||||
|
|
||||||
|
|
||||||
|
db 13,10
|
||||||
|
line = '0'
|
||||||
|
block = 0
|
||||||
|
repeat 7
|
||||||
|
db 'INIT_0',line,' => X"'
|
||||||
|
repeat 32
|
||||||
|
pos = 32-%
|
||||||
|
load a byte from pos+block
|
||||||
|
b = a mod 16
|
||||||
|
if b<10
|
||||||
|
c = b + '0'
|
||||||
|
else
|
||||||
|
c = b-10+'A'
|
||||||
|
end if
|
||||||
|
b = a / 16
|
||||||
|
if b<10
|
||||||
|
d = b + '0'
|
||||||
|
else
|
||||||
|
d = b-10+'A'
|
||||||
|
end if
|
||||||
|
db d, c
|
||||||
|
end repeat
|
||||||
|
db '",',13,10
|
||||||
|
block = block + 32
|
||||||
|
line = line + 1
|
||||||
|
end repeat
|
@ -0,0 +1 @@
|
|||||||
|
file 'step1.bin':512
|
@ -1,82 +0,0 @@
|
|||||||
include 'cfg_bios.inc'
|
|
||||||
use16
|
|
||||||
;org 0
|
|
||||||
|
|
||||||
rom_header:
|
|
||||||
; PnP Option ROM header
|
|
||||||
rom_signature dw 0xAA55 ; +0 : magic
|
|
||||||
rom_length db BIOS_BOOT_BLOCK_SIZE ; +2 : number of 512byte blocks
|
|
||||||
rom_entry:
|
|
||||||
jmp init_entry ; +3 : initialization entry point
|
|
||||||
db 'AZ'
|
|
||||||
rom_reserved rb 0x11 ; +7 : reserved (17 bytes)
|
|
||||||
rom_pci_struc dw pci_header ; +18h : offset to PCI data structure
|
|
||||||
rom_expansion dw pnp_header ; +1Ah : offset to expansion header structure
|
|
||||||
|
|
||||||
align 16
|
|
||||||
pnp_header:
|
|
||||||
; PnP Expansion Header
|
|
||||||
pnp_signature db '$PnP' ; +0 : magic
|
|
||||||
pnp_revision db 1 ; +4 : revision
|
|
||||||
pnp_length db 2 ; +5 : length (in 16byte paragraphs)
|
|
||||||
pnp_next dw 0 ; +6 : offset of the next header (0 if none)
|
|
||||||
pnp_reserv1 db 0 ; +8
|
|
||||||
pnp_checksum db 0 ; +9 : checksum
|
|
||||||
pnp_devid dd 0x0 ; +A : device identifier
|
|
||||||
pnp_manstr dw manstr ; +E : pointer to manufacturer string
|
|
||||||
pnp_prodstr dw prodstr ; +10 : pointer to product name string
|
|
||||||
pnp_devtype1 db 2 ; +12 : device type code
|
|
||||||
pnp_devtype2 dw 0x000
|
|
||||||
pnp_devind db 0x14 ; +15 : device indicators
|
|
||||||
pnp_bcv dw 0 ; +16 : boot connection vector (must be 0)
|
|
||||||
pnp_discv dw 0 ; +18 : disconnect vector
|
|
||||||
pnp_bev dw boot_entry ; +1A : boot entry vector
|
|
||||||
pnp_reserv2 dw 0 ; +1C
|
|
||||||
pnp_info dw 0 ; +1E : static resource information vector
|
|
||||||
|
|
||||||
align 16
|
|
||||||
pci_header:
|
|
||||||
; PCI Data Structure
|
|
||||||
pci_magic db 'PCIR' ; +0 : magic
|
|
||||||
pci_vendor dw BIOS_PCI_VENDOR ; +4 :
|
|
||||||
pci_device dw BIOS_PCI_DEVICE ; +6 : sb700 PCI bridge
|
|
||||||
pci_vdata dw 0 ; +8 : vital product data offset
|
|
||||||
pci_length dw 0x18 ; +A : PCI data structure length
|
|
||||||
pci_classrev dd BIOS_PCI_CLASS ; +C : rev.00 + class 04.00.00
|
|
||||||
pci_size dw BIOS_BOOT_BLOCK_SIZE ; +10 : image length (512byte blocks)
|
|
||||||
pci_rev dw 0 ; +12
|
|
||||||
pci_codetype db 0 ; +14 : x86
|
|
||||||
pci_indicator db 0x80 ; +15 : last image
|
|
||||||
pci_reserved dw 0
|
|
||||||
|
|
||||||
align 4
|
|
||||||
manstr:
|
|
||||||
db 'Kolibri-A Operation System',0
|
|
||||||
prodstr:
|
|
||||||
db 'ver.ROM-0.1',0
|
|
||||||
|
|
||||||
align 4
|
|
||||||
boot_entry:
|
|
||||||
@@:
|
|
||||||
|
|
||||||
|
|
||||||
boot_failure:
|
|
||||||
int 18h ; return to BIOS Boot sequence
|
|
||||||
|
|
||||||
align 4
|
|
||||||
init_entry:
|
|
||||||
xor ax, ax
|
|
||||||
mov [cs:rom_length], al
|
|
||||||
mov al, 0x20
|
|
||||||
retf
|
|
||||||
|
|
||||||
|
|
||||||
check = 0
|
|
||||||
repeat $-$$
|
|
||||||
load a byte from $$+%-1
|
|
||||||
check = a + check
|
|
||||||
end repeat
|
|
||||||
|
|
||||||
check_byte db 0x100 - (check mod 256)
|
|
||||||
|
|
||||||
times (512-$) db 0
|
|
@ -1 +1,11 @@
|
|||||||
fasm bev.asm
|
fasm pcirom.asm
|
||||||
|
fasm step1.asm
|
||||||
|
fasm step2.asm
|
||||||
|
ren step2.bin pcirom.vhd
|
||||||
|
del step1.bin
|
||||||
|
del pcirom.bin
|
||||||
|
echo off
|
||||||
|
echo ********************************
|
||||||
|
echo (C) Artem Jerdev, 2014
|
||||||
|
echo PCI ROM VHDL Template generated
|
||||||
|
pause
|
@ -2,4 +2,4 @@ BIOS_BOOT_BLOCK_SIZE equ 1 ; in 512-blocks
|
|||||||
|
|
||||||
BIOS_PCI_VENDOR equ 0x10EE
|
BIOS_PCI_VENDOR equ 0x10EE
|
||||||
BIOS_PCI_DEVICE equ 0x0007
|
BIOS_PCI_DEVICE equ 0x0007
|
||||||
BIOS_PCI_CLASS equ 0x04000000
|
BIOS_PCI_CLASS equ 0x05000000
|
Loading…
Reference in New Issue
Block a user