FrontPage

2014/10/04からのアクセス回数 4418

arm/FM3-uCLinuxの最小構成を試す が無事動いたので、GPIOを確かめてみようとしたら、意外にはまりました。 参考文献1 では、 「/sysを有効にしてカーネルをビルドすると/sys/class/gpioが作成されます」 とありますが、さにあらずでした!

GPIOを試す

GPIOの追加を試してみます。最後にbusyboxのmakeを試してみます。

FM3固有のファイルは、arch/arm/mach-fm3に納められています。

GPIOのファイルは、 参考文献1 によるとgpio.cにあります。

GPIOのソースは、非常にシンプルでした。FM3用のgpio_chip構造体を以下のように宣言し、 fm3_gpio_init関数でgpiochip_addしているだけです。*1

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の組み込み

make menuconfigのDevice Driversから以下の部分を選択します。

initramfs_lfcq1_min.txtに以下の1行を追加します。

dir /sys 755 0 0

file /etc/fstab initramfs/etc/fstab 755 0 0

uImageを作成します。

$ make uImage 

LEDチカで動作確認

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以下には何もありません。

/ # ls /sys

どうしてよいか途方に暮れていたら、sysfsを/sysにマウントするいう記事を発見しました。 そこで、 /etc/fstabに以下を追加してsysfsが使えるようになることを確認しました。何と/sys/class/gpioがでました! *2

/ # sysfs /sys sysfs defaults 0 0
/ # mount -t sysfs /sys
/ # 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

以下のコマンドで基板に付属のLEDを点灯(echo 0で点灯)、消灯することを確認します。

/ # 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

gpio.png

何が必要だったのか?

どうして、起動時に/sys, /procが見えないのでしょうか?

その原因は、/etc/init.d/rcSに隠されていました。 /etc/init.d/rcSは、シングルユーザモードで起動したときに実行されるスクリプトで、 この先頭で、/procと/sysをmountしていました。

$ 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

以下省略

おまけ

本格的なシステムにするには、busyboxのカスタマイズも必要になります。 そこで、busyboxのコンパイルにも挑戦してみました。

busyboxのコンパイル

busybox一つ作るのも大変なのですね!

最新のソースをgitを使ってダウンロードします。

$ git clone git://busybox.net/busybox.git
$ export CROSS_COMPILE=arm-uclinuxeabi-
$ make defconfig
$ make menuconfig

build Optionsの以下のオプションをオンにしました。

そして、makeを実行します。必ずFile format not recognizedのエラーが出るみたいです。 (( デフォルトのままだと、1回目に次のエラーがでました。

  CC      coreutils/touch.o
coreutils/touch.c: In function 'touch_main':
coreutils/touch.c:171:21: error: 'lutimes' undeclared (first use in this function)
coreutils/touch.c:171:21: note: each undeclared identifier is reported only once for each function it appears in

menuconfigでcoreutilsのコンフィグでtouchのAdd suport for -hを外す

今度は以下のエラー、buildオプションでForce NOMMU buildをセット。

shell/ash.c:76:3: error: #error "Do not even bother, ash will not run on NOMMU machine"

))

$ 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倍弱のサイズでした。

$ ls -l initramfs/busybox_LinuxM3 
-rwxrwxr-x 1 take take 94428 Sep 27 18:51 initramfs/busybox_LinuxM3

$ ls -l busybox_unstripped
-rwxr--r-- 1 take take 730524 Oct  3 17:11 busybox_unstripped

参考文献

  1. 参考文献1

コメント

選択肢 投票
おもしろかった 0  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。

スパム防止に画像の文字列も入力してください。


(Input image string)

*1 他の部分は、コピー&ペーストした感じですね。
*2 パチパチ

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc