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 = <®_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