第12章 その他のデバイスドライバ仕様

12.1. GPIOポート

GPIOポートに対応するデバイスノードのパラメータは、以下の通りです。

表12.1 GPIOノード

タイプ

メジャー

番号

マイナー

番号

ノード名

(/dev/xxx)

デバイス名

キャラクタ

デバイス

10185gpioEP93XX_GPIO_PADR
EP93XX_GPIO_PBDR
EP93XX_GPIO_PCDR
EP93XX_GPIO_PDDR
EP93XX_GPIO_PEDR
EP93XX_GPIO_PFDR
EP93XX_GPIO_PGDR
EP93XX_GPIO_PHDR
EP93XX_GPIO_PADDR
EP93XX_GPIO_PBDDR
EP93XX_GPIO_PCDDR
EP93XX_GPIO_PDDDR
EP93XX_GPIO_PEDDR
EP93XX_GPIO_PFDDR
EP93XX_GPIO_PGDDR
EP93XX_GPIO_PHDDR

ioctlを使用してアクセスすることにより、EP9315のGPIOレジスタを直接操作することができます。第3引数には、(カーネルソース)/include/linux/ep93xx_gpio.hに定義されている構造体「struct ep93xx_gpio_ioctl_data」と各マクロを使用します。レジスタの詳細については、Cirrus Logic社EP9315 User's Guideの「Chapter 28 GPIO Interface」を参照してください。

CON4/5の各ピンとレジスタの対応は下記のようになります。

ピン名ポートアドレス
CON4 ピン3PortA:4PADR/PADDR:0x00000010
CON4 ピン4PortA:5PADR/PADDR:0x00000020
CON4 ピン5PortA:6PADR/PADDR:0x00000040
CON4 ピン6PortA:7PADR/PADDR:0x00000080
CON4 ピン7PortB:0PBDR/PBDDR:0x00000001
CON4 ピン8PortB:1PBDR/PBDDR:0x00000002
CON4 ピン9PortB:2PBDR/PBDDR:0x00000004
CON4 ピン10PortB:3PBDR/PBDDR:0x00000008
CON5 ピン1PortD:4PDDR/PDDDR:0x00000010
CON5 ピン2PortD:5PDDR/PDDDR:0x00000020
CON5 ピン3PortD:6PDDR/PDDDR:0x00000040
CON5 ピン4PortD:7PDDR/PDDDR:0x00000080
    ↓データ構造体(実体定義しioctl第3引数にポインタ指定)
struct ep93xx_gpio_ioctl_data {
        __u32 device;   ←レジスタ指定マクロを代入
        __u32 mask;     ←取得・操作するbit位置を指定
        __u32 data;     ←読込/書込データ用変数
};
#define EP93XX_GPIO_IOCTL_BASE 'N'
           ↓コマンド指定マクロ(ioctl第2引数に使用)
#define EP93XX_GPIO_IN _IOWR(EP93XX_GPIO_IOCTL_BASE, 0, struct ep93xx_gpio_ioctl_data)
#define EP93XX_GPIO_OUT _IOW (EP93XX_GPIO_IOCTL_BASE, 1, struct ep93xx_gpio_ioctl_data)
enum {     ↓レジスタ指定マクロ
  EP93XX_GPIO_PADR = 0,
  EP93XX_GPIO_PBDR,
  EP93XX_GPIO_PCDR,
  EP93XX_GPIO_PDDR,
  EP93XX_GPIO_PADDR,
  EP93XX_GPIO_PBDDR,
  EP93XX_GPIO_PCDDR,
  EP93XX_GPIO_PDDDR,
  EP93XX_GPIO_PEDR,
  EP93XX_GPIO_PEDDR,
  EP93XX_GPIO_PFDR,
  EP93XX_GPIO_PFDDR,
  EP93XX_GPIO_PGDR,
  EP93XX_GPIO_PGDDR,
  EP93XX_GPIO_PHDR,
  EP93XX_GPIO_PHDDR,
  EP93XX_GPIO_NUM,
};

図12.1 ep93xx_gpio.hの構造体とマクロ定義


ROOTDIR=../atmark-dist ←環境に合わせ修正が必要

ROMFSDIR = $(ROOTDIR)/romfs
ROMFSINST = $(ROOTDIR)/tools/romfs-inst.sh

UCLINUX_BUILD_USER = 1
include $(ROOTDIR)/.config
include $(ROOTDIR)/config.arch

TARGET = gpio_sample
OBJS = sample.o

CFLAGS += -I$(ROOTDIR)/$(CONFIG_LINUXDIR)/include

all: $(TARGET)

$(TARGET): $(OBJS)
        $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)

clean:
        -rm -f *.o *.elf *.gdb $(TARGET) *~

romfs:
        $(ROMFSINST) /bin/$(TARGET)

%.o: %.c
        $(CC) -c $(CFLAGS) -o $@ $<

図12.2 GPIO操作のサンプルMakefile


#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <asm/types.h>
#include <linux/ep93xx_gpio.h>

int main(int argc, char **argv){
        int fd;
        struct ep93xx_gpio_ioctl_data d;

        // GPIOを読み書き可能でオープン
        fd = open("/dev/gpio", O_RDWR);
        if(fd < 0) {
                fprintf(stderr, "Open error.\n");
                return -1;
        }

        // Port B[0]を入力、[1]を出力に変更
        d.device = EP93XX_GPIO_PBDDR;
        d.mask = 0x00000003;
        d.data = 0x00000002;
        ioctl(fd, EP93XX_GPIO_OUT, &d);

        // Port B[0]の入力値を表示
        d.device = EP93XX_GPIO_PBDR;
        d.mask = 0x00000001;
        ioctl(fd, EP93XX_GPIO_IN, &d);
        printf("Port B[0]: %d\n", (d.data & d.mask));

        // Port B[1]にHighを出力
        d.device = EP93XX_GPIO_PBDR;
        d.mask = 0x00000002;
        d.data = 0x00000002;
        ioctl(fd, EP93XX_GPIO_OUT, &d);

        close(fd);

        return 0;
}

図12.3 GPIO操作のサンプルプログラム(sample.c)


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

リアルタイムクロックに対応するデバイスノードのパラメータは、以下の通りです。

表12.2 リアルタイムクロックノード

タイプ

メジャー

番号

マイナー

番号

ノード名

(/dev/xxx)

デバイス名

キャラクタ

デバイス

10135rtcリアルタイムクロック

12.2.1. リアルタイムクロックの設定

Armadillo-9は、カレンダ時計 (Real Time Clock) が実装されているため、電源をOFF/ONした場合でも日付と時刻が正しく表示されます。詳細については、ハードウェアマニュアルの「6.4.カレンダ時計」を参照してください。

RTCに日時を設定するためには、まずシステムクロックを設定します。その後に、ハードウェアクロック (RTC) をシステムクロックと一致させる手順となります。

  • システムクロックをdateで設定する

    dateコマンドの引数で渡す時刻のフォーマットは[MMDDhhmmCCYY.ss]となります。以下の例では、2000年1月23日4時56分00秒に設定しています。

    [armadillo ~]# date 現在のシステムクロックを表示
    [armadillo ~]# date 012304562000.00
    [armadillo ~]# date
    ※一応dateコマンドでシステムクロックが正しく設定されているか確認する
    
  • システムクロックをmsntpで設定する

    msntpは、SNTPプロトコルを使用してタイムサーバから時刻を取得し、システムクロックを設定するアプリケーションです。

    以下は、SNTPサーバー time.server.comから時刻を取得する例です。

    [armadillo ~]# msntp -r time.server.com
    [armadillo ~]# date
    ※一応dateコマンドでシステムクロックが正しく設定されているか確認する
    
  • RTCを設定する

    [armadillo ~]# hwclock ハードウェアクロックを表示
    [armadillo ~]# hwclock --systohc ハードウェアクロックを設定
    [armadillo ~]# hwclock
    ※一応hwclockコマンドでハードウェアクロックが正しく設定されたか確認する
    

12.3. オンボードフラッシュメモリ

オンボードフラッシュメモリは、Memory Technology Device(MTD)としてリージョン単位で扱われます。オンボードフラッシュメモリのリージョンについては、9章メモリマップについてを参照してください。各リージョンに対応するデバイスノードのパラメータは、以下の通りです。

表12.3 MTDノード

タイプ

メジャー

番号

マイナー

番号

ノード名

(/dev/xxx)

デバイス名

キャラクタ

デバイス

900mtd0bootloader
1mtdr0bootloader (read only)
2mtd1kernel
3mtdr1kernel (read only)
4mtd2userland
5mtdr2userland (read only)
6mtd3config
7mtdr3config (read only)

ブロック

デバイス

310mtdblock0bootloader
1mtdblock1kernel
2mtdblock2userland
3mtdblock3config

12.4. USBホスト

EP9315は、OHCI互換のUSBホスト機能を持っています。いくつかのデバイスについては初期状態のカーネルでドライバを有効化しており、接続するだけで使用できるようになっています。

12.4.1. USB Audio

USBオーディオ機器をサポートします。/dev/dsp(キャラクタデバイス、メジャー番号:14、マイナー番号:3)などから、一般的なサウンドデバイスとして扱うことができます。

12.4.2. USB Storage

USBメモリやディスクドライブ、メモリカードリーダなどをサポートします。Linuxからは一般的なSCSI機器と同様に認識され、/dev/sda(ブロックデバイス、メジャー番号:8、マイナー番号:0)や/dev/sda1(ブロックデバイス、メジャー番号:8、マイナー番号:1)などから扱うことができます。

12.4.3. USB Human Interface Device (HID)

USBキーボードやマウスなど、各種入力機器をサポートします。特にUSBキーボードについては、VGA出力との組み合わせで/dev/tty0としてコンソール入力に使用できます。

12.5. IDEとコンパクトフラッシュ

IDEに接続されたディスクドライブは、/dev/hda(ブロックデバイス、メジャー番号:3、マイナー番号:0)や/dev/hda1(ブロックデバイス、メジャー番号:3、マイナー番号:1)などから扱うことができます。

コンパクトフラッシュソケットに挿入したストレージデバイスは、/dev/hdc (ブロックデバイス、メジャー番号:22、マイナー番号:0)や/dev/hdc1(ブロックデバイス、メジャー番号:22、マイナー番号:1)などから扱うことができます。初期状態のカーネルによるコンパクトフラッシュ認識の場合、コンパクトフラッシュをArmadillo-9動作中に挿入したり、抜いたりすることはできません。活線挿抜を行いたい場合、カーネルによるコンパクトフラッシュの認識を使用せず、PCMCIA-CSを使用してください。

[警告]

カーネル内蔵コンパクトフラッシュドライバは、カーネルコンフィギュレーションの「Device Drivers」→「ATA/ATAPI/MFM/RLL support」→「EP93xx PCMCIA IDE support」により有効化されています。このドライバはPCMCIA-CSと競合するので、PCMCIA-CSを使用する場合は「EP93xx PCMCIA IDE Support」を無効化したカーネルと組み合わせてください。