feat(kernel): probe ata disk

This commit is contained in:
d0p1 🏳️‍⚧️ 2024-07-22 23:43:35 +02:00
parent e84e98f6a5
commit 593e8a2b9c
8 changed files with 211 additions and 4 deletions

View file

@ -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
View 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

View file

@ -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

View file

@ -1,4 +0,0 @@
;; File: ide.inc
ide_probe:
ret

View file

@ -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

View file

@ -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
View file

View 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