クロスケーブルの製作


オプションポート16 に出ているシリアル I/F 相互のクロスケーブルの製作記。

ハードウエア工作である。簡単なことではトップクラス。物理的な工作そのものも単純だが、 オプションポート16 のシリアルの電圧レベルの仕様がどうであれ 自分自身と繋ぐぶんにはレベルコンバータのたぐいは必要ないはずだという点も大きい。 シリアルの実装を調べることすらしなかった。わはは。

CE-PD04

CdmaOne アダプタ内蔵のシャープメビウスをデジタル携帯に繋ぐケーブル。 必要なのはメビウス側のコネクタ部分なので、このアダプタに繋がるケーブルならなんでもいいはずだが、 安全策にふって使用例があるこれを選んだ。100 円。 他にも使えるコネクタにはけっこある (塚本さん家の一覧)。

なお、コネクタ単品でなくこういうケーブルを買ってバラすのは コネクタが市販されていないのでやむなくということもあるが、 それと同時にこのコネクタに合うハーネスと変換基板を手に入れるという意味合いもある。 なので、コネクタが合えばどれでもいいというわけではなく、コネクタ内に仕込む回路サイズとかを考えて選ぶべき ... ではあるんだが、実際そこまでえりごのみしてる余裕はないだろな。

オプションポート16側コネクタ結線表

コネクタピンからケーブルの各線まではほぼ一対一結線になっている。電源供給端子だけが繋がっていない。

No. 名称 ポートの方向 サブコネクタ 線色 備考
1 PWR IN(+)
2 PWR IN(+) 右1 薄ベージュ
3 TxD out 右2 ピンク
4 RxD in 右3
5 RTS out 右4
6 CTS in 右5
7 DSR in 右6
8 Signal GND
9 USB D+ 左1
10 RI in 左2
11 Vcc(3.3V) 下記参照
12 USB D- 左3 オレンジ
13 NC/Reserved
14 DTR out 左6 水色
15 PWR GND
16 PWR GND
FG Frame GND 黒(太) ケーブルのシールドに接続
左4 下記参照
左5 黄緑 下記参照
基板を表(コネクタがのってる側)からみて、コネクタを奥に、ケーブルを手前に置くようにした時↓に右から 1 番 〜 16 番。 サブコネクタはとりあえず右がコネクタ側から 1 〜 6 番、左がケーブル側から 1 〜 6 番とする。
CE-PD04

コネクタの 16 番ピン、サブの左4, 左5 ピンは 3 端子のチップ部品に繋がっている。 テスタで見るかぎり、左4, 左5 ピンから各々 1.5M ohm くらいの抵抗にダイオードいれて 16 番(つまり PWR GND) に接地してある風。コネクタ接続検出用に思えるが、詳細不明。

また、11 番ピンは A300 では NC ということになっているが、 旧ザウルスや C700 では Vcc (3.3V) ということになっている。 実際はどうかというと、A300 でもちゃんと 3.3V 出ていた。

必要なものから蛇足なものまでな註釈。

クロス接続

RTS 〜 CTS、DTR 〜 DSR と繋ぐ。クロス接続の variation は色々あれどザウルスのシリアルに CD が出てないから、 これ以外に結線しようがない。Variation としては RI を RTS に繋ぐくらい。

クロスケーブルを作るには、オプションポート16 側のコネクタは無改造のまま、CdmaOne側のコネクタをぶっちぎり、 別のオプションポートコネクタをつけて内部を以下↓のように結線する。 RTS 〜 RI 間は実際には繋がなかった。

線色 サブコネクタ ケーブル側名称 コネクタ側名称
右2 RxD TxD
ピンク 右3 TxD RxD
右4 CTS RTS
右5 (, 左2) RTS CTS (, RI)
水色 右6 DTR DSR
左6 DSR DTR
SG ランドへ Signal GND Signal GND
シールド FG ランドへ Frame GND Frame GND
接続せず (or 右4) RI (RTS)
薄ベージュ 接続せず PWR IN(+)
接続せず USB D+
オレンジ 接続せず USB D-
接続せず
黄緑 接続せず
結線が右コネクタに集中するあたりが素晴しい(なにが?)。 素晴しすぎたので、右側はサブコネクタの上蓋を破壊して、コネクタ内と外で互い違いに配線している。 ... ぜんぶ内側でもよさげだったが。

inside the connecter
ところで、論理的な詳細はみてないが、output は正論理だが input は負論理とかいった変態な仕様になってねーだろうな? クロス直結で論理的にも正しんだろーな ...

完成写真

というわけで、総額 200 円なり。
Cross cable test scene

これ、もちろん SL-A300 と SL-C750 をシリアルで直結する目的で作った。 Root filesystem 入れ換え途中で reboot した時に外から入るための担保である。 USB LAN (or CF の LAN や IrDA) が繋がるとこまでいけばシリアルも用無しだが、 USB LAN が起動さえしない時点では画面にエラーメッセージすらでない C750 ではデバッグがむちゃくちゃ大変。
はよカーネルソースだしてくれ、シャープさんや

追記

もひとつ追記

stty って、stty ほげほげ < device という書き方が出来るんね ... 知らんかった。
# stty < /dev/ttyS0
speed 9600 baud; line = 0;
-brkint -imaxbel

... ほぇ〜。

ソフトな追記

マジメに制御線を 2 組も繋いだが、A300 にはそのIOポートの仕様書にもかかわらず、DTR、DSR、RI が存在しない。

きちんと書くと、

  1. SL-A300 の CPU である PXA210 には Full function UART がなく、Bluetooth UART と Standard UART のみである。
  2. Full function UART は全ての制御線 (RTS, CTS, DTR, DSR, RI) をもち、230kbps まで。
  3. Bluetooth UART は 1 組の制御線 (RTS, CTS) のみもち、920kbps まで。
  4. Standard UART は制御線をもたず、230kbps まで。
  5. CPU 上の物理アドレスは各々 0x40100000 (FFUART), 0x40200000 (BTUART), 0x40700000 (STUART) から始まる。
  6. SL-A300 の二つのシリアル(IOポートと IrDA) はカーネル空間の 0xf0200000, 0xf0700000 に存在する。
以上によって、SL-A300 のシリアルは Bluetooth UART であり、したがって RTS と CTS しか実装がない。 ... general purpose I/O とか使って補ってる可能性もあるのだが、ソース的にそんなことはしてない、ように見える。 いや、たかが固定アドレスの serial のくせに PCI の auto probe とか入れちゃっててえらい複雑なソース (約 200kB もある。大部分がゴミである) で分からんのよ。
ついでに書けば、IOポートの見掛けの仕様にもかかわらず、携帯ケーブルが出てこないのも CPU 側に実装がないためだと思う。

... と書いていたが、確認した。RTS/CTS 以外の実装はない。 ポートに出ている DTR は常に 0 (3.3V) になっている。電源を切ることで 0 V (つまり 1) に変化させることはできるが。

ところでこのあたり、まともにソース読めなかったんだが、

% diff -u sla300/kernel/drivers/serial_pxa200.c slc700/kernel/drivers/serial_pxa200.c
なる技で読んだ。SL-C7x0 ならば FFUART を使って実装してあるはずの部分を SL-A300 でどう実装してあるかとゆーやつ。 で、なぜか CD が ASIC3_GPIO_PSTS_D & COM_DCDなる位置にあり、 CD による割り込みも受け付けるようになっていることを知る。

GPIO 使ってんのはいいんだが、CD ってポートに出てないし、そのうえ ioctl() では CD は GPIO のでなく UART のを読みにいってんですけど ...。

C7x0 な追記

C7x0 ではシリアルポート (実体は Full function UART である) が APM の支配下にあり、非 open 状態ではクロックが停められている。 ラッチが働かないので Modem Status Register には入力ピン(CTS/DSR/RI) の入力(つーか電圧) が反映されない。 open(/dev/ttyS0) している間のみ正しい値が取り込まれている。 一方、スタティックには動作しているので、出力ピンのほうは正しく動作する。
このあたりは /proc/cpu/register/FFMSR についても同じ。ま、単に register を読んでるだけだから。

したがって使うには CKEN (Clock Enable Register) の対応ビット (CKEN6_FFUART) を 1 にする必要がある。 カーネル内ではシリアルを使うためにおおむね以下の手順をふむ。IrDA も同様。 もちろん userland から使うには単に open すればいい。

xpa210_discovery_serial_power_on();               // B ではドライバ?の電源オン。C ではなにもしない。
if (xpa2X0_is_ff_uart(info->iomem_base)) {        // ポートが FFUART であるか?
    CKEN |= CKEN6_FFUART;                         // FFUART にクロック注入開始。
    if (!change_power_mode(LOCK_FCS_FFUART, 1)){  // APM に FFUART の使用を宣言。
         return -EAGAIN;
    }
}

... つーか、いいかげん別ページに分離しろよ > オレ
つーことで、この件を 塚本さん家のに追加


[日記へ] [目次へ]