]> Zhao Yanbai Git Server - kernel.git/commitdiff
ata用中断+waitqueue读信息
authoracevest <zhaoyanbai@126.com>
Tue, 16 Nov 2021 04:27:24 +0000 (12:27 +0800)
committeracevest <zhaoyanbai@126.com>
Tue, 16 Nov 2021 04:27:24 +0000 (12:27 +0800)
drivers/ata.c
drivers/ide.c
drivers/ide.h

index d2dc346114fd132ebd7882634e4c6ac4aa51d10e..ec365c40f641a00e7647cdb40584613e6570a823 100644 (file)
 #include <ide.h>
 #include <io.h>
 #include <irq.h>
+#include <sched.h>
 #include <string.h>
 #include <system.h>
 #include <types.h>
+#include <wait.h>
+
 extern ide_pci_controller_t ide_pci_controller;
 
 #define ATA_TIMEOUT 10  // 10次时钟中断
@@ -43,24 +46,26 @@ void ata_test(uint64_t nr) {
 u16 identify[256];
 void ata_send_read_identify_cmd(int dev) {}
 void ata_read_identify(int dev) {  // 这里所用的dev是逻辑编号 ATA0、ATA1下的Master、Salve的dev分别为0,1,2,3
+
+    DECLARE_WAIT_QUEUE_HEAD(wq_head);
+    DECLARE_WAIT_QUEUE(wait, current);
+    add_wait_queue(&wq_head, &wait);
+    ide_pci_controller.task = current;
+
     outb(0x00, REG_CTL(dev));
     outb(0x00 | ((dev & 0x01) << 4), REG_DEVICE(dev));  // 根据文档P113,这里不用指定bit5, bit7,直接指示DRIVE就行
 
     unsigned long flags;
     irq_save(flags);
 
-    void add_to_ide_wait_queue();
-    add_to_ide_wait_queue();
-
+    current->state = TASK_WAIT;
     outb(ATA_CMD_IDENTIFY, REG_CMD(dev));
 
     irq_restore(flags);
 
     schedule();
 
-    printk("asfdasdfasd----\n");
-
-    // sleep_on_ide();
+    del_wait_queue(&wq_head, &wait);
 
     insw(REG_DATA(dev), identify, SECT_SIZE / sizeof(u16));
 
index b399fc2bcf32e5bf8c99e170b4ef8130d1bad7c5..14e6cbe91e66325e92efc779b99d6ae3c7b12374 100644 (file)
@@ -13,7 +13,7 @@
 #include <irq.h>
 
 // #include <printk.h>
-// #include <sched.h>
+#include <task.h>
 // #include <semaphore.h>
 // #include <string.h>
 // #include <types.h>
@@ -538,18 +538,10 @@ DECLARE_WAIT_QUEUE_HEAD(ide_wait_queue_head);
 
 void sleep_on_ide() { sleep_on(&ide_wait_queue_head); }
 
-wait_queue_t iwait;
-// DECLARE_WAIT_QUEUE(wait, current);
-void add_to_ide_wait_queue() {
-    iwait.task = current;
-    iwait.task_list.prev = &iwait.task_list;
-    iwait.task_list.next = &iwait.task_list;
-    list_add_tail(&iwait.task_list, &ide_wait_queue_head.task_list);
-}
-
 extern void *mbr_buf;
 uint8_t ata_pci_bus_status();
 extern ide_pci_controller_t ide_pci_controller;
+
 void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) {
     printk("ide irq handler %d \n", irq);
 
@@ -568,7 +560,9 @@ void ide_irq_handler(unsigned int irq, pt_regs_t *regs, void *devid) {
     }
 #endif
 
-    wake_up(&ide_wait_queue_head);
+    // wake_up(&ide_wait_queue_head);
+
+    ide_pci_controller.task->state = TASK_RUNNING;
 }
 
 void ide_init() {
index 803ff55fff18d73654bf4c9af2f0b2060731fa5b..62979d14751535ec8f8a71542c5d143670b7ec25 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <pci.h>
 #include <system.h>
+#include <task.h>
 
 // extern unsigned int HD_CHL0_CMD_BASE;
 // extern unsigned int HD_CHL1_CMD_BASE;
@@ -173,6 +174,10 @@ typedef struct _ide_pci_controller {
     unsigned int bus_prdt;
 
     prdte_t *prdt;
+
+    // 这里应该改成一个请求链表
+    // 先简单实现
+    task_union *task;
 } ide_pci_controller_t;
 
 void sleep_on_ide();
\ No newline at end of file