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