第9章 Linuxカーネル仕様

本章では、工場出荷状態のArmadillo-400 シリーズ のLinuxカーネル仕様について説明します。

9.1. デフォルトコンフィギュレーション

工場出荷状態のフラッシュメモリに書き込まれているLinuxカーネルイメージには、デフォルトコンフィギュレーションが適用されています。 Armadillo-400 シリーズ用のデフォルトコンフィギュレーションが記載されているファイルは、Linux カーネルソースファイル(linux-3.14-at[version].tar.gz)に含まれるarch/arm/configs/armadillo4x0_defconfigです。

armadillo4x0_defconfigで有効になっている主要な設定を表9.1「Linuxカーネル主要設定」に示します。

表9.1 Linuxカーネル主要設定

コンフィグ説明
NO_HZTickless System (Dynamic Ticks)
HIGH_RES_TIMERSHigh Resolution Timer Support
PREEMPTPreemptible Kernel
AEABIUse the ARM EABI to compile the kernel
COMPACTIONAllow for memory compaction
BINFMT_ELFKernel support for ELF binaries

9.2. デフォルト起動オプション

工場出荷状態のArmadillo-400 シリーズ のLinuxカーネルの起動オプションについて説明します。デフォルト状態では、次のように設定されています。

表9.2 Linuxカーネルのデフォルト起動オプション

起動オプション説明
console=ttymxc1,115200起動ログなどが出力されるイニシャルコンソールにttymxc1を、ボーレートに 115200bps を指定します。
root=/dev/ram0ルートファイルシステムにRAMディスクを指定します。

9.3. Linuxドライバ一覧

Armadillo-400 シリーズで利用することができるデバイスドライバについて説明します。 各ドライバで利用しているソースコードの内主要なファイルのパスや、コンフィギュレーションに必要な情報、及びデバイスファイルなどについて記載します。

9.3.1. Armadillo-400

Armadillo-400 シリーズの初期化手順やハードウェアの構成情報、ピンマルチプレクスの情報などが定義されています。

関連するソースコード

arch/arm/mach-imx/mach-armadillo4x0.c
arch/arm/mach-imx/armadillo4x0_extif.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                                  <ARCH_MXC>
            Freescale i.MX support  --->
              *** MX25 platforms: ***
          [*] Support Armadillo-420 platform                                     <MACH_ARMADILLO420>
                Device options  --->
                Armadillo-400 Board options  --->
                            :

9.3.2. フラッシュメモリ

Armadillo-400 シリーズでは、フラッシュメモリを制御するソフトウェアとして MTD(Memory Technology Device) を利用しています。MTDのキャラクタデバイスまたはブロックデバイスを経由して、ユーザーランドからアクセスすることができます。

関連するソースコード

drivers/mtd/cmdlinepart.c
drivers/mtd/maps/physmap.c
drivers/mtd/mtd_blkdevs.c
drivers/mtd/mtdblock.c
drivers/mtd/mtdchar.c
drivers/mtd/mtdconcat.c
drivers/mtd/mtdcore.c
drivers/mtd/mtdpart.c
drivers/mtd/mtdsuper.c
drivers/mtd/chips/cfi_cmdset_0001.c
drivers/mtd/chips/cfi_probe.c
drivers/mtd/chips/cfi_util.c
drivers/mtd/chips/chipreg.c
drivers/mtd/chips/gen_probe.c

デバイスファイル
デバイスファイルデバイスタイプ対応するパーティション名
/dev/mtd0キャラクタbootloader
/dev/mtd0ro
/dev/flash/bootloader
/dev/flash/nor.bootloader
/dev/mtdblock0ブロック
/dev/mtd1キャラクタkernel
/dev/mtd1ro
/dev/flash/kernel
/dev/flash/nor.kernel
/dev/mtdblock1ブロック
/dev/mtd2キャラクタuserland
/dev/mtd2ro
/dev/flash/userland
/dev/flash/nor.userland
/dev/mtdblock2ブロック
/dev/mtd3キャラクタconfig
/dev/mtd3ro
/dev/flash/config
/dev/flash/nor.config
/dev/mtdblock3ブロック
カーネルコンフィギュレーション
  Device Drivers  --->
      <*> Memory Technology Device (MTD) support  --->                                <MTD>
          <*> Command line partition table parsing                      <MTD_CMDLINE_PARTS>
           [*] Read-only switching user interface support                             <MTD_RO_IF>
          <*> Caching block device access to MTD devices                        <MTD_BLOCK>
              RAM/ROM/Flash chip drivers  --->
              <*> Detect flash chips by Common Flash Interface (CFI) probe        <MTD_CFI>
              <*> Support for Intel/Sharp flash chips                    <MTD_CFI_INTELEXT>
              Mapping drivers for chip access  --->
              <*> Flash device in physical memory map                         <MTD_PHYSMAP>

9.3.3. UART

Armadillo-400 シリーズのシリアルは、i.MX257 の UART(Universal Asynchronous Receiver/Transmitter) を利用しています。

i.MX25 プロセッサは UART1 から UART5 までの 5 つの UART モジュールを内蔵しています。Armadillo-400 シリーズでは、UART2をコンソールとして利用しています。

フォーマット

データビット長: 7 or 8ビット
ストップビット長: 1 or 2ビット
パリティ: 偶数 or 奇数 or なし
フロー制御: CTS/RTS or XON/XOFF or なし
最大ボーレート: 4Mbps

関連するソースコード

drivers/tty/n_tty.c
drivers/tty/tty_buffer.c
drivers/tty/tty_io.c
drivers/tty/tty_ioctl.c
drivers/tty/tty_ldisc.c
drivers/tty/tty_ldsem.c
drivers/tty/tty_mutex.c
drivers/tty/tty_port.c
drivers/tty/serial/serial_core.c
drivers/tty/serial/imx.c

デバイスファイル
シリアルインターフェースデバイスファイル
UART1/dev/ttymxc0
UART2/dev/ttymxc1
UART3/dev/ttymxc2
UART5/dev/ttymxc4
カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                              <ARCH_MXC>
            Freescale i.MX support  --->
              *** MX25 platforms: ***
          [*] Support Armadillo-420 platform                        <MACH_ARMADILLO420>
                Device options  --->
                    -*- Enable UART2 module                        <SERIAL_MXC_SELECT2>
                    -*- Enable UART2 HW Flow Control              <SERIAL_MXC_HW_FLOW2>
                    [*] Enable UART3 module                        <SERIAL_MXC_SELECT3>  1
                    [*] Enable UART3 HW Flow Control              <SERIAL_MXC_HW_FLOW3>  2
                    [*] Enable UART5 module                        <SERIAL_MXC_SELECT5>  3
                    [*] Enable UART5 HW Flow Control              <SERIAL_MXC_HW_FLOW5>  4
                Armadillo-400 Board options  --->
                    [*] Enable UART3 at CON9                  <ARMADILLO4X0_UART3_CON9>  1
                    [*]   Enable UART3 HW flow control at CON9
                                                      <ARMADILLO4X0_UART3_HW_FLOW_CON9>  2
                    [*] Enable UART5 at CON9                  <ARMADILLO4X0_UART5_CON9>  3
                    [*]   Enable UART5 HW flow control at CON9
                                                      <ARMADILLO4X0_UART5_HW_FLOW_CON9>  4
  Device Drivers  --->
      Character devices  --->
          [*] Enable TTY                                                          <TTY>
              Serial drivers  --->
                  <*> IMX serial port support                              <SERIAL_IMX>
                  [*]   Console on IMX serial port                  <SERIAL_IMX_CONSOL>

1

CON9にUART3を割り当てる場合に設定します。デフォルトで有効化されています。

2

CON9のUART3のハードウェアフローコントロールを有効にします。デフォルトで無効化されています。

3

CON9にUART5を割り当てる場合に設定します。デフォルトで有効化されています。

4

CON9のUART5のハードウェアフローコントロールを有効にします。デフォルトで無効化されています。

9.3.4. Ethernet

Armadillo-400 シリーズのEthernet(LAN)は、i.MX257 の FEC(Fast Ethernet Controller)を利用しています。

機能

通信速度: 100Mbps(100BASE-TX), 10Mbps(10BASE-T)
通信モード: Full-Duplex(全二重), Half-Duplex(半二重)
Auto Negotiationサポート
キャリア検知サポート
リンク検出サポート

関連するソースコード

drivers/net/Space.c
drivers/net/loopback.c
drivers/net/mii.c
drivers/net/ethernet/freescale/fec_main.c
drivers/net/ethernet/freescale/fec_ptp.c
drivers/net/phy/mdio_bus.c
drivers/net/phy/phy.c
drivers/net/phy/phy_device.c

ネットワークデバイス

eth0

カーネルコンフィギュレーション
  Device Drivers  --->
      [*] Network device support  --->                                         <NETDEVICES>
          [*]   Ethernet driver support  --->                                    <ETHERNET>
              [*]   Freescale devices                                <NET_VENDOR_FREESCALE>
              <*>     FEC ethernet controller (of ColdFire and some i.MX CPUs)        <FEC>

9.3.5. SDホスト

Armadillo-400 シリーズのSDホストは、i.MX257 の eSDHC(Enhanced Secured Digital Host Controller)を利用しています。

i.MX257はSDホストコントローラを 2個搭載しており、ArmadilloのCON1(SDインターフェース)にeSDHC1が割り当てられています。また、カーネルコンフィギュレーションを変更することにより、CON9にeSDHC2を割り当てる事ができます。

機能

カードタイプ: SD/SDHC/SDXC
バス幅: 4bit
スピードモード: Default Speed(24MHz), High Speed(48MHz)
カードディテクトサポート(CON9のみ)
ライトプロテクトサポート(CON9のみ)

デバイスファイル

メモリカードの場合は、カードを認識した順番で/dev/mmcblkN (Nは'0'からの連番)となります。
I/Oカードの場合は、ファンクションに応じたデバイスファイルとなります。

関連するソースコード

drivers/mmc/card/block.c
drivers/mmc/card/queue.c
drivers/mmc/core/
drivers/mmc/host/sdhci-esdhc-imx.c
drivers/mmc/host/sdhci-pltfm.c
drivers/mmc/host/sdhci.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                            <ARCH_MXC>
            Freescale i.MX support  --->
                [*] Support Armadillo-420 platform                <MACH_ARMADILLO420>
                      Device options  --->
                        [*] Enable eSDHC1                           <MMC_MXC_SELECT1>
                        [*] Enable eSDHC2                           <MMC_MXC_SELECT2>  1
                      Armadillo-400 Board options  --->
                        [*] Enable SDHC2 at CON9            <ARMADILLO4X0_SDHC2_CON9>  1
                        [*]   Enable PWREN for SDHC2 at CON9_1
                                                    <ARMADILLO4X0_SDHC2_PWREN_CON9_1> 1
  Device Drivers  --->
      <*> MMC/SD/SDIO card support  --->                                              <MMC>
          [*]   Additional delay after SDIO reset              <MMC_DELAY_AFTER_SDIO_RESET>
                *** MMC/SD/SDIO Card Drivers ***
          <*>   MMC block device driver                                         <MMC_BLOCK>
          (8)     Number of minors per block device                      <MMC_BLOCK_MINORS>
          [*]     Use bounce buffer for simple hosts                     <MMC_BLOCK_BOUNCE>
                *** MMC/SD/SDIO Host Controller Drivers ***
          <*>   Secure Digital Host Controller Interface support                <MMC_SDHCI>
          <*>   SDHCI platform and OF driver helper                       <MMC_SDHCI_PLTFM>
          <*>     SDHCI support for the Freescale eSDHC/uSDHC i.MX controller
                                                                       <MMC_SDHCI_OF_ESDHC>
          [*]       Enforce to use multi-block transfer
                                            <MMC_SDHCI_ESDHC_IMX_FORCE_MULTIBLOCK_TRANSFER>

1

CON9にeSDHC2を割り当てる場合に設定します。デフォルトでは無効化されています。

9.3.6. USBホスト

Armadillo-400 シリーズのUSBホストは、i.MX257 の UTMI-USB-PHY および USBOH(Universal Serial Bus OTG and Host) を利用しています。

Armadillo-400 シリーズでは、USB ホストインターフェース下段のOTGポートおよびUSB ホストインターフェース上段のHOSTポートを利用することができます。

機能

Universal Serial Bus Specification Revision 2.0 準拠
Enhanced Host Controller Interface (EHCI)準拠
転送レート(OTG): USB2.0 High-Speed (480Mbps), Full-Speed (12Mbps), Low-Speed (1.5Mbps)
転送レート(Host): USB2.0 Full-Speed (12Mbps), Low-Speed (1.5Mbps)

デバイスファイル

メモリデバイスの場合は、デバイスを認識した順番で/dev/sdN (Nは'a'からの連番)となります。

関連するソースコード

drivers/usb/chipidea/ci_hdrc_imx.c
drivers/usb/chipidea/ci_hdrc_msm.c
drivers/usb/chipidea/ci_hdrc_zevio.c
drivers/usb/chipidea/core.c
drivers/usb/chipidea/host.c
drivers/usb/chipidea/otg.c
drivers/usb/chipidea/usbmisc_imx.c
drivers/usb/host/ehci-hcd.c
drivers/usb/host/ehci-hub.c
drivers/usb/phy/phy-generic.c

カーネルコンフィギュレーション
  Device Drivers  --->
      [*] USB support  --->                                                   <USB_SUPPORT>
          <*>   Support for Host-side USB                                             <USB>
                  *** USB Host Controller Drivers ***
          <*>     EHCI HCD (USB 2.0) support                                 <USB_EHCI_HCD>
          <*>   ChipIdea Highspeed Dual Role Controller                      <USB_CHIPIDEA>
          [*]     ChipIdea host controller                              <USB_CHIPIDEA_HOST>
                USB Physical Layer drivers  --->
              <*>     NOP USB Transceiver Driver                            <NOP_USB_XCEIV>

9.3.7. リアルタイムクロック

Armadillo-400 シリーズ RTCオプションモジュール、WLANオプションモジュール(AWL13対応)には、リアルタイムクロック(セイコーインスツル社製 S-35390A)が搭載されています。Armadillo-420でリアルタイムクロック機能を使用する場合は、オプションモジュールと組み合わせて使用する必要があります。

リアルタイムクロックはI2Cバスに接続された I2Cスレーブデバイスとして動作します。リアルタイムクロックとI2Cバスとの接続を表9.3「リアルタイムクロック I2Cバス接続」に示します。

機能

アラーム割り込みサポート

デバイスファイル

/dev/rtc
/dev/rtc0

関連するソースコード

drivers/rtc/class.c
drivers/rtc/hctosys.c
drivers/rtc/interface.c
drivers/rtc/rtc-dev.c
drivers/rtc/rtc-lib.c
drivers/rtc/rtc-proc.c
drivers/rtc/rtc-s35390a.c
drivers/rtc/rtc-sysfs.c
drivers/rtc/systohc.c

カーネルコンフィギュレーション
  Device Drivers  --->
      <*> Real Time Clock  --->
          [*]   Set system time from RTC on startup and resume                <RTC_HCTOSYS>
          [*]   Set the RTC time based on NTP synchronization                 <RTC_SYSTOHC>
          (rtc0)  RTC used to set the system time                      <RTC_HCTOSYS_DEVICE>
                *** RTC interfaces ***
          [*]   /sys/class/rtc/rtcN (sysfs)                                <RTC_INTF_SYSFS>
          [*]   /proc/driver/rtc (procfs for rtcN)                          <RTC_INTF_PROC>
          [*]   /dev/rtcN (character devices)                                <RTC_INTF_DEV>
          [*]     RTC UIE emulation on dev interface                <RTC_INTF_DEV_UIE_EMUL>
                *** I2C RTC drivers ***
          <*>   Seiko Instruments S-35390A                                <RTC_DRV_S35390A>

リアルタイムクロックはI2Cバスに接続された I2Cスレーブデバイスとして動作します。リアルタイムクロックとI2Cバスとの接続を表9.3「リアルタイムクロック I2Cバス接続」に示します。

表9.3 リアルタイムクロック I2Cバス接続

RTC搭載ボード/オプションモジュール名I2Cバスアドレス優先順位
Armadillo-400シリーズ RTC オプションモジュールI2C0x301
Armadillo-400シリーズ WLAN オプションモジュール(AWL13対応)I2C0x301

リアルタイムクロックは、デバイスファイルまたはsysfsファイルを使用して操作することができます。デバイスファイルは/dev/rtcN(Nは0から始まる数値)に、sysfsファイルは/sys/class/rtc/rtcN/ディレクトリ以下に作成されます。リアルタイムクロックが一つだけ接続されている場合、/dev/rtc0デバイスファイルまたは/sys/class/rtc/rtc0ディレクトリ以下のsysfsファイルでリアルタイムクロックを操作すことができます。

アラーム割り込みは、sysfs RTCクラスディレクトリ以下のファイルから利用できます。

wakealarmファイルにUNIXエポックからの経過秒数、または先頭に+を付けて現在時刻からの経過秒数を書き込むと、アラーム割り込み発生時刻を指定できます。アラーム割り込み発生時刻を変更するにはwakealarmファイルに"+0"を書き込み、アラーム割り込みのキャンセル後に再設定する必要があります。アラーム割り込みの利用例を次に示します。

[armadillo ~]# cat /proc/interrupts | grep rtc-s35390a 1
 95:          0  gpio-mxc  15  rtc-s35390a
[armadillo ~]# echo +60 > /sys/class/rtc/rtc0/wakealarm 2
[armadillo ~]# cat /sys/class/rtc/rtc0/wakealarm 3
1434522480
[armadillo ~]# cat /sys/class/rtc/rtc0/since_epoch 4
1434522481
[armadillo ~]# cat /proc/interrupts | grep rtc-s35390a 5
 95:          1  gpio-mxc  15  rtc-s35390a

1

アラーム割り込みの発生回数を確認します。この例では0回です。

2

アラーム割り込みの発生時刻を60秒後に設定します。秒単位は切り捨てられるため、アラーム発生時刻は厳密に60秒後とならない点に注意してください。

3

アラーム割り込みの発生時刻(UNIXエポックからの経過秒数)を確認します。この例では1434522480秒です。

4

現在時刻(UNIXエポックからの経過秒数)を確認します。アラーム割り込みの発生時刻を超えるまで待ちます。

5

再度アラーム割り込みの発生回数を確認します。1増えているのでアラーム割り込みが発生したことを確認できます。

[注記]

デバイスファイル(/dev/rtc0)経由でもアラーム割り込みを利用することができます。サンプルプログラムなどのより詳細な情報については、Linuxカーネルのソースコードに含まれているドキュメント(Documentation/rtc.txt)を参照してください。

[ティップ]

dateコマンドを利用して、UNIXエポックからの経過秒数を日時に変換することができます。

[armadillo ~]# date --date=@`cat /sys/class/rtc/rtc0/since_epoch`
Wed Jun 17 15:29:30 JST 2015

9.3.8. LED

Armadillo-400 シリーズに搭載されているソフトウェア制御可能なLEDには、GPIOが接続されています。Linuxでは、GPIO接続用LEDドライバ(leds-gpio)で制御することができます。

sysfs LEDクラスディレクトリ

/sys/class/leds/red
/sys/class/leds/green
/sys/class/leds/yellow

関連するソースコード

drivers/leds/led-class.c
drivers/leds/led-core.c
drivers/leds/led-triggers.c
drivers/leds/leds-gpio-register.c
drivers/leds/leds-gpio.c
drivers/leds/trigger/ledtrig-default-on.c
drivers/leds/trigger/ledtrig-heartbeat.c
drivers/leds/trigger/ledtrig-timer.c

カーネルコンフィギュレーション
  Device Drivers  --->
      [*] LED Support  --->                                                      <NEW_LEDS>
          <*>   LED Class Support                                              <LEDS_CLASS>
                *** LED drivers ***
          <*>   LED Support for GPIO connected LEDs                             <LEDS_GPIO>
                *** LED Triggers ***
          [*]   LED Trigger support  --->                                   <LEDS_TRIGGERS>
              <*>   LED Timer Trigger                                  <LEDS_TRIGGER_TIMER>
              <*>   LED Heartbeat Trigger                          <LEDS_TRIGGER_HEARTBEAT>
              <*>   LED Default ON Trigger                        <LEDS_TRIGGER_DEFAULT_ON>

Armadillo-400 シリーズのLED は、LED クラスとして実装されており、 LEDクラスディレクトリ以下のファイルによってLEDの制御を行うことができます。LEDクラスディレクトリと各LEDの対応を次に示します。

表9.4 LEDクラスディレクトリとLEDの対応

LEDクラスディレクトリインターフェースデフォルトトリガ
/sys/class/leds/red/ユーザーLED3(赤色)default-on
/sys/class/leds/green/ユーザーLED4(緑色)default-on
/sys/class/leds/yellow/ユーザーLED5(黄色)none

9.3.9. ユーザースイッチ

Armadillo-400 シリーズに搭載されているユーザースイッチには、GPIOが接続されています。GPIOが接続されユーザー空間でイベント(Press/Release)を検出することができます。Linuxでは、GPIO接続用キーボードドライバ(gpio-keys)で制御することができます。

ユーザースイッチには、次に示すキーコードが割り当てられています。

表9.5 キーコード

ユーザースイッチキーコードイベントコード
SW1KEY_128

ユーザースイッチを制御する GPIO接続用キーボードドライバは次の通りです。

表9.6 GPIO接続用キーボードドライバ

ユーザースイッチGPIO接続用キーボードドライバ
SW1gpio-keys

デバイスファイル
ユーザースイッチデバイスファイル
SW1/dev/input/event0[a]

[a] USBデバイスなどを接続してインプットデバイスを追加している場合は、番号が異なる可能性があります

関連するソースコード

drivers/input/evdev.c
drivers/input/ff-core.c
drivers/input/input-compat.c
drivers/input/input-mt.c
drivers/input/input-polldev.c
drivers/input/input.c
drivers/input/keyboard/gpio_keys.c
drivers/input/keyboard/gpio_keys_polled.c

カーネルコンフィギュレーション
  Device Drivers  --->
      Input device support  --->
          -*- Generic input layer (needed for keyboard, mouse, ...)                 <INPUT>
          -*-   Matrix keymap support library                               <INPUT_MATRIXKMAP>
                *** Userland interfaces ***
          <*>   Event interface                                               <INPUT_EVDEV>
                *** Input Device Drivers ***
          [*]   Keyboards  --->                                            <INPUT_KEYBOARD>
              <*>   GPIO Buttons                                            <KEYBOARD_GPIO>
              <*>   IMX keypad support                                       <KEYBOARD_IMX>

9.3.10. I2C

I2Cインターフェースは、i.MX257 の I2C(Inter IC Module) を利用します。 i.MX25 プロセッサは I2C1 から I2C3 までの 3 つの I2C モジュールを内蔵しています。 Armadillo-400 シリーズでは、I2C1 はボード内蔵バスとして使用し、I2C2 は CON14 に割り当てています。

また、GPIOを利用したI2Cバスドライバ(i2c-gpio)を利用することで、I2Cバスを追加することができます。

標準状態で、CONFIG_I2C_CHARDEVが有効となっているためユーザードライバでI2Cデバイスを制御することができます。

機能

最大転送レート: 400kbps (I2C1, I2C2)

デバイスファイル

/dev/i2c-0 (I2C1)
/dev/i2c-1 (I2C2)

関連するソースコード

drivers/i2c/i2c-boardinfo.c
drivers/i2c/i2c-core.c
drivers/i2c/i2c-dev.c
drivers/i2c/algos/i2c-algo-bit.c
drivers/i2c/busses/i2c-gpio.c
drivers/i2c/busses/i2c-imx.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                                  <ARCH_MXC>
            Freescale i.MX support  --->
              *** MX25 platforms: ***
          [*] Support Armadillo-420 platform                              <MACH_ARMADILLO420>
                Device options  --->
                    -*- Enable I2C1 module                                <I2C_MXC_SELECT1>
                    -*- Enable I2C2 module                                <I2C_MXC_SELECT2>
                Armadillo-400 Board options  --->
                    [*] Enable I2C2 at CON14                      <ARMADILLO4X0_I2C2_CON14>
  Device Drivers  --->
      <*> I2C support  --->                                                           <I2C>
          <*>   I2C device interface                                          <I2C_CHARDEV>
          [*]   Autoselect pertinent helper modules                       <I2C_HELPER_AUTO>
                I2C Hardware Bus support  --->
              <*> GPIO-based bitbanging I2C                                      <I2C_GPIO>
              <*> IMX I2C interface                                               <I2C_MXC>

I2C バスにスレーブデバイスを接続し、それを使用可能にするためには、スレーブデバイスに対応したドライバを有効にする必要があります。 また、struct i2c_board_info を適切に設定しなければいけません。 Armadillo-400シリーズでは、linux-3.14-at/arch/arm/mach-imx/armadillo4x0_extif.cのarmadillo4x0_i2cN配列(Nはバスに対応した数値)に記述してください。

static struct i2c_board_info armadillo4x0_i2c1[] = {
	{
		I2C_BOARD_INFO("s35390a", 0x30),
	},
};

図9.1 I2C i2c_board_infoの設定


標準では、I2C1バスの通信速度は40kbpsに設定されています。通信速度は、armadillo4x0_extif.c の以下の場所で設定されています。

static const struct imxi2c_platform_data mx25_i2c1_data __initconst = {
	.bitrate = 40000,
};

図9.2 I2C通信速度の設定


9.3.11. SPI

SPIインターフェースは、i.MX257 の CSPI(Configurable Serial Peripheral Interface)を利用します。Armadillo-400シリーズはカーネルコンフィギュレーションにより、CSP1 及び CSPI3 を CON9に割り当てる事が可能です。

標準状態では無効になっている CONFIG_SPI_SPIDEV を有効化すると、ユーザードライバでSPIデバイスを制御することができます。

機能

SPIマスターモード
複数スレーブセレクト
最大通信速度 約16Mbps

関連するソースコード

drivers/spi/spi-bitbang.c
drivers/spi/spi-imx.c
drivers/spi/spi.c
drivers/spi/spidev.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                               <ARCH_MXC>
            Freescale i.MX support  --->
                [*] Support Armadillo-420 platform                   <MACH_ARMADILLO420>
                      Device options  --->
                        [*] Enable SPI1 module                         <SPI_MXC_SELECT1>  1
                        [*] Enable SPI3 module                         <SPI_MXC_SELECT3>  2
                      Armadillo-400 Board options  --->
                        [ ] Enable UART3 at CON9               <ARMADILLO4X0_UART3_CON9>  1
                        [ ] Enable UART5 at CON9               <ARMADILLO4X0_UART5_CON9>  2
                        [*] Enable SPI1 at CON9                 <ARMADILLO4X0_SPI1_CON9>  1
                        [*]   Enable SPI1_SS0 at CON9_25 <ARMADILLO4X0_SPI1_SS0_CON9_25>  1
                        [*]   Enable SPI1_SS1 at CON9_11 <ARMADILLO4X0_SPI1_SS1_CON9_11>  1
                        [*] Enable SPI3 at CON9                 <ARMADILLO4X0_SPI3_CON9>  2
                        [*]   Enable SPI3_SS0 at CON9_16 <ARMADILLO4X0_SPI3_SS0_CON9_16>  2
                        [*]   Enable SPI3_SS1 at CON9_18 <ARMADILLO4X0_SPI3_SS1_CON9_18>  2
                        [*]   Enable SPI3_SS2 at CON9_15 <ARMADILLO4X0_SPI3_SS2_CON9_15>  2
                        [*]   Enable SPI3_SS3 at CON9_17 <ARMADILLO4X0_SPI3_SS3_CON9_17>  2
  Device Drivers  --->
      [*] SPI support  --->                                                       <SPI>  3
                *** SPI Master Controller Drivers ***
          -*-   Utilities for Bitbanging SPI masters                      <SPI_BITBANG>  3
          <*>   Freescale i.MX SPI controllers                                <SPI_MXC>  3
                *** SPI Protocol Masters ***
          < >   User mode SPI device driver support                        <SPI_SPIDEV>

1

CON9にSPI1を割り当てる場合に設定します。デフォルトでは無効化されています。

2

CON9にSPI3を割り当てる場合に設定します。デフォルトでは無効化されています。

3

SPIを有効化する場合に設定します。デフォルトでは無効化されています。

SPI マスタードライバーとスレーブデバイスのドライバーを有効にする必要があります。また、struct spi_board_info を適切に設定しなければいけません。struct spi_board_infoはlinux-3.[version]/arch/arm/mach-imx/armadillo4x0_extif.cのarmadillo4x0_spiN_board_info (Nはバスに対応した数値)に記述してください。SPIバスの通信速度は、それぞれのスレーブデバイスごとに設定します。

SPIのハードウェア、バスナンバー、struct spi_board_infoの対応は次に示す通りです。

ハードウェアバスナンバーstruct spi_bord_info名
CSPI10armadillo4x0_spi0_board_info
CSPI32armadillo4x0_spi2_board_info

9.3.12. ウォッチドッグタイマー

Armadillo-400 シリーズのウォッチドッグタイマーは、i.MX257 の WDOG(Watchdog Timer) を利用します。

ウォッチドッグタイマーは、Hermit-Atブートローダーによって有効化されます。標準状態でタイムアウト時間は10秒に設定されます。Linuxカーネルでは、ウォッチドッグタイマードライバの初期化時に、このタイムアウト時間を上書きします。標準状態のタイムアウト時間は10秒です。カーネルタイマーを利用して定期的にウォッチドッグタイマーをキックします。

何らかの要因でウォッチドッグタイマーのキックができなくなりタイムアウトすると、システムリセットが発生します。

関連するソースコード

drivers/watchdog/imx2_wdt.c

カーネルコンフィギュレーション
  Device Drivers  --->
      [*] Watchdog Timer Support  --->                                           <WATCHDOG>
          <*>   IMX2+ Watchdog                                                   <IMX2_WDT>
[警告]

i.MX257 の WDOG は、一度有効化すると無効化することができません。そのため、haltコマンドなどを実行してLinux カーネルを停止した場合は、ウォッチドッグタイマーのキックができなくなるためシステムリセットが発生します。

WDOGドライバーの終了処理では、タイムアウト時間をWDOGの最大値である128秒に設定します。

9.3.13. 1-wire

Armadillo-400シリーズは、CON9_2とCON9_26を1-wireマスターとして使用する事ができます。CON9_2は i.MX257 の 1-wire(1-wire Module) を利用し、CON9_26はGPIO 1-wireドライバーを用いて機能を実現しています。

デフォルト状態では、1-wire を利用することができません。1-wire を利用するためには、カーネルコンフィギュレーションを行い 1-wire マスタードライバーと 接続するスレーブデバイスのドライバーを有効にする必要があります。

関連するソースコード

drivers/w1/masters/mxc_w1.c
drivers/w1/w1.c
drivers/w1/w1_int.c
drivers/w1/w1_family.c
drivers/w1/w1_netlink.c
drivers/w1/w1_io.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                            <ARCH_MXC>
            Freescale i.MX support  --->
                [*] Support Armadillo-420 platform                <MACH_ARMADILLO420>
                      Device options  --->
                        [*] Enable MX25 1-Wire module                <W1_MXC_SELECT1>  1
                        [*] Enable GPIO 1-Wire module               <W1_GPIO_SELECT1>  2
                      Armadillo-400 Board options  --->
                        [*] Enable one wire at CON9_2        <ARMADILLO4X0_W1_CON9_2>  1
                        [*] Enable one wire at CON9_26      <ARMADILLO4X0_W1_CON9_26>  2
  Device Drivers  --->
      <*> Dallas's 1-wire support  --->                                          <W1> 12
            1-wire Bus Masters  --->
                <*> Freescale MXC 1-wire busmaster                    <W1_MASTER_MXC> 1
                <*> GPIO 1-wire busmaster                            <W1_MASTER_GPIO> 2

1

CON9_2を1-wireとして使用する場合に設定します。デフォルトでは無効化されています。

2

CON9_26を1-wireとして使用する場合に設定します。デフォルトでは無効化されています。

    

9.3.14. PWM

Armadillo-400 シリーズの PWM は、i.MX257 の PWM(Pulse-Width Modulator) を利用します。

カーネルコンフィギュレーションを変更することにより、PWM2をCON9_25に、PWM4をCON14_3に割り当てる事ができます。

関連するソースコード

drivers/pwm/core.c
drivers/pwm/pwm-imx.c
drivers/pwm/sysfs.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                            <ARCH_MXC>
            Freescale i.MX support  --->
                [*] Support Armadillo-420 platform                <MACH_ARMADILLO420>
                      Device options  --->
                        [*] Enable PWM2                             <MXC_PWM_SELECT2>  1
                        [*] Enable PWM4                             <MXC_PWM_SELECT4>  2
                      Armadillo-400 Board options  --->
                        [ ] Enable I2C2 at CON14            <ARMADILLO4X0_I2C2_CON14>  2
                        [*] Enable PWM2 at CON9_25        <ARMADILLO4X0_PWM2_CON9_25>  1
                        [*] Enable PWM4 at CON14_3        <ARMADILLO4X0_PWM4_CON14_3>  2
  Device Drivers  --->
      [*] Pulse-Width Modulation (PWM) Support  --->                            <PWM>
          <*>   i.MX PWM support                                            <PWM_IMX>

1

CON9_25をPWM2として使用する場合に設定します。デフォルトでは無効化されています。

2

CON14_3をPWM4として使用する場合に有効化します。デフォルトでは無効化されています。

ARMADILLO4X0_PWM4_CON14_3 は、ARMADILLO4X0_I2C2_CON14 を無効化しなければ、有効化できません。

PWM機能は使用する前にexportする必要があります。exportするためには、/sys/class/pwm/pwmchipN/exportに0を書き込みます。exportすると/sys/class/pwm/pwmchipN/pwm0が生成されます。

[armadillo ~]# echo 0 > /sys/class/pwm/pwmchip0/export

図9.3 pwmchip0をexportする


[ティップ]

/sys/class/pwm/pwmchipN/exportNは、カーネルがPWMを認識した順に連番の値が設定されます。pwmchipNがどこにリンクされているかを調べる事で、i.MX25のどのハードウェアに割当たっているか調べる事ができます。

[armadillo ~]# ls -l /sys/class/pwm/pwmchip0
lrwxrwxrwx    1 root     root             0 Jan  1  1970 /sys/class/pwm/pwmchip0 -> ../../devices/platform/imx27-pwm.1/pwm/pwmchip0/

上記の例では、pwmchip0は、imx27-pwm.1にリンクされています。リンク先のsysfsファイル名と、PWMのハードウェアとの対応は次の通りです。

ハードウェアsysfsファイル名
PWM2 CON9_25imx27-pwm.1
PWM4 CON14_3imx27-pwm.3

PWM機能は、/sys/class/pwm/pwmchipN/pwm0以下のファイルに値を書き込む事で設定変更する事ができます。設定に使用するファイルを、表9.7「PWM sysfs」に示します。

表9.7 PWM sysfs

ファイル名説明

enable

PWMの動作/停止を設定します

1: PWMは動作します。period、duty_cycle、polarityの設定に応じた波形を出力します

0: PWMは停止ます

period

PWMの周期をnsec単位で設定します

設定可能な範囲は、17〜2,147,483,647 (約20nsecから2sec)です

設定変更はenable=0の状態で行います

duty_cycle

PWMのHigh期間(polarity=inversedの場合はLow期間)をnsec単位で設定します

設定可能な範囲は、0 < duty_cycle < period の範囲です

設定変更はenable=0の状態で行います

polarity

PWM波形の極性を設定します

normal: PWM波形は正転状態となります。duty_cycleで指定する時間はHigh期間になります

inversed: PWM波形は反転状態となります。duty_cycleで指定する時間はLow期間になります

設定変更はenable=0の状態で行います


9.3.15. CAN

Armadillo-400シリーズの CAN は、i.MX257 の FlexCAN(Controller Area Network) を利用します。

カーネルコンフィギュレーションを変更する事により、CAN2をCON14に割り当てる事ができます。

関連するソースコード

drivers/net/can/flexcan.c
drivers/net/can/dev.c
net/can/af_can.c
net/can/bcm.c
net/can/gw.c
net/can/proc.c
net/can/raw.c

カーネルコンフィギュレーション
  System Type  --->
      [*] Freescale i.MX family                                             <ARCH_MXC>
            Freescale i.MX support  --->
                [*] Support Armadillo-420 platform                 <MACH_ARMADILLO420>
                      Device options  --->
                        [*] Enable FlexCAN2 module                   <FLEXCAN_SELECT2>  1
                      Armadillo-400 Board options  --->
                        [ ] Enable I2C2 at CON14             <ARMADILLO4X0_I2C2_CON14>  1
                        [*] Enable CAN2 at CON14             <ARMADILLO4X0_CAN2_CON14>  1
  [*] Networking support  --->                                               <NET>
      <*>   CAN bus subsystem support  --->                                      <CAN>  1
          <*>   Raw CAN Protocol (raw access with CAN-ID filtering)          <CAN_RAW>
          <*>   Broadcast Manager CAN Protocol (with content filtering)      <CAN_BCM>
          <*>   CAN Gateway/Router (with netlink configuration)               <CAN_GW>
          CAN Device Drivers  --->
              <*> Platform CAN drivers with Netlink support                  <CAN_DEV>
              [*]   CAN bit-timing calculation                    <CAN_CALC_BITTIMING>
              <*>   Support for Freescale FLEXCAN based chips            <CAN_FLEXCAN>  1

1

CON9にCAN2を割り当てる場合に設定します。デフォルトでは無効化されています。ARMADILLO4X0_CAN2_CON14 は、ARMADILLO4X0_I2C2_CON14 を無効化しなければ、有効化できません。

CANの転送速度の設定にはipコマンドを使用します。iproute2ipコマンドで、通信速度を125kpbsに設定するには、次のコマンドを実行します。

[armadillo ~]# ip link set can0 type can bitrate 125000 loopback off

転送速度が変更されたかどうかは、次のコマンドで表示される bitrate の数値から確認することができます。

[armadillo ~]# ip -s -d link show can0
2: can0: <NOARP,ECHO> mtu 16 qdisc noop state DOWN mode DEFAULT group default qlen 10
    link/can  promiscuity 0
    can state STOPPED (berr-counter tx 0 rx 0) restart-ms 0
          bitrate 125000 sample-point 0.857
          tq 571 prop-seg 5 phase-seg1 6 phase-seg2 2 sjw 1
          flexcan: tseg1 4..16 tseg2 2..8 sjw 1..4 brp 1..256 brp-inc 1
          clock 66500000
          re-started bus-errors arbit-lost error-warn error-pass bus-off
          0          0          0          0          0          0
    RX: bytes  packets  errors  dropped overrun mcast
    0          0        0       0       0       0
    TX: bytes  packets  errors  dropped carrier collsns
    0          0        0       0       0       0
[警告]

Armadillo-400シリーズのユーザーランドに 標準で組み込まれているBusyBoxのipコマンドは、CANの転送速度を設定できません。そのためCAN機能を使用する場合には、ユーザーランドコンフィギュレーションを行い、iproute2を組み込んでおく必要があります。

Userland Configuration
  Network Applications --->
    [*] iproute2                 チェックを入れる