Armadilloフォーラム

Armadillo-IoT A6 カーネルサポートデバイス(ドライバina2xx)を利用したい

m.takei

2021年5月24日 14時07分

製品: Armadillo-IoT A6

内容:
初期状態Armadillo-IoT ゲートウェイ A6 のCON3 ピン番号4,6のI2C2から
open("/dev/i2c-4", O_RDWR);
にて動作している電源モニタIC INA226について

カーネルサポートデバイス(ドライバina2xx)で
(armadillo-guide-std-hardware-expansion_ja-1.0.2.pdf)
処理したいのですが

=>run usbbootにて
...
...
Verifying Checksum ... OK
ERROR: Did not find a cmdline Flattened Device Tree
Could not find a valid device tree
で停止します。
以下のような操作を行いましたが何が問題なのでしょうか。
ご教示よろしくお願いいたします。

-------------------------------
atde8上で付録Aから

Device Drivers --->
[*] Hardware Monitoring support --->
[*] Texas Instruments INA219 and compatibles

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x82000000 uImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
/home/iota6/linux-v4.14-at32/arch/arm/boot/uImage
/home/iota6/linux-v4.14-at32/arch/arm/boot/dts/armadillo-iotg-a6-at-dtweb.dtb
を usb /boot/uImage
usb /boot/a640.dtb
として上書きしています。

ビルド時のarmadillo-iotg-a6.dts に
  #include "armadillo-iot-a6-i2c4.dtsi" があり
  armadillo-iot-a6-i2c4.dtsiの内容が以下です。

 --------------------------
  &iomuxc {
pinctrl_i2c4: i2c4grp {
fsl,pins= <
MX6UL_PAD_UART2_TX_DATA__I2C4_SCL 0x40010808
MX6UL_PAD_UART2_RX_DATA__I2C4_SDA 0x40010808
>;
};
};

&i2c4 {
status = "okay";
clock-frequency = <50000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c4>;

ina226@40 {
compatible = "ti,ina226";
reg = <0x40>;
shunt-resistor = <2000>;
};
};
 ------------------------

コメント

at_mitsuhiro.yoshida

2021年5月24日 17時12分

吉田です。

> /home/iota6/linux-v4.14-at32/arch/arm/boot/dts/armadillo-iotg-a6-at-dtweb.dtb
ですが、at-dtweb ではなくご自身で編集されている様ですので、
代わりに
/home/iota6/linux-v4.14-at32/arch/arm/boot/dts/armadillo-iotg-a6.dtb
を使用するとどうなりますでしょうか。

吉田様
お世話になります。

同時に生成された armadillo-iotg-a6.dtb に書き換えたときには
以下のメッセージで停止しました。
ちなみに /home/iota6/linux-v4.14-at32/drivers/hwmon/ina2xx.o
が更新されるのでビルドには含まれているのでしょうか。
よろしくお願いいたします。
----------------------------------
...
...
Verifying Checksum ... OK
## Flattened Device Tree blob at 83000000
Booting using the fdt blob at 0x83000000
Loading Kernel Image ... OK
Loading Device Tree to 9eef9000, end 9ef028f0 ... OK
fdt_find_or_add_subnode: chosen: FDT_ERR_BADSTRUCTURE
ERROR: /chosen node create failed
- must RESET the board to recover.

FDT creation failed! hanging...### ERROR ### Please RESET the board ###
----------------------------------

> 吉田です。
>
> > /home/iota6/linux-v4.14-at32/arch/arm/boot/dts/armadillo-iotg-a6-at-dtweb.dtb
> ですが、at-dtweb ではなくご自身で編集されている様ですので、
> 代わりに
> /home/iota6/linux-v4.14-at32/arch/arm/boot/dts/armadillo-iotg-a6.dtb
> を使用するとどうなりますでしょうか。

at_mitsuhiro.yoshida

2021年5月25日 17時24分

吉田です。

いただいた情報より、
menuconfig で CONFIG_SENSORS_INA2XX を有効にし、

arch/arm/boot/dts/armadillo-iot-a6-i2c4.dtsi を
arch/arm/boot/dts/armadillo-iotg-a6.dts に include した状態で、ビルドし、

出来上がった uImage と armadillo-iotg-a6.dtb で起動することを確認いたしました。

お手数ですが、
USB メモリへの転送方法などを確認いただけますでしょうか。

吉田様
お世話になります。

ご確認ありがとうございます。
作業内容に不足、間違いが無い。
デフォルトから追加ドライバ以外のON/OFF操作も不要。
ということで問題はそれ以外として再度試してみます。

ちなみに動作した場合はドライバはどのようにアクセスできますでしょうか。(open("/dev/...");)

> 吉田です。
>
> いただいた情報より、
> menuconfig で CONFIG_SENSORS_INA2XX を有効にし、
>
> arch/arm/boot/dts/armadillo-iot-a6-i2c4.dtsi を
> arch/arm/boot/dts/armadillo-iotg-a6.dts に include した状態で、ビルドし、
>
> 出来上がった uImage と armadillo-iotg-a6.dtb で起動することを確認いたしました。
>
> お手数ですが、
> USB メモリへの転送方法などを確認いただけますでしょうか。

こんにちは。アットマークテクノの古賀です。

m.takeiさん(2021年5月25日 18時36分):
>ちなみに動作した場合はドライバはどのようにアクセスできますでしょうか。(open("/dev/...");)

kernel.org にあるドキュメントでの説明を見ると、syfs 経由でのアクセスになるようです:
https://www.kernel.org/doc/html/latest/hwmon/ina2xx.html

以上、もし参考になりましたら幸いです。

吉田様
お世話になります。

ご教示ありがとうございます。
INA2XXについて制御コードは移植すれば済むのですが
ドライバがあるならば
システムコールで済むならば
他デバイスのことを踏まえて
それらを試してみたいと考えています。

> こんにちは。アットマークテクノの古賀です。
>
> m.takeiさん(2021年5月25日 18時36分):
> >ちなみに動作した場合はドライバはどのようにアクセスできますでしょうか。(open("/dev/...");)
>
> kernel.org にあるドキュメントでの説明を見ると、syfs 経由でのアクセスになるようです:
> https://www.kernel.org/doc/html/latest/hwmon/ina2xx.html
>
>
> 以上、もし参考になりましたら幸いです。
>

アットマークテクノの古賀です。

m.takeiさん:
>ご教示ありがとうございます。
>INA2XXについて制御コードは移植すれば済むのですが
>ドライバがあるならば
>システムコールで済むならば
>他デバイスのことを踏まえて
>それらを試してみたいと考えています。

>>>ちなみに動作した場合はドライバはどのようにアクセスできますでしょうか。(open("/dev/...");)
>>
>>kernel.org にあるドキュメントでの説明を見ると、syfs 経由でのアクセスになるようです:
>> https://www.kernel.org/doc/html/latest/hwmon/ina2xx.html

INA2XX のドライバは、ソースを見る限り、sysfs なインタフェースのみであり、制御コードを使うインタフェース、つまり open() & ioctl() は提供されていません:
https://elixir.bootlin.com/linux/v4.19.194/source/drivers/hwmon/ina2xx.c

sysfs なインタフェースの場合、使えるシステムコールは、read() と write() のみです。ドライバが、/sysfs ファイルシステムのファイルとして公開する attribute に対して、read() による読み出しと write() による書き込みを行うことで、ユーザランドからデバイスにアクセスする仕組みです。以下のページが、参考になるでしょう:

ドライバに変数を渡すのにうってつけの方法
https://www.atmarkit.co.jp/flinux/rensai/watch2005/watch11b.html

sysfs
https://en.wikipedia.org/wiki/Sysfs
https://man7.org/linux/man-pages/man5/sysfs.5.html

INA2XX ドライバが提供する sysfs インタフェースについては、先のコメントに挙げた
https://www.kernel.org/doc/html/latest/hwmon/ina2xx.html
の説明と、TI のフォーラムの、このスレッドが参考になるかと思います:
https://e2e.ti.com/support/amplifiers-group/amplifiers/f/amplifiers-for…

上のスレッドで書かれているように、
/sys/class/hwmon/hwmon0/name
を cat してチップ名('ina226')が出力されれば、INA2XX ドライバが動作しています。その場合は、たとえば
cat /sys/class/hwmon/hwmon0/curr1_input
とすれば、mA 単位の電流計測値が出力されるでしょう。なお、INA2XX ドライバのソースを見ると、SENSOR_DEVICE_ATTR() マクロの第二引数に渡すモードビット列に S_IWUSR を指定しているのは、shunt_resistor と update_interval のみですから、write() できるのは、この二つの attribute だけです:
https://elixir.bootlin.com/linux/v4.19.194/source/drivers/hwmon/ina2xx…