Armadillo-IoT G3/G3L: SDのクロック周波数を制限する方法

Armadillo-IoT ゲートウェイ G3/G3L(以下Armadilloと記載)にて、SDのクロック周波数を制限する方法についてご紹介します。

SDのクロック周波数は、SDホストとSDカードそれぞれが対応するクロック最大値のうち、小さいほうが利用されます。
例として、ArmadilloのSDホストが[200MHz],SDカードが[50MHz]の場合は[50MHz]で通信します。

現在のクロック周波数は、SDカードを挿した後に[/sys/kernel/debug/mmc0/ios]の内容を見ることで確認できます。

[Armadillo]$ cat /sys/kernel/debug/mmc0/ios
mmc0: new high speed SD card at address e624
cat /sys/kernel/debug/mmc0/ios
clock:          50000000 Hz
actual clock:   49090909 Hz
vdd:            21 (3.3 ~ 3.4 V)
bus mode:       2 (push-pull)
chip select:    0 (don't care)
power mode:     2 (on)
bus width:      2 (4 bits)
timing spec:    2 (sd high-speed)
signal voltage: 0 (3.30 V)
driver type:    0 (driver type B)

[clock]が現在の最大クロック周波数、[actual clock]が実クロック周波数です。
このクロック周波数で不都合がある場合、SDのクロック周波数を制限する必要があります。

ここでは、次の環境での設定例を示します。

  • 使用製品はArmadillo-IoT ゲートウェイ G3
  • 使用するSDカードは50Mクロック
  • SDの最大クロックを25Mにしたい

準備

SDのクロック周波数を制限するには、Linuxカーネルのデバイスツリーを編集し、ビルドする必要があります。
アットマークテクノのダウンロードサイトから、Linuxカーネルのビルドに必要な「ソースファイル」を「ATDE」上にダウンロードします。
ダウンロードするソースファイルは以下の通りです。

  • Linuxカーネル[linux-4.9-x1-at3.tar.gz]
  • initramfs アーカイブ[initramfs_x1-v1.1.0.cpio.gz]
[atde]$ ls
linux-4.9-x1-at3.tar.gz    initramfs_x1-v1.1.0.cpio.gz

Linuxカーネルの編集

SDのクロック周波数を制限するため、Linuxカーネルを編集します。 そのために、まずはダウンロードしたlinuxカーネルを解凍します。

[atde]$ tar zxf linux-4.9-x1-at3.tar.gz
[atde]$ cd linux-4.9-x1-at3

解凍したディレクトリに格納されているdtsファイルを編集します。

[atde]:~/linux-4.9-x1-at3$ vi arch/arm/boot/dts/armadillo_iotg_g3.dts

[max-frequency]プロパティに、最大周波数をHz単位で指定することができます。 [max-frequency]プロパティは以下のように追加します。

&usdhc1 {
        pinctrl-names = "default", "state_100mhz", "state_200mhz",
                        "state_power_off";
        pinctrl-0 = <&pinctrl_usdhc1>;
        pinctrl-1 = <&pinctrl_usdhc1_100mhz>;
        pinctrl-2 = <&pinctrl_usdhc1_200mhz>;
        pinctrl-3 = <&pinctrl_usdhc1_power_off>;
        cd-gpios = <&gpio5 0 GPIO_ACTIVE_LOW>;
        wp-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;
        pinctrl-assert-gpios = <&gpio5 4 GPIO_ACTIVE_LOW>,      /* SD1_CMD */
                               <&gpio5 5 GPIO_ACTIVE_LOW>,      /* SD1_DATA0 */
                               <&gpio5 6 GPIO_ACTIVE_LOW>,      /* SD1_DATA1 */
                               <&gpio5 7 GPIO_ACTIVE_LOW>,      /* SD1_DATA2 */
                               <&gpio5 8 GPIO_ACTIVE_LOW>;      /* SD1_DATA3 */
        tuning-step = <2>;
        max-frequency = <25000000>;
        vmmc-supply = <&reg_sd1_vmmc>;
        enable-sdio-wakeup;
        bus-width = <4>;
        keep-power-in-suspend;
        support-clk-limit;
        fsl,no-ddr50-support;
        use-sdio;
        status = "okay";
};

イメージファイルの生成と書き換え

編集内容をArmadilloに適用させるため、イメージファイルの生成と書き換えを行います。
ここでは、[dtb][uImage]の生成と書き換え方法をご紹介します。

本来であれば、生成と書き換えを行う必要があるイメージファイルは[dtb]のみです。
しかし、[dtb]と[uImage]のバージョンが違っている場合、思わぬ不整合が出る可能性があります。
そのため、不安であれば[dtb][uImage]両方を書き換えることをお勧めします。

イメージファイルの生成

イメージファイル生成のため、ソースファイルをビルドします。

[atde]:~/linux-4.9-x1-at3$ ln -s ../initramfs_x1-v1.1.0.cpio.gz initramfs_x1.cpio.gz
[atde]:~/linux-4.9-x1-at3$ make ARCH=arm x1_defconfig
[atde]:~/linux-4.9-x1-at3$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
[atde]:~/linux-4.9-x1-at3$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x80008000 uImage

ビルド後に生成されたイメージファイルを確認し、Armadilloに送信します。
各イメージファイルは以下の場所に生成されています。

  • uImage : linux-4.9-x1-at3/arch/arm/boot/uImage
  • DTB : linux-4.9-x1-at3/arch/arm/boot/dts/armadillo_iotg_g3.dtb

Armadilloのイメージファイル書き換え

生成されたイメージファイルを用いてArmadilloを書き換えます。

[Armadillo]$ ls
armadillo_iotg_g3.dtb    uImage
[Armadillo]$ mount -t vfat /dev/mmcblk2p1 /mnt
[Armadillo]$ cp uImage /mnt/uImage
[Armadillo]$ cp armadillo_iotg_g3.dtb /mnt/armadillo_iotg_g3.dtb
[Armadillo]$ umount /mnt
[Armadillo]$ sync

書き換え完了後、リブートを行います。

[Armadillo]$ reboot

変更したSD 最大クロック周波数の確認

SD 最大クロック周波数が変更されていることを確認するには、本ブログの初めにご紹介した方法同様、SDカードを挿した後に[/sys/kernel/debug/mmc0/ios]の内容を見ることで確認できます。

[Armadillo]$ cat /sys/kernel/debug/mmc0/ios
clock:          25000000 Hz
actual clock:   24545454 Hz
vdd:            21 (3.3 ~ 3.4 V)
bus mode:       2 (push-pull)
chip select:    0 (don't care)
power mode:     2 (on)
bus width:      2 (4 bits)
timing spec:    2 (sd high-speed)
signal voltage: 0 (3.30 V)
driver type:    0 (driver type B)

[actual clock]が設定した値以下であれば正常に変更されています。

製品: 
Armadillo-IoT G3L
Armadillo-IoT G3