[Armadillo:02186] Armadillo-9のPC/104アクセスに関して

五十嵐@Freelines email@hidden
2007年 10月 11日 (木) 10:59:10 JST


お世話になります。五十嵐と申します。

先日、首記の件で、当方担当者から、アットマークテクノご担当の方に直接メールで
質問をさせていただきましたが、
ご担当の方のご指摘により、本メーリングリストで、改めて質問をさせていただきます。
長くなってしまいますが、参考のため、これまでの経緯の抜粋を下記します。

【当方担当者より】
>>> 御社から購入したArmadillo−9で、PC/104へアクセスを行った際に
>>> 下記の現象が発生します。
>>> 構成:Armadillo−9、USBマウス、LCDモニタ
>>>    LCDの解像度はXGA、電源は+5Vのみ供給
>>> 現象:PC/104へ連続書込み動作を行うと画面が乱れる。
>>>    連続読み出し動作では画面は正常である。
>>> PC/104ボード(I/Oボード)を接続しても、Armadillo−9単体でも
>>> 同様の現象が発生します。
>>> 別のArmadillo−9に交換しても同様の現象が発生します。

【アットマークテクノご担当様より】
>> お問合わせいただいた液晶モニターの画面の乱れについて、
>> 原因を特定するために、液晶モニタへの出力解像度を下げた(SVGAやVGA)場合の
>> 画面乱れの有無をご確認していただくことは可能でしょうか?
>>
>> VGAやSVGAに出力解像度を下げると画面乱れが発生しなくなる場合は、
>> 画面出力に必要なCPUのバス帯域が不足している可能性がございます。
>> PC/104ボードの書込み時のwait要求が長いものですとそれだけバス占有率が高くなりますので、
>> 連続書込みの方法に変更を加えていただくか、
>> 出力解像度を下げてご使用くださいますようお願いいたします。

【アットマークテクノご担当様より】
> 画面が乱れる時のXGAの色深度は何ビットに設定されておりますでしょうか?
>
> XGA,16ビットカラーの場合、CPUへの負荷がかなり大きくなり、
> 他のデバイスの動作時に画面が乱れることを確認しております。
> Armadillo-9の製品仕様として、
> XGAは8ビットカラーのみの対応とさせていただいておりますのでご確認をお願い
> いたします。
>
> 色深度の変更は、Linuxのカーネルバージョンにより異なりますので、
> 下記ページをご参照ください。
> http://armadillo.atmark-techno.com/howto/set-video-resolution


上記、ご連絡いただいたように、液晶モニタへの出力解像度を SVGA (16ビット?)に
下げると、画面がちらつく現象は発生しなくなりました。

そこで、色深度の変更方法が記載されている、上記ページを参照しながら
  ・解像度 : XGA
  ・色深度 : 8bit
に変更しようとしたのですが、下記「開発環境」に示すように、
カーネル 2.4 系を使用しているのため、Hermit ターミナルから setenv で
色深度設定値の確認、及び変更ができません。

 「開発環境」
  ・kernel      : linux-2.4.31-a9-2.tar.gz
  ・atmark-dist : atmark-dist-20051017.tar.gz


'atmark-dist : menuconfig' を使用して、下記設定値の通りに、色深度の変更を行い、
'make dep all' を実行すると、下記ログに示すように、コンパイルでエラーとなってしまいます。

// [設定値] -----------------------------------------------------
   EP93xx Default Resolution : VGA_60Hz から XGA_60Hz に変更
   EP93xx Max Resolution     : XGA (変更せず)
   EP93xx Color Depth        : 16bpp_565 から 8bpp に変更
// [設定値] -----------------------------------------------------

// [LOG] -----------------------------------------------------
##
## 省略
##
make
CFLAGS="-D__KERNEL__ -I/home/public/Armadillo-Kernel/linux-2.4.31-a9-2/include  -Wall -Wstrict-prototypes -Wno-trigraphs
 -O -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mtune=arm9tdmi
 -malignment-traps -msoft-float -Uarm " -C  arch/arm/common
make[2]: Entering directory `/home/public/Armadillo-Kernel/linux-2.4.31-a9-2/arch/arm/common'
make all_targets
make[3]: Entering directory `/home/public/Armadillo-Kernel/linux-2.4.31-a9-2/arch/arm/common'
make[3]: `all_targets' に対して行うべき事はありません。
make[3]: Leaving directory `/home/public/Armadillo-Kernel/linux-2.4.31-a9-2/arch/arm/common'
make[2]: Leaving directory `/home/public/Armadillo-Kernel/linux-2.4.31-a9-2/arch/arm/common'
arm-linux-ld -p -X -T arch/arm/vmlinux.lds arch/arm/kernel/head-armv.o arch/arm/kernel/init_task.o init/main.o
init/version.o init/do_mounts.o \
        --start-group \
        arch/arm/kernel/kernel.o arch/arm/mm/mm.o arch/arm/mach-ep93xx/ep93xx.o kernel/kernel.o mm/mm.o fs/fs.o
ipc/ipc.o arch/arm/common/nopci.o \
         drivers/char/char.o drivers/serial/serial.o drivers/block/block.o drivers/misc/misc.o drivers/i2c/i2c.o
drivers/net/net.o drivers/ide/idedriver.o drivers/scsi/scsidrv.o drivers/cdrom/driver.o drivers/sound/sounddrivers.o
drivers/mtd/mtdlink.o drivers/net/wireless/wireless_net.o drivers/video/video.o drivers/usb/usbdrv.o
drivers/media/media.o drivers/input/inputdrv.o \
        net/network.o \
        arch/arm/nwfpe/math-emu.o arch/arm/lib/lib.a /home/public/Armadillo-Kernel/linux-2.4.31-a9-2/lib/lib.a \
        --end-group \
        -o vmlinux
drivers/video/video.o(.text+0x5c78): In function `$a':
: undefined reference to `chan_to_field'
drivers/video/video.o(.text+0x5c88): In function `$a':
: undefined reference to `chan_to_field'
drivers/video/video.o(.text+0x5c98): In function `$a':
: undefined reference to `chan_to_field'
make[1]: *** [vmlinux] エラー 1
make[1]: Leaving directory `/home/public/Armadillo-Kernel/linux-2.4.31-a9-2'
make: *** [linux] エラー 1
[email@hidden atmark-dist-20051017]$
// [LOG] -----------------------------------------------------


Color Depth を 16bpp_565 に戻せば、'make dep all' は正常に終了します。
'make menuconfig' で、Color Depth を '8bpp' にすると、コンパイルでエラーになるようです。

これに対して、drivers/video/ep93xxfb.c の以下の箇所に、仮の変更を加えた結果、
コンパイルが正常終了し、出来上がったイメージを書き込んだら、画面のちらつき現象が無くなりました。

// [CODE] -----------------------------------------------------
#if defined(CONFIG_FB_EP93XX_16BPP_565) || \
    defined(CONFIG_FB_EP93XX_24BPP) || defined(CONFIG_FB_EP93XX_32BPP)
static inline u_int
chan_to_field(u_int chan, struct fb_bitfield *bf)
{
        // 省略
}
#endif

static int
ep93xxfb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
                   u_int trans, struct fb_info *info)
{
        // 省略

        switch (info->disp->visual) {
        case FB_VISUAL_TRUECOLOR:
                if (regno < MAX_PALETTE_NUM_ENTRIES) {
#if defined(CONFIG_FB_EP93XX_16BPP_565)
                        u16 *pal;
#else
                        u32 *pal;
#endif
                        pal = info->pseudo_palette;

#if defined(CONFIG_FB_EP93XX_16BPP_565) || \                                            <=====
    defined(CONFIG_FB_EP93XX_24BPP) || defined(CONFIG_FB_EP93XX_32BPP)   <=====
                        val  = chan_to_field(red, &info->var.red);
                        val |= chan_to_field(green, &info->var.green);
                        val |= chan_to_field(blue, &info->var.blue);
#endif                                                                                                       <=====
                        pal[regno] = val;
                }
                break;
        case FB_VISUAL_PSEUDOCOLOR:
                ep93xxfb_palette_write(regno, red, green, blue, trans);
                break;
        }

        return 0;
}
// [CODE] -----------------------------------------------------


将来的には、kernel、atmark-dist の更新を考えておりますが、
上記の開発環境下で、
  ・解像度 : XGA
  ・色深度 : 8bpp
の適切な設定方法、及び、上記カーネルソースの適切な変更方法について、
ご教授いただきたく、お願いいたします。




armadillo メーリングリストの案内