#include <task.h>
#include <wait.h>
+/*
+高技术配置(英语:Advanced Technology Attachment,简称“ATA”)与由集成驱动电子设备(英语:Integrated Drive
+Electronics,简称IDE)技术实现的磁盘驱动器关系最密切。
+ATA里的AT是源自PC/AT
+*/
+
+/*
+IDE和ATA实际上是同一种技术,只是在名称上有所不同。IDE代表“集成驱动器电子设备”(Integrated Drive Electronics),
+而ATA代表“高级技术附件”(Advanced Technology Attachment)。这两个名称都是指代用于连接和控制计算机硬盘驱动器的接口标准。
+这种技术最初在1986年由Western Digital公司为IBM的PC/AT设计,当时的目标是通过将控制器直接集成到硬盘驱动器上,
+来在性能和成本上优于当时的SCSI接口标准。这种设计被命名为IDE。 后来,为了使这种技术的标准化,American National Standards
+Institute(ANSI)制定了一系列的ATA标准。因此,从技术角度来说,IDE和ATA实际上是同一种事物,只是在历史发展过程中,IDE的名称更早被提出,而ATA则是后来为了标准化而提出的名称。
+至于为什么会出现混用的情况,这主要是因为在市场上,很多人已经习惯了使用IDE这个名称,而ATA则是在技术文档和标准中更常用。实际上,如果你去购买硬盘驱动器,你可能会看到IDE/ATA这样的标签,这只是为了向用户表明,这种驱动器符合ATA的标准,同时也是IDE的一种。
+总的来说,IDE和ATA就像两面硬币,代表的是同一种技术,只是在名称上有所不同,因此会出现混用的情况。
+*/
+
+/*
+除了硬盘之外,IDE接口还可以用于连接光盘驱动器(如CD-ROM、DVD-ROM等)、ZIP驱动器等存储设备。这些设备都使用了类似于ATA的传输协议和控制方式。为了适应光盘驱动器等设备的特性,ATA标准得到了扩展,形成了ATAPI(ATA
+Packet Interface)标准。
+ATAPI可以看作是ATA标准的一个补充,它允许在ATA基础上增加了一些特定的命令集,用于支持光盘驱动器等设备的特殊功能,如媒体播放控制等。
+因此,当我们说IDE可以接光盘驱动器时,实际上是指IDE接口也支持兼容ATAPI标准的设备。换句话说,ATAPI是ATA标准的一个扩展,IDE接口既可以用于连接硬盘(使用ATA标准),也可以用于连接光盘驱动器(使用ATAPI标准)。
+*/
+
+/*
+在IDE的发展过程中,早期的IDE接口确实未必支持光盘驱动器。这主要是因为当时的IDE接口和ATA标准主要针对的是硬盘驱动器,尚未考虑涉及光盘驱动器等其他存储设备的需求。不过,随着技术的发展和市场需求的变化,IDE接口逐渐支持了ATAPI标准,从而可以兼容光盘驱动器等设备。
+总的来说,现在市场上的IDE接口几乎都支持光盘驱动器,因为ATAPI已经成为了IDE接口的一个通用标准。但在IDE技术刚推出时,某些早期版本的IDE接口确实可能不支持光盘驱动器。
+*/
+
+/*
+ATA(Advanced Technology Attachment)的发展历程主要经历了以下阶段:
+
+ATA-1:在1986年,Western
+Digital为IBM的PC/AT设计了IDE接口,这就是最早的ATA标准,被称为ATA-1。这个标准的传输速度最高为8.3MB/s。
+
+ATA-2:1994年,ATA-1标准被改进为ATA-2,也被称为Fast ATA或Enhanced IDE
+(EIDE)。这个标准提供了更高的数据传输速度(最高16.6MB/s),并增加了支持ATAPI设备(如CD-ROM驱动器)的能力。
+
+ATA-3:ATA-2后不久,ATA-3标准被发布,主要增加了一些安全特性,如设备密码保护等。
+
+Ultra ATA/ATA-4:1998年,ATA标准再次被改进,发布了Ultra ATA/ATA-4,传输速度最高达到33MB/s。
+
+Ultra ATA/66(ATA-5)、Ultra ATA/100(ATA-6)和Ultra
+ATA/133(ATA-7):随后的几年里,ATA标准不断改进,发布了ATA-5、ATA-6和ATA-7,传输速度分别提升到66MB/s、100MB/s和133MB/s。
+
+Serial ATA (SATA):2003年,为了解决并行ATA接口在速度和设计上的限制,Serial
+ATA(SATA)标准被发布,这是一种全新的基于串行技术的接口。SATA提供了更高的传输速度(最初为150MB/s,后续版本可达600MB/s),并且接口更小,设计更灵活。
+
+总的来说,ATA的发展历程是一个不断追求更高传输速度,更高兼容性,以及更易于设计和使用的过程。在这个过程中,ATA标准从最初的IDE发展到了今天的SATA,为现代计算机的发展打下了重要基础。
+*/
+
+/*
+最完善的IDE接口(并行ATA接口)支持到ATA-7标准。ATA-7标准也被称为Ultra
+ATA/133,它提供了最高133MB/s的数据传输速度。在此之后,IDE接口逐渐被新的串行ATA接口(SATA)所取代,SATA成为了现代计算机硬盘和其他存储设备的主要接口标准。虽然SATA仍然遵循ATA的基本架构和命令集,但它采用了不同的物理接口和传输技术,因此不能直接与IDE接口兼容。
+ */
+
+/*
+在IDE出现之前,计算机主要依赖ST-506/412接口和SCSI接口来连接硬盘和其他存储设备。这些接口在当时存在以下问题:
+
+1. 性能:ST-506/412接口的传输速度相对较慢(最高约为5MB/s),不能满足日益增长的性能需求。
+
+2. 成本:尽管SCSI接口在性能上优于ST-506/412接口,但其成本较高,主要应用于高性能工作站和服务器领域。对于普通消费者而言,
+SCSI接口的成本可能难以承受。
+
+3. 复杂性:早期的硬盘接口需要单独的控制器卡,用户需要购买和安装额外的硬件。此外,对于SCSI接口,
+设备的配置和管理相对复杂。 IDE接口的出现带来了以下优点,解决了上述核心问题:
+
+1. 性能提升:通过将硬盘控制器集成到硬盘驱动器本身,IDE接口在性能上相较于ST-506/412接口有了很大提升。
+随着技术的发展,后续的ATA标准(如ATA-2、ATA-3等)进一步提高了数据传输速度。
+
+2. 成本降低:由于将控制器集成到硬盘驱动器上,IDE接口减少了额外硬件的需求,从而降低了成本。
+这使得IDE接口成为了普通消费者更容易接受的选择。
+
+3. 易用性提高:IDE接口简化了设备的配置和管理,无需单独的控制器卡,
+用户只需将硬盘驱动器直接连接到计算机主板上的IDE插槽即可。
+
+4. 兼容性:随着ATAPI标准的引入,IDE接口不仅可以连接硬盘驱动器,还可以连接光盘驱动器、 ZIP驱动器等其他存储设备,
+提高了其兼容性和应用范围。
+
+总之,IDE接口的出现解决了早期硬盘接口在性能、成本和易用性方面的核心问题,为个人计算机市场的发展奠定了基础。
+*/
+
+/*
+IDE是一种计算机系统接口,主要用于硬盘和CD-ROM,本意为“把控制器与盘体集成在一起的硬盘”。数年以前PC主机使用的硬盘,大多数都是IDE兼容的,只需用一根电缆将它们与主板或适配器连起来就可以了,而目前主要接口为SATA接口。而在SATA技术日益发展下,没有ATA的主板已经出现,而且Intel在新型的芯片组中已经不默认支持ATA接口,主机版厂商需要另加芯片去对ATA作出支持(通常是为了兼容旧有硬盘和光盘驱动器)。
+SATA(Serial ATA)于2002年推出后,原有的ATA改名为PATA(并行高技术配置,Parallel ATA)。2013年12月29日,
+西部数据正式停止PATA硬盘供应,而希捷科技则已停售产多年,这意味着1986年设计的PATA接口在经历27年后正式退出历史舞台。
+一般说来,ATA是一个控制器技术,而IDE是一个匹配它的磁盘驱动器技术,但是两个术语经常可以互用。ATA是一个花费低而性能适中的接口,主要是针对台式机而设计的,销售的大多数ATA控制器和IDE磁盘都是更高版本的,称为ATA-2和ATA-3,与之匹配的磁盘驱动器称为增强的IDE。
+把盘体与控制器集成在一起的做法,减少了硬盘接口的电缆数目与长度,数据传输的可靠性得到了增强,硬盘制造起来变得更容易,因为厂商不需要再担心自己的硬盘是否与其他厂商生产的控制器兼容,对用户而言,硬盘安装起来也更为方便。
+*/
+
+// 随着SATA技术的出现,之前所有的ATA就被称为PATA
ide_pci_controller_t ide_pci_controller[NR_IDE_CONTROLLER];
unsigned int IDE_CHL0_CMD_BASE = 0x1F0;
return 0;
}
+const char *pci_intr_pin(int pin) {
+ switch (pin) {
+ case 0:
+ return "NOINTPIN";
+ case 1:
+ return "INTA#";
+ case 2:
+ return "INTB#";
+ case 3:
+ return "INTC#";
+ case 4:
+ return "INTD#";
+ default:
+ return "ERRPIN";
+ }
+}
+
void dump_pci_dev() {
list_head_t *p;
int i;
// printk("vendor %04x device %04x class %04x:%02x bus %d intr %3d ", pci->vendor, pci->device, pci->classcode,
// pci->progif, pci->bus, pci->intr_line);
// printk("%s\n", pci_get_info(pci->classcode, pci->progif));
- printk("PCI %03d:%02d.%d %02X #%02d %04X:%04X %s\n", pci->bus, pci->dev, pci->devfn, pci->progif,
- pci->intr_line, pci->vendor, pci->classcode, pci_get_info(pci->classcode, pci->progif));
+ printk("PCI %03d:%02d.%d %02X %s%02d %04X%02X %04X:%04X %s\n", pci->bus, pci->dev, pci->devfn, pci->progif,
+ pci_intr_pin(pci->intr_pin), pci->intr_line, pci->classcode, pci->progif, pci->vendor, pci->device,
+ pci_get_info(pci->classcode, pci->progif));
#if 0
switch (pci->hdr_type) {
case PCI_HDRTYPE_NORMAL:
break;
}
#else
- // for (int bar_inx = 0; bar_inx < BARS_CNT; bar_inx++) {
- // printk("%08x ", pci->bars[bar_inx]);
- // }
- // printk("\n");
+ for (int bar_inx = 0; bar_inx < BARS_CNT; bar_inx++) {
+ printk("%08x ", pci->bars[bar_inx]);
+ }
+ printk("\n");
#endif
}
}
// 11 ~ 15: 设备号
// 16 ~ 23: 总线号
// 24 ~ 30: 保留
-// 31: 有效位
+// 31: 有效位, 使能对PCI Bus DATA的访问
#define PCI_CMD(bus, dev, fn, reg) (0x80000000 | (bus << 16) | (dev << 11) | (fn << 8) | reg)
#define PCI_CONFIG_CMD(cmd) (cmd & ~3)
#define PCI_GET_CMD_REG(cmd) (cmd & 0xFF)
#define PCI_MAXLAT 0x3F
/* PCI IDS */
+// https://pcisig.com/sites/default/files/files/PCI_Code-ID_r_1_11__v24_Jan_2019.pdf
+#define PCI_BASE_CLASS_STORAGE 0x01
+#define PCI_CLASS_STORAGE_SCSI 0x0100
+#define PCI_CLASS_STORAGE_IDE 0x0101
+#define PCI_CLASS_STORAGE_FLOPPY 0x0102
+#define PCI_CLASS_STORAGE_IPI 0x0103
+#define PCI_CLASS_STORAGE_RAID 0x0104
+#define PCI_CLASS_STORAGE_ATA 0x0105
+#define PCI_CLASS_STORAGE_SATA 0x0106
+#define PCI_CLASS_STORAGE_SAS 0x0107 // Serial Attached SCSI (SAS) controller
+#define PCI_CLASS_STORAGE_NVM 0x0108 //
+#define PCI_CLASS_STORAGE_UFS 0x0109 // Universal Flash Storage (UFS) controller
+#define PCI_CLSSS_STORAGE_OTHER 0x0180
+
// Display
#define PCI_BASE_CLASS_DISPLAY 0x03
#define PCI_CLASS_DISPLAY_VGA 0x0300
+#define PCI_CLASS_DISPLAY_XGA 0x0301
+#define PCI_CLASS_DISPLAY_3D 0x0302
+#define PCI_CLASS_DISPLAY_OTHER 0x0380
+
+// MultiMedia
+#define PCI_BASE_CLASS_MULTIMEDIA 0x04
+#define PCI_CLASS_MULTIMEDIA_VIDEO 0x0400
+#define PCI_CLASS_MULTIMEDIA_AUDIO 0x0401
+#define PCI_CLASS_MULTIMEDIA_PHONE 0x0402
+
+// Memory
+#define PCI_BASE_CLASS_MEMORY 0x05
+#define PCI_CLASS_MEMORY_RAM 0x0500
+#define PCI_CLASS_MEMORY_FLASH 0x0501
+#define PCI_CLASS_MEMORY_OTHER 0x0580
+
// Bridge
#define PCI_BASE_CLASS_BRIDGE 0x06
#define PCI_CLASS_BRIDGE_HOST 0x0600
#define PCI_CLASS_BRIDGE_ISA 0x0601
+#define PCI_CLASS_BRIDGE_EISA 0x0602
+#define PCI_CLASS_BRIDGE_MCA 0x0603
#define PCI_CLASS_BRIDGE_PCI 0x0604
#define PCI_CLASS_BRIDGE_CARDBUS 0x0607
+// Communication
+#define PCI_BASE_CLASS_COMMUNICATION 0x07
+#define PCI_CLASS_COMMUNICATION_SERIAL 0X0700
+#define PCI_CLASS_COMMUNICATION_PARALLEL 0X0701
+#define PCI_CLASS_COMMUNICATION_MULTISERIAL 0X0702
+#define PCI_CLASS_COMMUNICATION_MODEM 0X0703
+#define PCI_CLASS_COMMUNICATION_OTHER 0X0780
+
/* Vendors*/
#define PCI_VENDORID_COMPAQ 0x0E11
#define PCI_VENDORID_INTEL 0x8086