[[FrontPage]] #contents 2014/10/04からのアクセス回数 &counter; [[arm/FM3-uCLinuxの最小構成を試す]] が無事動いたので、GPIOを確かめてみようとしたら、意外にはまりました。 [[インタフェース2014/8月号 汎用軽量OS uClinuxを試す>http://www.kumikomi.net/interface/sample/201408/if08_125.pdf]] では、 「/sysを有効にしてカーネルをビルドすると/sys/class/gpioが作成されます」 とありますが、さにあらずでした! ** GPIOを試す [#bd2203e0] GPIOの追加を試してみます。最後にbusyboxのmakeを試してみます。 FM3固有のファイルは、arch/arm/mach-fm3に納められています。 GPIOのファイルは、 [[インタフェース2014/8月号 汎用軽量OS uClinuxを試す>http://www.kumikomi.net/interface/sample/201408/if08_125.pdf]] によるとgpio.cにあります。 GPIOのソースは、非常にシンプルでした。FM3用のgpio_chip構造体を以下のように宣言し、 fm3_gpio_init関数でgpiochip_addしているだけです。((他の部分は、コピー&ペーストした感じですね。)) #pre{{ static struct gpio_chip fm3_gpio_chip = { .label = "fm3", .direction_input = fm3_gpio_direction_input, .get = fm3_gpio_get_value, .direction_output = fm3_gpio_direction_output, .set = fm3_gpio_set_value, .base = FM3_GPIO_OFF, .ngpio = FM3_GPIO_LEN, .can_sleep = 1, }; void __init fm3_gpio_init(void) { int ret; ret = gpiochip_add(&fm3_gpio_chip); if (ret < 0) pr_err("%s: gpiochip_add failed.(%d)\n", __func__, ret); } }} *** GPIOの組み込み [#v93036e0] make menuconfigのDevice Driversから以下の部分を選択します。 - GPIO Support - GPIO Support→ /sys/class/gpio/... initramfs_lfcq1_min.txtに以下の2行を追加します。 #pre{{ dir /sys 755 0 0 file /etc/fstab initramfs/etc/fstab 755 0 0 }} uImageを作成します。 #pre{{ $ make uImage }} *** LEDチカで動作確認 [#y07fd33e] u-bootのシリアル通信でuImageをアップロードします。 #pre{{ $ sudo picocom --send-cmd "sb -vv" --receive-cmd "rb -vv" -b 115200 /dev/ttyUSB0 FM3> loady 0x60000000 Crtl-A Ctrl-S file: arch/arm/boot/uImage 転送途中経過 Transfer complete *** exit status: 0 Mode[j %5?mode, 5766(SOH)/0(STX)/0(CAN) packets, 5 retries## Total Size = 0x000b4120 = 737568 BytesFM3> bootm 0x60000000 途中省略 Welcome to ____ _ _ / __| ||_| _ _| | | | _ ____ _ _ _ _ | | | | | | || | _ \| | | |\ \/ / | |_| | |__| || | | | | |_| |/ \ | ___\____|_||_|_| |_|\____|\_/\_/ | | |_| Fujitsu FM3/FM4 port. For further information check: http://www.uclinux.org/ / # }} このままでは、/sys以下には何もありません。 #pre{{ / # ls /sys }} どうしてよいか途方に暮れていたら、sysfsを/sysにマウントするいう記事を発見しました。 そこで、 /etc/fstabに以下を追加してsysfsが使えるようになることを確認しました。 ((パチパチ)) #pre{{ sysfs /sys sysfs defaults 0 0 }} sysfs /sysにマウントすると、何と/sys/class/gpioがでました! #pre{{ / # mount -t sysfs /sys / # ls /sys/ /sys/bus/ /sys/dev/ /sys/firmware/ /sys/kernel/ /sys/class/ /sys/devices/ /sys/fs/ /sys/module/ / # ls /sys/class/gpio/ /sys/class/gpio/export /sys/class/gpio/unexport /sys/class/gpio/gpiochip0 }} GPIOピンは、P00からPFFまでを0~255にマッピングしており、 FM3内蔵のLEDは、243になります。 以下のコマンドで基板に付属のLEDを点灯(echo 0で点灯)、消灯することを確認します。 #pre{{ / # echo 243 > /sys/class/gpio/export / # cd /sys/class/gpio/ /sys/class/gpio # ls export gpio243 gpiochip0 unexport /sys/class/gpio # ls gpio243 active_low direction subsystem uevent value /sys/class/gpio # cd gpio243 /sys/devices/virtual/gpio/gpio243 # ls active_low direction subsystem uevent value /sys/devices/virtual/gpio/gpio243 # echo out > direction /sys/devices/virtual/gpio/gpio243 # echo 0 >value /sys/devices/virtual/gpio/gpio243 # echo 1 >value }} &ref(gpio.png); *** 何が必要だったのか? [#rb277e5f] どうして、起動時に/sys, /procが見えないのでしょうか? その原因は、/etc/init.d/rcSに隠されていました。 /etc/init.d/rcSは、シングルユーザモードで起動したときに実行されるスクリプトで、 この先頭で、/procと/sysをmountしていました。 #pre{{ $ cat initramfs/etc/init.d/rcS #!/bin/sh trap "" SIGHUP echo "Mounting proc" mount -t proc none /proc echo "Mounting sysfs" mount -t sysfs sysfs /sys echo "Mounting devpts" mount -t devpts none /dev/pts echo "Setting hostname to uclinux" hostname uclinux 以下省略 }} ** おまけ [#vd3002fc] 本格的なシステムにするには、busyboxのカスタマイズも必要になります。 そこで、busyboxのコンパイルにも挑戦してみました。 *** busyboxのコンパイル [#d7937c76] busybox一つ作るのも大変なのですね! 最新のソースをgitを使ってダウンロードします。 #pre{{ $ git clone git://busybox.net/busybox.git }} - クロスコンパイルの設定 - 一度コンフィグをデフォルトに戻し、menuconfigを実行します。 #pre{{ $ export CROSS_COMPILE=arm-uclinuxeabi- $ make defconfig $ make menuconfig }} build Optionsの以下のオプションをオンにしました。 - Build BUsyBox as a static binary - Force NOMMU build - Add CFLAGS -fomit-frame-pointer -Os -mcpu=cortex-m3 -march=armv7-m -mthumb -Wl,-elf2flt=-s -Wl,-elf2flt=16384 - Add LDFLAGS -lm また、coreutilsのコンフィグで - touchのAdd suport for -hを外す そして、makeを実行します。必ずFile format not recognizedのエラーが出るみたいです。 #pre{{ $ make 途中省略 CC util-linux/volume_id/xfs.o AR util-linux/volume_id/lib.a LINK busybox_unstripped Trying libraries: m Library m is needed, can't exclude it (yet) Final link with: m arm-uclinuxeabi-strip:busybox_unstripped: File format not recognized make: *** [busybox] Error 1 }} initramfsに付属のbusybox_LinuxM3に対して、8倍弱のサイズでした。 #pre{{ $ ls -l initramfs/busybox_LinuxM3 -rwxrwxr-x 1 take take 94428 Sep 27 18:51 initramfs/busybox_LinuxM3 }} #pre{{ $ ls -l busybox_unstripped -rwxr--r-- 1 take take 730524 Oct 3 17:11 busybox_unstripped }} ** 参考文献 [#i4d07689] + [[インタフェース2014/8月号 汎用軽量OS uClinuxを試す>http://www.kumikomi.net/interface/sample/201408/if08_125.pdf]] ** コメント [#ye7be891] #vote(おもしろかった[1],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[2],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。 スパム防止に画像の文字列も入力してください。 - 嬉しくて浮ついていたのかミスが多く、いくつか修正しました。 -- [[竹本 浩]] &new{2014-10-05 (日) 21:25:27}; #comment_kcaptcha