/var/log/messages

Sep 29, 2014 - 2 minute read - Comments - Linux

bcm2708_gpio_probe 手続き

確認できている中での手順としては

  • struct bcm2708_gpio な領域確保
  • platform_get_resource 手続き呼び出し
  • platform_set_drvdata 手続き呼び出し
  • struct bcm2708_gpio オブジェクトの初期設定
  • bcm2708_gpio_irq_init 手続き呼び出し
  • gpiochip_add 手続き呼び出し

となっている模様。丁寧気味に確認してみます。

platform_get_resource 手続き

む、これ引数の struct platform_device オブジェクトは何が渡されるのか。色々確認してみるに probe 手続きの呼び出し元は driver/base/platform.c の platform_drv_probe 手続きらしい。

{% gist c061ed9ee6891aaa6d0b %}

つうかこれ、どこかで見たような気がします。と思ったらやっぱ先日掘削した折にこの手続きに到達しているな。データ構造をおさらいした方が良いかもしれません。

まず、bcm2708_gpio な例で言うと

  • bcm2708_gpio_init から platform_driver_register を呼び出す時に struct platform_driver なオブジェクトが渡されている
  • 設定されている属性は probe, remove, driver.name のみ

で、__platform_driver_register で

  • driver.owner および driver.bus に値が設定される
  • probe, remove, shutdown に値が設定されている場合、driver.{prove, remove, shutdown} に platform_drv_{prove, remove, shutdown} が設定される

のか。ちなみに driver という属性は struct device_driver 型ですね。ので、ここから呼び出される driver_register 手続きには struct device_driver なオブジェクトが渡される形になっています。

ここから経路てきに

  • bus_add_driver (driver/base/bus.c)
  • driver_attach (driver/base/dd.c)
  • bus_for_each_dev (driver/base/bus.c)
  • __driver_attach (driver/base/dd.c)

む、なんだこれ。

{% gist 1758a8030dcbe8deba06 %}

きちんと確認しないとアレかも。ちなみに data は三番目の引数で struct device_driver 型です。next_device って何かな。定義は以下のはず。

{% gist 9277dbb661a3c8cb3384 %}

これ、iterator の next なのか。何のリストで繋がってるんだろうな。まず

  • bus_for_each_dev の呼び出し時に struct device_driver 型の bus 属性を渡している
  • bus 属性の型は struct bus_type な模様
  • bus->p->klist_devices て何?
  • とりあえず klist_iter_init_node の確認必要

struct klist_iter 型の i の初期設定なのか。

{% gist 8a83a95924bbfb3af2d6 %}

ええと、bus->p って

 * @p:		The private data of the driver core, only the driver core can
 *		touch this.

って記述だな。struct subsys_private 型。の klist_devices 属性は以下な記述。

 * @klist_devices - the klist to iterate over the @devices_kset

struct klist 型。つうか、__driver_attach に渡される二つ目の引数の値は bus_for_each_dev に渡される struct device_driver オブジェクトで同一になるのか。

これって同じバスにぶらさがってるデバイスを引っ張ってきて云々してるのかどうか。bus_for_each_dev のコメントが以下になってますね。

 * Iterate over @bus's list of devices, and call @fn for each,
 * passing it @data. If @start is not NULL, we use that device to
 * begin iterating from.

明日以降、引き続き確認の方向にて。

備忘メモ bcm2708_gpio_probe 手続き (2)

comments powered by Disqus