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