ハードウェアを意識したプログラミングの基礎(後編)
platform_match()は,strncmp()でデバイス・ドライバとデバイスのnameメンバ変数の文字列が一致しているかどうかをチェックします.同じだった場合(リスト20),really_probe()に飛びます(リスト21).
194:
195: pr_debug("%s: Matched Device %s with Driver %s\n",
196: drv->bus->name, dev->bus_id, drv->name);
197:
198: ret = really_probe(dev, drv);
100: static int really_probe(struct device *dev, struct device_driver *drv)
101: {
102: int ret = 0;
103:
104: atomic_inc(&probe_count);
105: pr_debug("%s: Probing driver %s with device %s\n",
106: drv->bus->name, drv->name, dev->bus_id);
107: WARN_ON(!list_empty(&dev->devres_head));
108:
109: dev->driver = drv;
110: if (driver_sysfs_add(dev)) {
111: printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
112: __FUNCTION__, dev->bus_id);
113: goto probe_failed;
114: }
115:
116: if (dev->bus->probe) {
117: ret = dev->bus->probe(dev);
118: if (ret)
119: goto probe_failed;
120: } else if (drv->probe) {
121: ret = drv->probe(dev);
122: if (ret)
123: goto probe_failed;
124: }
125:
126: driver_bound(dev);
127: ret = 1;
128: pr_debug("%s: Bound Device %s to Driver %s\n",
129: drv->bus->name, dev->bus_id, drv->name);
130: goto done;
dd.cの109行目で,初めてデバイスにデバイス・ドライバが登録されます.110行目でsysfsへの登録を行います.116行目でbusがprobe関数を持っているかを確認し,あればその関数を使います.しかし,platform busはprobe()を持っていません(リスト22).そのため,120行目でドライバのprobe()が呼び出されます.デバイス・ドライバが正常にデバイスのprobeを行うことができれば,ぶじ登録完了となります.
25: struct device platform_bus = {
26: .bus_id = "platform",
27: };
おわりに
ハードウェアを意識したプログラミングの基礎ということで,Linuxのコードを借りつつ,筆者の若いころの失敗談をネタにしてみました.記事では,たった1行でオシロスコープを取り出したように読めますが,16ビット・アクセスが二つの8ビット・アクセスになっていたことに気が付いたときは,既に空が白んできていました.何度「このCPU,ありえない!」と叫んだことか(^^; ちゃんと命令通りに動いていたCPUよ,ごめんなさい).
ハードウェアとの境界面でのプログラミングは,ソフトウェアの世界で最も下層に位置しています 注5 .そのため,幅の広い知識と経験が必要ですが,個人が一定期間で経験できる量には限りがあります.このギャップを埋めるためにLinuxのコードが大活躍します.オープン・ソースというスタイルで開発された結果,膨大な知識と経験が開発の歴史として蓄積されているLinuxは,まさにエンジニアの宝箱です.
注5;筆者は高林哲氏の「普通のやつらの下を行け」が,大好きである.http://0xcc.net/blog/archives/000066.html
「愚者は経験に学び,賢者は歴史に学ぶ」という言葉を思い出しつつ,これからもこの楽しいプログラミングを満喫したいと思います.皆さんにこの記事を通して楽しさが少しでも伝われば幸いです.
参考・引用*文献 (1)中森 章;TECH I vol.20 マイクロプロセッサ・アーキテクチャ入門,CQ出版,2004年4月.
しょうじ・やすし
(株)アットマークテクノ