Armadilloフォーラム

SDIO Clcok

murakami-o

2018年9月10日 15時11分

お世話になります。村上と申します。

SDIO Clockの変更は可能でしょうか?
可能な場合、変更方法を教えてください。

以上、よろしくお願いします。

コメント

at_syunya.ohshio

2018年9月11日 17時26分

大塩です。

> お世話になります。村上と申します。
>
> SDIO Clockの変更は可能でしょうか?
> 可能な場合、変更方法を教えてください。
>
> 以上、よろしくお願いします。

最大クロック値を変更することは可能です。
Linuxカーネルのソースファイル内[arch/arm/boot/dts/armadillo_iotg_g3.dts]に最大クロック値を書き加えることで変更できます。

以下、最大クロック値を100Mに変更した例になります。

&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 = <100000000>;
         vmmc-supply = <&reg_sd1_vmmc>;
         enable-sdio-wakeup;
         bus-width = <4>;
         keep-power-in-suspend;
         support-clk-limit;
         fsl,no-ddr50-support;
         status = "okay";
 };

大塩様
お世話になります。

>
> 最大クロック値を変更することは可能です。
> Linuxカーネルのソースファイル内[arch/arm/boot/dts/armadillo_iotg_g3.dts]に最大クロック値を書き加えることで変更できます。
>
> 以下、最大クロック値を100Mに変更した例になります。
>

> &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 = <100000000>;
>          vmmc-supply = <&reg_sd1_vmmc>;
>          enable-sdio-wakeup;
>          bus-width = <4>;
>          keep-power-in-suspend;
>          support-clk-limit;
>          fsl,no-ddr50-support;
>          status = "okay";
>  };
> 

arch/arm/boot/dts/armadillo_iotg_g3.dtsの &usdhc1に追記しました。

max-frequency = <100000000>;

ImageのBuildを行い
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x80008000 uImage

出来上がった、uImageとarmadillo_iotg_g3.dtbでイメージファイルの更新を行いました。
しかし、確認したとこと下記のとおり、clockは100Mになりませんでした。

root@armadillo:~# mmc0: new ultra high speed SDR104 SDIO card at address 0001
root@armadillo:~# cat /sys/kernel/debug/mmc0/ios
clock: 196363636 Hz
actual clock: 196363636 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: 6 (sd uhs SDR104)
signal voltage: 1 (1.80 V)
driver type: 0 (driver type B)

間違っている手順等ありましたら、教えてください。

at_syunya.ohshio

2018年9月12日 18時02分

大塩です。

> arch/arm/boot/dts/armadillo_iotg_g3.dtsの &usdhc1に追記しました。
>
> max-frequency = <100000000>;
>
> ImageのBuildを行い
> make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
> make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- LOADADDR=0x80008000 uImage
>
> 出来上がった、uImageとarmadillo_iotg_g3.dtbでイメージファイルの更新を行いました。
> しかし、確認したとこと下記のとおり、clockは100Mになりませんでした。
>
> root@armadillo:~# mmc0: new ultra high speed SDR104 SDIO card at address 0001
> root@armadillo:~# cat /sys/kernel/debug/mmc0/ios
> clock: 196363636 Hz
> actual clock: 196363636 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: 6 (sd uhs SDR104)
> signal voltage: 1 (1.80 V)
> driver type: 0 (driver type B)
>
> 間違っている手順等ありましたら、教えてください。

こちらで確認を行いました。
結果として、50MクロックのSDカードを10Mクロックに切り替えることができました。
以下に確認した方法を一例として記載しますので、そちらで行った方法と違いがあるかご確認いただけますでしょうか。

------------------------------
・方法
1.ダウンロードサイトからLinuxカーネルのソースファイル[linux-4.9-x1-at2],[initramfs_x1-v1.1.0.cpio.gz]を[ATDE]にダウンロード

2.[linux-4.9-x1-at2]を解凍

[ATDE]$ tar zxf linux-4.9-x1-at2.tar.gz
[ATDE]$ cd linux-4.9-x1-at2

3.arch/arm/boot/dts/armadillo_iotg_g3.dtsを編集
編集内容は以下の通り。(今回は例として最大クロック値を10Mに設定)

&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 = <10000000>;
        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";
};

4.ソースファイルをビルド

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

5.生成されたファイルを確認し、これらをArmadillo-IoT G3に送信
uImage : linux-4.9-x1-at2/arch/arm/boot/uImage
DTB : linux-4.9-x1-at2/arch/arm/boot/dts/armadillo_iotg_g3.dtb

6.Armadillo-IoT G3で受け取ったファイルを、マニュアルを参考に書き換え

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

7.Armadilloで[reboot]し、SDカードを挿してクロックを確認

[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)
 
 
10Mに値変更後
mmc0: new high speed SD card at address e624
cat /sys/kernel/debug/mmc0/ios
clock:          10000000 Hz
actual clock:   9818181 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)

------------------------------

以下、参考までにArmadillo-IoT G3 のマニュアルを記載します。

■10.2. Linuxカーネルをビルドする
https://manual.atmark-techno.com/armadillo-iot-g3/armadillo-iotg-g3_pro…

■11.2. 特定のイメージファイルだけを書き換える
https://manual.atmark-techno.com/armadillo-iot-g3/armadillo-iotg-g3_pro…

大塩様

詳細な変更方法ありがとうございます。
無事クロック変更できました。

root@armadillo:~# 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: 6 (sd uhs SDR104)
signal voltage: 1 (1.80 V)
driver type: 0 (driver type B)

前は生成ファイルの更新が上手くできていなかったようです。

以上、ありがとうございました。