[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