昨日、ついに起動不能となってしまったガレージのWindows2000マシン。どうも
ブートに必要なファイルの部分が物理的に壊れてしまったようだ...。仕方ない
ので、Vistaマシンでデータだけ吸いとりました。このVistaマシン。いつもは
NFSブートでNetBSDが立ちあがっている。それもカメラからのフラッシュを読み
とるだけのために。1年以上前からNetBSDのUSB mass storageはどうもおかしい。
動くけれどたまにIDEの方でパニックするとか、動かないとか。NFSルートで使
う分にはまったく問題ないので、たぶんディスクまわりでなにかおかしいんだ
ろうな...とは思いつつ。
そのVistaマシンをガレージにもっていくこととして、カメラのデータ吸いとり 用マシンをどうしようか... ということで、買って以来、環境整備だけしてまっ たく使ったことのないネットブック、工人舎のSA5ST08Aを使うことにしました。 最近はNetBSDでもsdmmc (SD/MMCコントローラ直結)が使えるようになってみた いだしね。
このマシンのコントローラもTIなので
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Ω。これは仕様で指定 されている下限。

その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Ω。これは仕様で指定 されている下限。

