[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pbsd-mg2] find_ohci() on isa_machdep.c



はじめまして. まえかわ@神戸大学といいます.

単純に ISA mem を全領域 scan して
ohci だろうと推測される場所の候補が
いくつあるかを調べるためのパッチを作ってみました.
USB が使える (はず) のマシンをお持ちの方は
テストしていただけると幸いです.

単純に数を数えているだけで, どこがそれらしいとかは出力しません.
鼻血が出る程候補があるとまずいと思いましたので.

# ohci を調べていますが, これが正しいかどうかは
# 全く根拠のない単なる勘です.

--- Kobe University (Dept. Science)          maekawa@math.kobe-u.ac.jp
           MAEKAWA Masahide                  gehenna@jp.FreeBSD.org ---
                           Powered By FreeBSD
--- isa_machdep.c.orig	Fri Sep 10 03:14:04 1999
+++ isa_machdep.c	Fri Sep 10 03:52:38 1999
@@ -62,6 +62,12 @@
 static void __find_pcic __P((void));
 #endif
 
+#ifdef DEBUG_FIND_OHCI
+#include <dev/usb/ohcireg.h>
+#warning DEBUG_FIND_OHCI
+static void find_ohci __P((void));
+#endif
+
 int
 vrisabmatch(parent, match, aux)
     struct device *parent;
@@ -119,6 +125,12 @@
 
     hpcmips_init_bus_space_extent(iba.iba_iot);
 
+#ifdef DEBUG_FIND_OHCI
+    find_ohci();
+
+    return;
+#endif
+
 #ifdef DEBUG_FIND_PCIC
 #warning DEBUG_FIND_PCIC
     __find_pcic();
@@ -244,3 +256,49 @@
 }
 #endif
 
+#ifdef DEBUG_FIND_OHCI
+#warning DEBUG_FIND_OHCI
+static void
+find_ohci(void)
+{
+	u_int32_t addr, reg;
+	int found, i;
+
+	printf("\nFinding USB Host Controller. Trying ISA mem %#x-%#x ",
+	       VR_ISA_MEM_BASE, VR_ISA_MEM_BASE + VR_ISA_MEM_SIZE);
+
+	for (found = 0, i = VR_ISA_MEM_BASE ; i < VR_ISA_MEM_BASE + VR_ISA_MEM_SIZE ; i++) {
+		*((volatile u_int32_t*)addr) = i;
+
+		/* HcRevision */
+		reg = *((volatile u_int32_t*)(addr + OHCI_REVISION);
+		if (reg != 0x00000010)
+			break;
+		/* HcControl */
+		reg = *((volatile u_int32_t*)(addr + OHCI_REVISION);
+		if ((reg & 0xfffff800) != 0)
+			break;
+		/* HcCommandStatus */
+		reg = *((volatile u_int32_t*)(addr + OHCI_COMMAND_STATUS);
+		if ((reg & 0xfffcfff0) != 0)
+			break;
+		/* HcInterruptStatus */
+		reg = *((volatile u_int32_t*)(addr + OHCI_INTERRUPT_STATUS);
+		if ((reg & 0x3fffff80) != 0)
+			break;
+		/* HcInterruptEnable */
+		reg = *((volatile u_int32_t*)(addr + OHCI_INTERRUPT_ENABLE);
+		if ((reg & 0x3fffff80) != 0)
+			break;
+		/* HcInterruptDisable */
+		reg = *((volatile u_int32_t*)(addr + OHCI_INTERRUPT_DISABLE);
+		if ((reg & 0x3fffff80) != 0)
+			break;
+		found++;
+	}
+
+	printf("(%d found)\n", found);
+
+	return;
+}
+#endif