diff --git a/kernel/Makefile b/kernel/Makefile index f49271d..76431c5 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -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 \ diff --git a/kernel/dev/at/ata.inc b/kernel/dev/at/ata.inc new file mode 100644 index 0000000..7bf4505 --- /dev/null +++ b/kernel/dev/at/ata.inc @@ -0,0 +1,180 @@ + ;; File: ata.inc + ;; + ;; + ;; + +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 diff --git a/kernel/dev/at/com.inc b/kernel/dev/at/com.inc index cb9b0ef..cef4ba5 100644 --- a/kernel/dev/at/com.inc +++ b/kernel/dev/at/com.inc @@ -1,4 +1,5 @@ ;; File: com.inc + ;; UART 8250, 16750 driver ;; ;; Usefull links: ;; - @@ -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 diff --git a/kernel/dev/at/ide.inc b/kernel/dev/at/ide.inc deleted file mode 100644 index 12fb483..0000000 --- a/kernel/dev/at/ide.inc +++ /dev/null @@ -1,4 +0,0 @@ - ;; File: ide.inc - -ide_probe: - ret diff --git a/kernel/dev/at/ne2k.inc b/kernel/dev/at/ne2k.inc index f825f4f..a9f367d 100644 --- a/kernel/dev/at/ne2k.inc +++ b/kernel/dev/at/ne2k.inc @@ -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 diff --git a/kernel/dev/dev.inc b/kernel/dev/dev.inc index d41fef6..0d7d0a5 100644 --- a/kernel/dev/dev.inc +++ b/kernel/dev/dev.inc @@ -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: diff --git a/kernel/dev/random.inc b/kernel/dev/random.inc new file mode 100644 index 0000000..e69de29 diff --git a/kernel/idt.inc b/kernel/idt.inc index cf00d0c..3fdc78f 100644 --- a/kernel/idt.inc +++ b/kernel/idt.inc @@ -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