PCMCIA
#navi(contents-page-name): No such page: LinuxCONTENTS
REFERENCES
PCMCIAは、Personal Computer Memory Card International Association の略。現在は規格として、「PC Card Standard」となったので、"16-bit PC Card" というほうが正しい表現。
PC Card | 16Bit PC Card | メモリカード | SRAMカード | |
リニアフラッシュメモリカード | ||||
マスクROMカード | ||||
I/Oカード | ATAフラッシュ | このカテゴリが多い | ||
ATAHDDカード | ||||
モデムカード | ||||
SCSIカード | ||||
LANカード | ||||
その他 | ||||
CardBusカード | 高速SCSIカード | |||
高速ATAカード | ||||
高速LANカード | ||||
高速シリアル(USB/1394)カード | ||||
その他 | ZVポート用ビデオカード |
LinuxでPCカードを使う為の、カーネルサービス、ドライバ及び、ユーザーレベルユーティリティのパッケージ。最新の安定版は、3.2.8(2004-07-16 release) もうstable?。ドライバは、kernel2.4からカーネルソースに取り込まれている。
state | host state | device state | mode state | description |
---|---|---|---|---|
STATE0 | HIF_POWER_NO_SET | POWER_ACTIVE | MODE未設定 | |
STATE1 | HIF_POWER_NO_SET | POWER_ACTIVE | INFRA未接続 | |
STATE2 | HIF_POWER_NO_SET | POWER_ACTIVE | ADHOC接続 | |
STATE3 | HIF_POWER_ACTIVE_SET | POWER_ACTIVE | INFRA未接続 | |
STATE4 | HIF_POWER_ACTIVE_SET | POWER_ACTIVE | ADHOC接続 | |
STATE5 | HIF_POWER_NO_SET | POWER_ACTIVE | INFRA接続 | |
STATE6 | HIF_POWER_ACTIVE_SET | POWER_ACTIVE | INFRA接続 | |
STATE7 | HIF_POWER_SAVE_SET_REQ | POWER_ACTIVE | INFRA接続 | |
STATE8 | HIF_POWER_SAVE_SET_DONE | POWER_SAVE | INFRA接続 | |
STATE9 | HIF_POWER_SAVE_WAKEUP_REQ | POWER_SAVE | INFRA接続 | |
STATE10 | HIF_POWER_SAVE_WAKEUP_DONE | POWER_ACTIVE | INFRA接続 | |
STATE11 | HIF_POWER_SAVE_WAIT | POWER_ACTIVE | INFRA接続 |
method | description |
---|---|
HIF_POWER_ACTIVE_SET | host<->device |
HIF_POWER_SAVE_SET | host<->device |
HIF_MODE_SET | host<->device |
HIF_DATA_REQ | host->device |
HIF_XXX_REQ(CONF) | host<->device |
HIF_DARA_IND(CONF) | host<-device |
SNOOSE_SET | host->device |
MAC_WAKEUP_REQUEST | host->device |
MAC_WAKEUP_ACK | host<-device |
#graphviz(define, @page@, rankdir=TB; )
#graphviz(dot,small){{ digraph G {
node [shape = "circle",style=filled]; subgraph cluster_0 { "STATE0" [shape = "doublecircle"]; "STATE0" -> "STATE1" [label="HIF_MODE_SET"]; "STATE0" -> "STATE2" [label="HIF_MODE_SET"]; "STATE0" -> "STATE5" [label="HIF_MODE_SET"]; label = "power none"; } subgraph cluster_1 { "STATE4" [shape = "doublecircle"]; "STATE6" [shape = "doublecircle"]; "STATE3" -> "STATE4" [label="HIF_MODE_SET"]; "STATE3" -> "STATE6" [label="HIF_MODE_SET"]; "STATE4" -> "STATE3" [label="HIF_MODE_SET"]; "STATE4" -> "STATE6" [label="HIF_MODE_SET"]; label = "power active"; color=red; } "STATE6" -> "STATE7" [label="HIF_POWER_SAVE_SET"]; "STATE5" -> "STATE7" [label="HIF_POWER_SAVE_SET"];
/* {
rank=same; "STATE7"; cluster_1; }*/ subgraph cluster_2 { "STATE8" [shape = "doublecircle"]; "STATE8" -> "STATE9" [label="hoge"]; "STATE9" -> "STATE10" [label="MAC_WAKEUP_ACK"]; "STATE10" -> "STATE11" [label="HIF_hoge_REQ"]; "STATE11" -> "STATE8" [label="WAIT_TIMEOUT"]; label = "power save"; color=blue; { rank=source; "STATE8"; } } "STATE1" -> "STATE3" [label="HIF_POWER_ACTIVE_SET"]; "STATE2" -> "STATE4" [label="HIF_POWER_ACTIVE_SET"]; "STATE5" -> "STATE6" [label="HIF_POWER_ACTIVE_SET"]; "STATE7" -> "STATE8" [label="SNOOSE_SET"]; "STATE10" -> "STATE6" [label="HIF_POWER_ACTIVE_SET"]; "STATE11" -> "STATE6" [label="HIF_POWER_ACTIVE_SET"];
} }}
いつもお世話になっております。 KSC 浦澤です。 CFカードとSDK(PCMCIA)の最新ファームをお送りします。 ks2916pc.rom --> SDK(PCMCIA) ks2970cf.rom --> CF 今回お送りするものはver1.03です。ver0.26からのバージョンアップによる HOSTif関連の変更は以下のとおりです。 (以前ご質問のノイズレベルの件です。) ・ホストi/fの変更(PHY_INFO、AP_LISTのNoiseエリア追加) - HIF_PHY_INFO_CONF_PRIに noiseエリア追加(BYTE) Tx_rate(LinkSpeed)をWORDからBYTEに変更 -->windowsDriverではすでにこうなっていたかもしれません。 - BssDscr(BSSList)に noise(BYTE)、pad_0(BYTE)を追加 -->重要! 詳しい構造体の情報は添付のhost_if.txtをご覧ください。 また、CFとSDK(PCMCIA)の違いは以下のとおりです。 LEDのON/OFFが逆 - GPIOのLow/Highの扱いがCFとSDK(PCMCIA)で逆になります。 PowerSaveでの起き上がり時間 - ビーコン周期よりどれだけ早く起動するかがCFとSDK(PCMCIA)で異なります。
manfid が前とちがっているじゃないか!ks29xx.confに追加しなければ…
# dump_cis Socket 0: no CIS present Socket 1: dev_info NULL 0ns, 512b vers_1 5.0, "KeyStream Corp.", "KS2970", "", "" manfid 0x005b, 0xf002 funcid network_adapter lan_technology wireless lan_speed 1 mb/sec lan_speed 2 mb/sec lan_speed 5 mb/sec lan_speed 11 mb/sec lan_media 2.4_GHz config base 0x0200 mask 0x027f last_index 0x05 cftable_entry 0x05 [default] Vcc Vmin 3130mV Vmax 3470mV Iavg 300mA Ipeak 300mA Idown 10mA io 0x0000-0x003f [lines=6] [16bit] irq mask 0xffff [level] [pulse]
追加したら、うごいた
+card "KeyStream KS2970 Wireless LAN PC Card" + manfid 0x005b, 0xf002 + bind "ks29xx_cs"
cardmgr[1902]: socket 1: KeyStream KS2970 Wireless LAN PC Card kernel: cs: memory probe 0xa0000000-0xa0ffffff: clean. cardmgr[1902]: executing: 'modprobe ks29xx_cs' kernel: eth1: KeyStream KS2101 wireless. kernel: eth1: index 0x05: Vcc 3.3, irq 11, io 0x0100-0x013f cardmgr[1902]: executing: './network start eth1' kernel: ks29xx: MAC ADDRESS = 12:34:56:29:70:01 kernel: ks29xx: firmware ver. = 2970-PCMCIA-0.26 [Feb 09 2005 14:35:09] /etc/hotplug/net.agent: invoke ifup eth1
一応できた?cheekyのkernel2.6だとOopsが出てるが…。他のマシン&kernel2.4は大丈夫みたい。
kernel2.6でモジュールをインストールすると、no version for "struct_module" found: kernel tainted. とか言われる。大丈夫か?動くから…
ks29xx: MAC ADDRESS = 00:0b:e3:00:00:00 ks29xx: firmware ver. = 2970-PCMCIA-0.26 [Feb 09 2005 14:35:09] Unable to handle kernel NULL pointer dereference at virtual address 00000058 printing eip: c0221cf3 *pde = 00000000 Oops: 0000 [#3] PREEMPT Modules linked in: ks29xx_cs ks29xx ipv6 ds nfsd exportfs lockd su nrpc tsdev mousedev joydev psmouse parport_pc parport evdev pcspkr eth1394 ohci1394 ieee1394 yenta_socket pcmcia_core snd_intel8x0m snd_intel8x0 snd_ac97_codec snd_pcm snd_timer snd_page_alloc gameport snd_mpu401_uart snd_rawmidi snd_seq_device snd shpchp pciehp pci_hotplug pl2303 usbserial intel_agp agpgart ehci_hcd uhci_hcd usbcore i810_audio ac97_codec soundcore nls_iso8859_1 nls_cp437 ide_cd cdrom b44 mii genrtc vfat fat ext3 jbd mbcache ide_generic piix ide_disk ide_core unix CPU: 0 EIP: 0060:[dev_seq_printf_stats+35/240] Not tainted EFLAGS: 00010246 (2.6.8) EIP is at dev_seq_printf_stats+0x23/0xf0 eax: 00000000 ebx: d7ec0000 ecx: d7e17f4c edx: dcc94280 esi: dcc94280 edi: d7ec0000 ebp: 000002b4 esp: d7e17ed4 ds: 007b es: 007b ss: 0068 Process ifconfig (pid: 4077, threadinfo=d7e16000 task=de8e9220) Stack: d7ec0000 c02aa2a0 de395800 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 dcc94280 c0221ddc dcc94280 d7ec0000 Call Trace: [dev_seq_show+28/64] dev_seq_show+0x1c/0x40 [seq_read+443/688] seq_read+0x1bb/0x2b0 [vfs_read+237/352] vfs_read+0xed/0x160 [sys_read+81/128] sys_read+0x51/0x80 [syscall_call+7/11] syscall_call+0x7/0xb Code: 8b 50 58 89 54 24 48 8b 48 44 8b 50 40 01 ca 8b 48 50 01 ca <6>note: ifconfig[4077] exited with preempt_count 1 bad: scheduling while atomic! [schedule+1221/1232] schedule+0x4c5/0x4d0 [unmap_page_range+83/128] unmap_page_range+0x53/0x80 [unmap_vmas+438/464] unmap_vmas+0x1b6/0x1d0 [exit_mmap+133/368] exit_mmap+0x85/0x170 [mmput+101/144] mmput+0x65/0x90 [do_exit+348/1056] do_exit+0x15c/0x420 [do_page_fault+0/1389] do_page_fault+0x0/0x56d [die+249/256] die+0xf9/0x100 [do_page_fault+478/1389] do_page_fault+0x1de/0x56d [proc_read_inode+23/64] proc_read_inode+0x17/0x40 [buffered_rmqueue+245/464] buffered_rmqueue+0xf5/0x1d0 [buffered_rmqueue+245/464] buffered_rmqueue+0xf5/0x1d0 [find_get_page+45/96] find_get_page+0x2d/0x60 [__alloc_pages+784/880] __alloc_pages+0x310/0x370 [vsnprintf+598/1232] vsnprintf+0x256/0x4d0 [do_page_fault+0/1389] do_page_fault+0x0/0x56d [error_code+45/56] error_code+0x2d/0x38 [dev_seq_printf_stats+35/240] dev_seq_printf_stats+0x23/0xf0 [dev_seq_show+28/64] dev_seq_show+0x1c/0x40 [seq_read+443/688] seq_read+0x1bb/0x2b0 [vfs_read+237/352] vfs_read+0xed/0x160 [sys_read+81/128] sys_read+0x51/0x80 [syscall_call+7/11] syscall_call+0x7/0xb
まーとりあえず<Kernel panic>ってのは出てないので、いきなり止まることはない。普通に操作できる。これがでても、ドライバは動く。
なんか出なくなった?みたい…。spinlock初期化してない奴があったので、初期化するようにした(当たり前!)。NULL pointer渡してるじゃん…
KS2970 11b MAC 2970-PCMCIA-0.26 [Feb 09 2005 14:35:09] 2970PC>? ? help D(B/W/D) (start), (end) memory dump W(B/W/D) addr, data memory write R(B/W/D) addr memory read BB[R/W/D/I] Baseband access CH (number) RF ch(1..14) E[R/W/D/CL] (addr), (data) eeprom access HOST Host i/f MAC MAC inf MACADDR mac address MPL pool PHY PHY inf RATE (1/2/5/11) Tx rate SM staion inf TIM timer TX frame tx debug VER version
# ifconfig eth1 eth1 Link encap:Ethernet HWaddr 12:FF:FF:FF:FF:FF BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b) Interrupt:11 Base address:0x100
せっかく新規で書くので、きちんと設計したい。(時間ないけど…) やっぱ設計は大事ですよ。アホな設計のクサレcodeは、読みにくいし修正もしにくい。後々の自分自身の為にもキチンと設計したいね。KSCのドライバの場合、モジュールとして分けるなら、デバイス依存部分(MAC CHIPのI/F)、MAC-HOST I/F Protocol 部分、あと、network_device I/F 部分ってとこかな。愚痴なんですけど、いつもWindowsのNDISドライバとか提供してもらってるのだが、もうちょっと他のOSにポーティングすること、考えて書いてほしいよな…。あんまり参考になんないんだよね。そういう俺も思いっきりCPU依存なCODEを書いていますけど…。少なくともBigEndianなCPUじゃ絶対動かない…。
今回は、KS2101というMACチップを仕様する。I/FはPCMCIA、デバイスとのI/F部分はもちろん、pcmcia-cs のI/Fもこのモジュールに含む。レイヤ的に言えば、最下層
ks2101.h (KS2101のレジスタ定義、チップ固有の定数、マクロ等を定義) ks2101.c (基本的に、デバイスとのデータのやり取りを行う) ks29xx_cs.c (pcmcia-cs 関連のサービス処理)
MACとHOSTの通信仕様部分。デバイスに依存するわけではないので、できるだけ汎用性を持たせて作りたい。11a、11bでも基本的には、あまり変わらない。MACからのデータを解析し、上位にあげたり、MACへ送るデータを作成したりする。レイヤ的には、真ん中。
ks_hostif.h ks_hostif.c
ネットワークデバイスとしての処理を担当。socketからのデータを処理したり、ネットワークデバイスのUP/DOWN、ユーザーアプリケーションI/Fのioctlなんかの処理。レイヤ的には、最上位。
ks29xx_net.c ks29xx_ioctl.h
ks_debug.h (デバッグモジュール) ks_debug.c (デバッグモジュール) ks29xx.h (デバイスに依存しない部分の全体的な定義)
TARGET = ks29xx_cs.o ks29xx.o ks29xx.o: ks2101.o ks29xx_net.o ks29xx_ioctl.o ks_hostif.o ks_debug.o $(LD) -r $^ -o $@
PC card service(cardmgr) にドライバをロードしてもらいたい場合、PCMCIA Card Configuration DataBase file の "/etc/pcmcia/config"に記述しておく。このファイルはadd-on driver用に"/etc/pcmcia/*.conf"も読み込むようになっているので、"/etc/pcmcia/hoge.conf"を作成し設定を記述しておいてもOK。DataBase fileを読み込ませるには、PC card serviceの再起動が必要。
# # PCMCIA Card Configuration Database # for ks29xx_cs # ks29xx.conf # # # Device driver definitions # device "ks29xx_cs" class "network" module "ks29xx_cs" # # Wireless network adapters # card "KeyStream KS2916 Wireless LAN PC Card" manfid 0x005b, 0xf000 bind "ks29xx_cs"
cardmgr[544]: unsupported card in socket 1 cardmgr[544]: product info: "KeyStream Corp.", "KS2101", "", "" cardmgr[544]: manfid: 0x005b, 0xf000 function: 6 (network)
cardmgr[1348]: socket 1: KeyStream KS2916 Wireless LAN PC Card cardmgr[1348]: executing: 'modprobe ks29xx_cs' cardmgr[1348]: + modprobe: Can't locate module ks29xx_cs cardmgr[1348]: modprobe exited with status 255 cardmgr[1348]: module /lib/modules/2.4.20-31.9/pcmcia/ks29xx_cs.o not available cardmgr[1348]: get dev info on socket 1 failed: Resource temporarily unavailable cardmgr[1348]: executing: 'modprobe -r ks29xx_cs' moduleをloadしようとして失敗して止まっている。成功!!。 ちゃんとDataBase file の内容が反映されてます。
Hotplugは、USB,1394,PCI(CardBus)関係の機能なので、PCMCIAじゃ無理? このオプションがカーネルのコードに入ったのは、2.4.23以降。 include/linux/firmware.h lib/firmware_class.c
wireless-toolsは、現在一部の機能しかサポートしていない。(iwconfig) iwconfig iwevent iwgetid iwlist iwpriv iwspy
なんか仕様書読むと、この機能がはいっているみたいだなー。 やっぱサポートしなきゃいけない?よね〜。
CardBusのときは、CardBusデバイスのサポートが2.4以降だったから、 あまり考えなかったが、PCMCIAの場合どうなのでしょ? PCカードのサポートが入ったのはいつ? 2.4からだっけ?じゃ、2.4系と2.6系ってことでいいのかな? いまどき2.2系使ってますとかいう奴は、いないだろ…
ボードインターフェース ・ KS2821/22/30RF モジュール用コネクタ ・ PC カード (34 ピン×4/Sycard 社PCC extend 120 対応)(16bit Slave 接続共用) ・ SD カード(16 ピン/Sycard 社SD extend 300 対応) ・ USB (Type-A コネクタ(メス)) (*2) ・ RS232-C (D-sub 9 ピン/オス)(高速UART) ・ PCM Codec/Stereo Codec インターフェース(I2S インターフェース共用) ・ I2C インターフェース ・ 機能拡張設計用コネクタ(AMP 5-179009-8/160 ピン) (*2) ・ JTAG(20 ピン) ・ 8bit-GPIO ・ KS2101 動作確認用テストピンパッド ・ 電源ON/OFF 確認用LED×3 ・ 各部動作確認用LED×24 ・ 各種設定用スイッチ その他 ・ 5V AC アダプタ電源 (ジャンパ設定によりPC カード、SD カードからの電源供給も可能。(*3)) ・ Flash ROM(4Mbit)搭載 ・ SRAM(4Mbit)搭載 ・ EEPROM(I2S)搭載 ・ USB ドライバIC(OKI ML60842)搭載 (*2) (*2) オプション。詳細はお問い合わせ下さい。 (*3) ホスト側の電源容量にご注意下さい。
# dump_cis Socket 0: no CIS present Socket 1: dev_info NULL 0ns, 512b vers_1 5.0, "KeyStream Corp.", "KS2101", "", "" manfid 0x005b, 0xf000 funcid network_adapter lan_technology wireless lan_speed 1 mb/sec lan_speed 2 mb/sec lan_speed 5 mb/sec lan_speed 11 mb/sec lan_media 2.4_GHz config base 0x0200 mask 0x027f last_index 0x05 cftable_entry 0x05 [default] Vcc Vmin 3130mV Vmax 3470mV Iavg 300mA Ipeak 300mA Idown 10mA io 0x0000-0x003f [lines=6] [16bit] irq mask 0xffff [level] [pulse]
IEEE802.11b対応の BaseBand&MAC チップ。16Bit PC Card I/F のほかに、SDIO I/F も持っている。ARM7内臓。低消費電力。
・ KS2101 BB/MAC (Base Band / Media Access Controller) ARM7TDMITM 搭載 低消費電力 44MHz/22MHz/5.5MHz/1.375MHz/32.768kHz クロック動的切り替え IEEE802.11b 準拠1/2/5.5/11Mbps 対応 IEEE802.11b DSSS 準拠 64bit/128bitWEP、TKIP、AES 対応 Short プリアンブル対応 アンテナダイバーシチ PC カードインターフェース搭載(16bit Slave 接続共用) SD カードインターフェース搭載 高速UART インターフェース搭載 PCM Codec/Stereo Codec インターフェース搭載(I2S インターフェース共用) I2C インターフェース搭載 JTAG インターフェース搭載 8bit-GPIO 搭載 内蔵マスクROM (32kByte) 内蔵SRAM (96kByte)
IEEE802.11b対応の BaseBand&MAC チップ。KS2101と互換はないらしい。これにはSDIOはない。ARM7内臓。低消費電力。
・ KS2022/23/30 RF (2.4GHz RF コンバータ/シンセサイザ) シングルチップ・トランシーバ 高リニアリティー 低雑音指数 低消費電力 リニアゲイン制御スロープ パワーマネージメント/スタンバイモード 2.7〜3.3V 単一電源 パワーアンプ用プリドライバ内蔵 (KS2023) RF VCO 内蔵 (KS2023/30) パワーアンプ内蔵 (KS2030) ダイレクト・ダウンコンバージョン方式 (KS2030)