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 = <®_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]が設定した値以下であれば正常に変更されています。