feat(kernel): probe ata disk
This commit is contained in:
parent
e84e98f6a5
commit
593e8a2b9c
|
@ -29,6 +29,7 @@ SRCS = kernel.asm \
|
|||
dev/at/kbd.inc \
|
||||
dev/at/com.inc \
|
||||
dev/at/ne2k.inc \
|
||||
dev/at/ata.inc \
|
||||
dev/at/floppy.inc \
|
||||
dev/dev.inc \
|
||||
fs/fat.inc \
|
||||
|
|
180
kernel/dev/at/ata.inc
Normal file
180
kernel/dev/at/ata.inc
Normal file
|
@ -0,0 +1,180 @@
|
|||
;; File: ata.inc
|
||||
;;
|
||||
;; <ATA PIO Mode at https://wiki.osdev.org/ATA_PIO_Mode>
|
||||
;; <IDE spec at https://www.cpcwiki.eu/imgs/a/a2/IDE_SPEC.PDF>
|
||||
|
||||
ATA_PRIMARY_IO = 0x1F0
|
||||
ATA_PRIMARY_IO_CTRL = 0x3F6
|
||||
ATA_SECONDARY_IO = 0x170
|
||||
ATA_SECONDARY_IO_CTRL = 0x376
|
||||
|
||||
ATA_CHAN0_IO = 0x1F0
|
||||
ATA_CHAN1_IO = 0x170
|
||||
ATA_CHAN2_IO = 0x1E8
|
||||
ATA_CHAN3_IO = 0x168
|
||||
|
||||
ATA_DATA = 0x0
|
||||
;; Constant: ATA_ERROR
|
||||
;;
|
||||
ATA_ERROR = 0x1
|
||||
ATA_ERROR_AMNF = 0x01
|
||||
ATA_ERROR_TKZNF = 0x02
|
||||
ATA_ERROR_ABRT = 0x04
|
||||
ATA_ERROR_MCR = 0x08
|
||||
ATA_ERROR_IDNF = 0x10
|
||||
ATA_ERROR_MC = 0x20
|
||||
ATA_ERROR_UNC = 0x40
|
||||
ATA_ERROR_BBK = 0x80
|
||||
|
||||
ATA_FEATURES = 0x1
|
||||
ATA_SECCOUNT = 0x2
|
||||
ATA_SECNUM = 0x3
|
||||
ATA_CYLLO = 0x4
|
||||
ATA_CYLHI = 0x5
|
||||
;; Constant: ATA_DRVHEAD
|
||||
;; Drive/Head register
|
||||
;;
|
||||
ATA_DRVHEAD = 0x6
|
||||
ATA_DRVHEAD_DRV = 0x10
|
||||
ATA_DRVHEAD_LBA = 0x40
|
||||
|
||||
ATA_COMMAND = 0x7
|
||||
|
||||
;; Constant: ATA_STATUS
|
||||
;;
|
||||
ATA_STATUS = 0x7
|
||||
ATA_STATUS_ERR = 0x01
|
||||
ATA_STATUS_IDX = 0x02
|
||||
ATA_STATUS_CORR = 0x04
|
||||
ATA_STATUS_DRQ = 0x08
|
||||
ATA_STATUS_SRV = 0x10
|
||||
ATA_STATUS_DF = 0x20
|
||||
ATA_STATUS_RDY = 0x40
|
||||
ATA_STATUS_BSY = 0x80
|
||||
|
||||
;; Constant: ATA_CTRL
|
||||
;; Device control register (Control base + 0)
|
||||
ATA_CTRL = 0x0
|
||||
ATA_CTRL_nIEN = 0x02
|
||||
ATA_CTRL_SRST = 0x04
|
||||
ATA_CTRL_HOB = 0x80
|
||||
|
||||
ATA_DRVADDR = 0x1
|
||||
ATA_DRVADDR_DS0 = 0x01
|
||||
ATA_DRVADDR_DS1 = 0x02
|
||||
ATA_DRVADDR_WTG = 0x40
|
||||
|
||||
ATA_CMD_RESTORE = 0x10
|
||||
ATA_CMD_DIAGNOSTIC = 0x90
|
||||
ATA_CMD_IDENTIFY = 0xA0
|
||||
|
||||
;; Function: ata_wait
|
||||
;;
|
||||
;; In:
|
||||
;; AX - IO port
|
||||
;;
|
||||
ata_wait:
|
||||
mov dx, ax
|
||||
add dx, ATA_STATUS
|
||||
@@:
|
||||
in al, dx
|
||||
and al, ATA_STATUS_BSY
|
||||
jnz @b
|
||||
ret
|
||||
|
||||
;; Function: ata_probe
|
||||
;; In:
|
||||
;; AX - IO port
|
||||
;;
|
||||
ata_probe:
|
||||
push bx
|
||||
mov bx, ax
|
||||
xor ecx, ecx
|
||||
.loop:
|
||||
call ata_wait
|
||||
|
||||
; select drive
|
||||
mov dx, bx
|
||||
add dx, ATA_DRVHEAD
|
||||
mov al, cl
|
||||
shl al, 4
|
||||
or al, 0xa0
|
||||
out dx, al
|
||||
|
||||
mov ax, bx
|
||||
call ata_wait
|
||||
|
||||
mov dx, bx
|
||||
add dx, ATA_COMMAND
|
||||
mov al, ATA_CMD_DIAGNOSTIC
|
||||
out dx, al
|
||||
|
||||
mov ax, bx
|
||||
call ata_wait
|
||||
|
||||
mov dx, bx
|
||||
add dx, ATA_STATUS
|
||||
in al, dx
|
||||
and al, ATA_STATUS_ERR or ATA_STATUS_DRQ
|
||||
jnz @f
|
||||
|
||||
mov ax, bx
|
||||
call ata_wait
|
||||
|
||||
mov dx, bx
|
||||
add dx, ATA_COMMAND
|
||||
mov al, ATA_CMD_RESTORE
|
||||
out dx, al
|
||||
|
||||
mov ax, bx
|
||||
call ata_wait
|
||||
|
||||
mov dx, bx
|
||||
add dx, ATA_STATUS
|
||||
in al, dx
|
||||
and al, ATA_STATUS_ERR or ATA_STATUS_DRQ
|
||||
jnz @f
|
||||
|
||||
push ecx
|
||||
push ecx
|
||||
mov esi, szMsgAtaFound
|
||||
call klog
|
||||
pop ecx
|
||||
@@:
|
||||
inc cl
|
||||
cmp cl, 2
|
||||
jb .loop
|
||||
pop bx
|
||||
ret
|
||||
|
||||
;; Function: ata_init
|
||||
ata_init:
|
||||
mov ecx, aAtaChans
|
||||
@@:
|
||||
push ecx
|
||||
mov ax, word [ecx]
|
||||
call ata_probe
|
||||
pop ecx
|
||||
add ecx, 2
|
||||
cmp ecx, aAtaChans.end
|
||||
jb @b
|
||||
ret
|
||||
|
||||
ata_primary_irq:
|
||||
iret
|
||||
|
||||
ata_secondary_irq:
|
||||
iret
|
||||
|
||||
ata_device:
|
||||
db "ata", 0, 0, 0, 0, 0
|
||||
dd ata_init
|
||||
|
||||
aAtaChans:
|
||||
dw ATA_CHAN0_IO
|
||||
; dw ATA_CHAN1_IO
|
||||
; dw ATA_CHAN2_IO
|
||||
; dw ATA_CHAN3_IO
|
||||
.end:
|
||||
|
||||
szMsgAtaFound db "ATA: hd%u found", 0
|
|
@ -1,4 +1,5 @@
|
|||
;; File: com.inc
|
||||
;; UART 8250, 16750 driver
|
||||
;;
|
||||
;; Usefull links:
|
||||
;; - <PC16550D datasheet at https://www.scs.stanford.edu/10wi-cs140/pintos/specs/pc16550d.pdf>
|
||||
|
@ -14,8 +15,22 @@ UART8250_RBR = 0x0
|
|||
UART8250_THR = 0x0
|
||||
|
||||
UART8250_IER = 0x1
|
||||
UART8250_IER_RDA = 0x1
|
||||
UART8250_IER_THRE = 0x2
|
||||
UART8250_IER_RLSRC = 0x4
|
||||
UART8250_IER_MSRC = 0x8
|
||||
UART16750_IER_SLEEP = 0x10
|
||||
UART16750_IER_LPM = 0x20
|
||||
|
||||
UART8250_IIR = 0x2
|
||||
|
||||
UART8250_FCR = 0x2
|
||||
UART8250_FCR_EN = 0x1
|
||||
UART8250_FCR_CLSR = 0x2
|
||||
UART8250_FCR_CLST = 0x4
|
||||
UART8250_FCR_DMA = 0x8
|
||||
UART16750_FCR_64EN = 0x20
|
||||
|
||||
UART8250_LCR = 0x3
|
||||
UART8250_MCR = 0x4
|
||||
UART8250_MCR_OUT2 = 0x08
|
||||
|
|
|
@ -1,4 +0,0 @@
|
|||
;; File: ide.inc
|
||||
|
||||
ide_probe:
|
||||
ret
|
|
@ -108,6 +108,10 @@ ne2k_probe:
|
|||
ret
|
||||
|
||||
ne2k_irq:
|
||||
pusha
|
||||
mov esi, szMsgNe2kIRQ
|
||||
call klog
|
||||
popa
|
||||
iret
|
||||
|
||||
ne2k_device:
|
||||
|
@ -115,3 +119,4 @@ ne2k_device:
|
|||
dd ne2k_init
|
||||
|
||||
szMsgNe2kfound db "NE2K: found", 0
|
||||
szMsgNe2kIRQ db "NE2K: IRQ", 0
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
include 'at/pit.inc'
|
||||
include 'at/kbd.inc'
|
||||
include 'at/cga.inc'
|
||||
include 'at/ata.inc'
|
||||
include 'at/floppy.inc'
|
||||
|
||||
struc Device {
|
||||
|
@ -50,6 +51,7 @@ aDevices:
|
|||
dd console_device
|
||||
dd com_device
|
||||
dd ne2k_device
|
||||
dd ata_device
|
||||
.end:
|
||||
|
||||
dev_init:
|
||||
|
|
0
kernel/dev/random.inc
Normal file
0
kernel/dev/random.inc
Normal file
|
@ -49,6 +49,14 @@ idt_setup:
|
|||
mov eax, ne2k_irq
|
||||
call idt_set_gate
|
||||
|
||||
mov ecx, 46
|
||||
mov eax, ata_primary_irq
|
||||
call idt_set_gate
|
||||
|
||||
mov ecx, 47
|
||||
mov eax, ata_secondary_irq
|
||||
call idt_set_gate
|
||||
|
||||
mov ecx, 0x42
|
||||
mov eax, isr_syscall
|
||||
call idt_set_gate
|
||||
|
|
Loading…
Reference in a new issue