ブログ

Armadillo-X1, Armadillo-IoT G3/G3L: DeviceTreeで指定されているドライバーの場所を調べる方法

at_ito
2017年6月28日 16時54分

Armadillo-X1, Armadillo-IoT G3/G3LでDeviceTreeを作成する際に、各ドライバーのソースコードを確認する必要がある場合があります。本ブログでは、Microchip 製 AD コンバーター(MCP3202)の設定を例に、該当のドライバーの場所を調べる方法について紹介します。

DeviceTreeの記載内容の確認

まずは、Armadillo-X1製品マニュアルの「拡張インターフェースを使う」の「SPI」に記載されているarch/arm/boot/dts/armadillo_x1-ecspi4_mcp3202.dtsファイルの該当部分を確認します。

MCP3202ドライバーに関連する記述は以下のように記載されています。

        mcp3202@0 {
                compatible = "mcp3202";
                spi-max-frequency = <1000000>;
                reg = <0>;
                vref-supply = <&reg_mcp3202_vref>;
        };

上記のcompatibleは、どのドライバーに該当するのかを記述します。「compatible = "mcp3202"」となっているため、mcp3202Noドライバーを指定していることがわかります。

該当ドライバーの検索

前述の方法でmcp3202のドライバーを指定していることがわかりました。以下の例のよう指定した内容を元に、実際のドライバーのソースコードを検索してみます。

~/linux-3.14-x1-at14$ grep -ri mcp3202 drivers/*
drivers/iio/adc/Kconfig:          MCP3001, MCP3002, MCP3004, MCP3008, MCP3201, MCP3202, MCP3204 or
drivers/iio/adc/mcp320x.c: * MCP3202
drivers/iio/adc/mcp320x.c: * http://ww1.microchip.com/downloads/en/DeviceDoc/21034D.pdf  mcp3202
drivers/iio/adc/mcp320x.c:      mcp3202,
drivers/iio/adc/mcp320x.c:      case mcp3202:
drivers/iio/adc/mcp320x.c:      case mcp3202:
drivers/iio/adc/mcp320x.c:static const struct iio_chan_spec mcp3202_channels[] = {
drivers/iio/adc/mcp320x.c:      [mcp3202] = {
drivers/iio/adc/mcp320x.c:              .channels = mcp3202_channels,
drivers/iio/adc/mcp320x.c:              .num_channels = ARRAY_SIZE(mcp3202_channels),
drivers/iio/adc/mcp320x.c:              .compatible = "mcp3202",
drivers/iio/adc/mcp320x.c:              .data = &mcp320x_chip_infos[mcp3202],
drivers/iio/adc/mcp320x.c:      { "mcp3202", mcp3202 },

上記検索結果で、「.compatbile = "mcp3202"」という記述があるdrivers/iio/adc/mcp320x.cというファイルが、mcp3202のドライバーであることがわかります。

具体的にファイルの指定部分を抜き出すと、以下のような記述になっています。

#if defined(CONFIG_OF)
static const struct of_device_id mcp320x_dt_ids[] = {
        {
                .compatible = "mcp3001",
                .data = &mcp320x_chip_infos[mcp3001],
        }, {
                .compatible = "mcp3002",
                .data = &mcp320x_chip_infos[mcp3002],
        }, {
                .compatible = "mcp3004",
                .data = &mcp320x_chip_infos[mcp3004],
        }, {
                .compatible = "mcp3008",
                .data = &mcp320x_chip_infos[mcp3008],
        }, {
                .compatible = "mcp3201",
                .data = &mcp320x_chip_infos[mcp3201],
        }, {
                .compatible = "mcp3202",
                .data = &mcp320x_chip_infos[mcp3202],
        }, {
                .compatible = "mcp3204",
                .data = &mcp320x_chip_infos[mcp3204],
        }, {
                .compatible = "mcp3208",
                .data = &mcp320x_chip_infos[mcp3208],
        }, {
        }
};
MODULE_DEVICE_TABLE(of, mcp320x_dt_ids);
#endif