090623

|



昨日、ついに起動不能となってしまったガレージのWindows2000マシン。どうも
ブートに必要なファイルの部分が物理的に壊れてしまったようだ...。仕方ない
ので、Vistaマシンでデータだけ吸いとりました。このVistaマシン。いつもは
NFSブートでNetBSDが立ちあがっている。それもカメラからのフラッシュを読み
とるだけのために。1年以上前からNetBSDのUSB mass storageはどうもおかしい。
動くけれどたまにIDEの方でパニックするとか、動かないとか。NFSルートで使
う分にはまったく問題ないので、たぶんディスクまわりでなにかおかしいんだ
ろうな...とは思いつつ。

そのVistaマシンをガレージにもっていくこととして、カメラのデータ吸いとり 用マシンをどうしようか... ということで、買って以来、環境整備だけしてまっ たく使ったことのないネットブック、工人舎のSA5ST08Aを使うことにしました。 最近はNetBSDでもsdmmc (SD/MMCコントローラ直結)が使えるようになってみた いだしね。
このマシンのコントローラもTIなので
Index: sdhc_pci.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/sdhc_pci.c,v
retrieving revision 1.1
diff -u -r1.1 sdhc_pci.c
--- sdhc_pci.c	21 Apr 2009 03:00:29 -0000	1.1
+++ sdhc_pci.c	23 Jun 2009 13:00:39 -0000
@@ -83,6 +83,9 @@
 #define	SDHC_PCI_QUIRK_FORCE_DMA	(1U << 0)
 #define	SDHC_PCI_QUIRK_TI_HACK		(1U << 1)
 #define	SDHC_PCI_QUIRK_NO_PWR0		(1U << 2)
+  pci_product_id_t flash_controller_product;
+  u_int flash_controller_function;
+
 } sdhc_pci_quirk_table[] = {
 	{
 		PCI_VENDOR_TI,
@@ -90,7 +93,9 @@
 		0xffff,
 		0xffff,
 		4,
-		SDHC_PCI_QUIRK_TI_HACK
+		SDHC_PCI_QUIRK_TI_HACK,
+		PCI_PRODUCT_TI_PCI72111FM,
+		3
 	},
 
 	{
@@ -99,13 +104,27 @@
 		0xffff,
 		0xffff,
 		0,
-		SDHC_PCI_QUIRK_NO_PWR0
+		SDHC_PCI_QUIRK_NO_PWR0,
+		0,
+		0
+	},
+
+	{
+		PCI_VENDOR_TI,
+		PCI_PRODUCT_TI_PCIXX12SD,
+		0xffff,
+		0xffff,
+		3,
+		SDHC_PCI_QUIRK_TI_HACK,
+		PCI_PRODUCT_TI_PCIXX12FM,
+		2
 	},
 };
 
-static void sdhc_pci_quirk_ti_hack(struct pci_attach_args *);
+static void sdhc_pci_quirk_ti_hack(struct pci_attach_args *,
+    const struct sdhc_pci_quirk *);
 
-static uint32_t
+static const struct sdhc_pci_quirk *
 sdhc_pci_lookup_quirk_flags(struct pci_attach_args *pa)
 {
 	const struct sdhc_pci_quirk *q;
@@ -125,7 +144,7 @@
 
 			if ((q->subvendor == 0xffff)
 			 && (q->subproduct == 0xffff))
-				return q->flags;
+				return q;
 
 			id = pci_conf_read(pa->pa_pc, pa->pa_tag,
 			    PCI_SUBSYS_ID_REG);
@@ -136,13 +155,13 @@
 			 && (q->subproduct != 0xffff)) {
 				if ((vendor == q->subvendor)
 				 && (product == q->subproduct))
-					return q->flags;
+					return q;
 			} else if (q->subvendor != 0xffff) {
 				if (product == q->subproduct)
-					return q->flags;
+					return q;
 			} else {
 				if (vendor == q->subvendor)
-					return q->flags;
+					return q;
 			}
 		}
 	}
@@ -181,6 +200,7 @@
 	bus_space_handle_t ioh;
 	bus_size_t size;
 	uint32_t flags;
+	const struct sdhc_pci_quirk *q;
 
 	sc->sc.sc_dev = self;
 	sc->sc.sc_dmat = pa->pa_dmat;
@@ -192,14 +212,15 @@
 	aprint_naive("\n");
 
 	/* Some controllers needs special treatment. */
-	flags = sdhc_pci_lookup_quirk_flags(pa);
-	if (ISSET(flags, SDHC_PCI_QUIRK_TI_HACK))
-		sdhc_pci_quirk_ti_hack(pa);
-	if (ISSET(flags, SDHC_PCI_QUIRK_FORCE_DMA))
-		SET(sc->sc.sc_flags, SDHC_FLAG_FORCE_DMA);
-	if (ISSET(flags, SDHC_PCI_QUIRK_NO_PWR0))
-		SET(sc->sc.sc_flags, SDHC_FLAG_NO_PWR0);
-
+	if ((q = sdhc_pci_lookup_quirk_flags(pa)) != NULL) {
+		flags = q->flags;
+		if (ISSET(flags, SDHC_PCI_QUIRK_TI_HACK))
+			sdhc_pci_quirk_ti_hack(pa, q);
+		if (ISSET(flags, SDHC_PCI_QUIRK_FORCE_DMA))
+			SET(sc->sc.sc_flags, SDHC_FLAG_FORCE_DMA);
+		if (ISSET(flags, SDHC_PCI_QUIRK_NO_PWR0))
+			SET(sc->sc.sc_flags, SDHC_FLAG_NO_PWR0);
+	}
 	/*
 	 * Map and attach all hosts supported by the host controller.
 	 */
@@ -277,16 +298,18 @@
 #define  MMC_SD_DIS			0x02
 
 static void
-sdhc_pci_quirk_ti_hack(struct pci_attach_args *pa)
+sdhc_pci_quirk_ti_hack(struct pci_attach_args *pa,
+    const struct sdhc_pci_quirk *q)
 {
 	pci_chipset_tag_t pc = pa->pa_pc;
 	pcitag_t tag;
 	pcireg_t id, reg;
 
-	/* Look at func 3 for the flash device */
-	tag = pci_make_tag(pc, pa->pa_bus, pa->pa_device, 3);
+	/* Look at function for the flash device */
+	tag = pci_make_tag(pc, pa->pa_bus, pa->pa_device,
+	    q->flash_controller_function);
 	id = pci_conf_read(pc, tag, PCI_ID_REG);
-	if (PCI_PRODUCT(id) != PCI_PRODUCT_TI_PCI7XX1_FLASH)
+	if (PCI_PRODUCT(id) != q->flash_controller_product)
 		return;
 
 	/*
これでOK。使えるようになった。
CR85ロガー計画続き。
テスト用につなげようとしているH8/3664はSCIが1チャネルしかないので、MMC カード用には使えない(ホストとの通信に使うので)。I2Cの同期シリアルが使え る。しかしI2Cはクロックとデータの2線のみ。MMCカードは3線。
H8/3664は5V駆動だけれど、I2CピンSDAとSCLはN-MOSオープンドレインなので、 3.3Vでプルアップするだけで、SD/MMCインターフェースに合うのでは? オープ ンドレインならSD/MMCのIN/OUTをORしてH8のSDAに継げてもいいし、気合いで R/W切り替えてなんとかならないかな? という目論見の元、ブレッドボードに 3.3Vの供給をして、配線してみました。プルアップは50kΩ。これは仕様で指定 されている下限。