ブログ

Armadillo-840: 独自のLCD拡張ボードで映像が表示されない場合

at_takuya.sasaki
2017年1月7日 14時06分

Armadillo-840にLCD用の独自拡張ボードを接続しているが、LCDに何も映らない場合、ソフトウェア観点でチェックすべき箇所を挙げておきます。

1. フレームバッファの指定を間違えていないか?

Armadillo-840はLCDとHDMIの2つのフレームバッファが存在します。 標準カーネルコンフィギュレーションでは、LCDは /dev/fb1 になります。

一番簡単に映像を表示させるならば以下のコマンドで砂嵐画面を表示するのがいいと思います。

[root@armadillo840-0 (ttySC2) ~]# cat /dev/urandom > /dev/fb1

なお、現在利用しているカーネルコンフィギュレーションをチェックするには、以下のコマンドを使います。 ここでは、プライマリーフレームバッファ(/dev/fb0)が、LCDなのかHDMIなのかをチェックしています。

[root@armadillo840-0 (ttySC2) ~]# zcat /proc/config.gz |grep PRIMARY
# CONFIG_ARMADILLO840_PRIMARY_FB_LCDC0 is not set
CONFIG_ARMADILLO840_PRIMARY_FB_LCDC1=y
CONFIG_ARMADILLO840_PRIMARY_FB_LCDC=1

LCDC1が HDMI、LCDC0が LCD になるので、上記の場合は/dev/fb0はHDMIになります。

2. LCDに合わせてパラメータを変更しているか?

採用するLCDに合わせて解像度や各パラメータを変更する必要があります。 具体的には、以下のソースコードになります。

linux-3.4-atxx/arch/arm/mach-shmobile/board-armadillo840.c 
static struct fb_videomode lcdc0_mode{

デフォルトで有効になっているのはArmadillo-840液晶開発セットのLCD(DATAIMAGE/SCF0500)のコンフィギュレーションです。 まずはここを直接変更して試してみるのもいいかと思いますが、きれいに書くならばKconfig.armadillo800に採用するLCD用のコンフィギュレーションを追加しましょう。

3. カーネルコンフィギュレーションで CON7の設定を [Custom] に変えているか?

独自拡張ボードを接続している場合、前章でパラメータを変更しただけでは、不十分です。 カーネルコンフィギュレーションで、CON7に接続している拡張ボードの設定を[ Custom ]に変更する必要があります。 具体的には以下のカーネルコンフィギュレーションです。

Linux/arm 3.4-at16 Kernel Configuration
  System Type  --->
     Armadillo-840 System Configuration  --->
        CON7 extension board (Custom)  --->      ★(LCD)から(Custom)に変更する

もう少し詳細に見てみると、(LCD)を有効にしている場合、以下のソースコードで GPIO_PORT74が Lowでなければ、拡張ボードが未接続と判断してしまいます。

linux-3.4-atxx/arch/arm/mach-shmobile/board-armadillo840.c 
 
static void __init a840_init(void)
{
        r8a7740_pinmux_init();
        r8a7740_meram_workaround();
        r8a7740_sgx540_workaround();
 
        /* if direction of PORT74 is INPUT, PORT74 is detection signal
         * of extention board. if we detect extention board,
         * we register for some platform device and do pinmux.
         * if PORT74 is Low, extension board is connected to armadillo-840. */
        if (IS_ENABLED(CONFIG_ARMADILLO840_CON7EB_LCD)) {
                gpio_request(GPIO_PORT74, NULL);
                gpio_direction_input(GPIO_PORT74);
                con7eb_detected = !gpio_get_value(GPIO_PORT74);
                gpio_free(GPIO_PORT74);
                pr_info("CON7: %s extension board found.\n",
                        con7eb_detected ? "LCD" : "no");
        } else {
                /* this is implementation dependent.
                 *
                 * some extension board does not have the detection signal.
                 * if your extension board has detection signal,
                 * use gpio_get_value() to detect it.
                 * otherwise assign 1 to force detected, or 0. */
                con7eb_detected = 1;
        }

以上