Allwinner Tina Linux LCD ディスプレイ デバッグ ガイドは、MIPI DSI RGB LVDS I8080 SPI およびその他のインターフェイスをサポートし、開発ボードは Baiwen.com T113 D1-H Nezha DongshanPI-D1s V853 をサポートします。

画像-20221123145359081
画像-20221123145359081
画像-20221123145359081
画像-20221123145359081
画像-20221123145359081

1。概要

  • 執筆の目的
    この文書では、sunxi プラットフォームの Display Engine モジュールにおける LCD のデバッグ方法を紹介します。
  1. LCDのデバッグ方法とデバッグ方法。
  2. LCDドライバーの書き込み。
  3. lcd0ノード配下の各属性の説明。
  4. 一般的な LCD インターフェイス構成。

適用範囲: sunxi プラットフォーム DE1.0/DE2.0 の LCD 画面パラメータ設定。

2 関連用語の紹介

表 2-1: LCD 関連用語
用語 説明する
孫西市 SoC ハードウェア プラットフォームの Allwinner シリーズ
液晶 液晶表示装置
MIPI モバイル産業用プロセッサー インターフェイス
DSI ディスプレイ シリアル インターフェイス、ディスプレイ シリアル インターフェイス
I8080 インテル 8080LCD インターフェイス
RGB これは、エンコーディングなしで RGB コンポーネントを送信する LCD インターフェイスを指します。
LVDS 低電圧差動シグナリング 低電圧と差動伝送を特徴とする LCD インターフェース

3 ICの仕様

LCDインターフェース関連仕様:

  1. デュアルディスプレイと差分ディスプレイをサポートします。つまり、表示内容が異なっていてもよく、表示解像度が異なっていてもよく、画面インターフェースも異なっていてもよい。

  2. MIPI-DSI インターフェイスをサポートします (数量 1)。サポートされる最大解像度は 1920x1200@60 で、幅と高さは 2048 を超えてはならず、ピクセル クロックは 180MHz を超えてはなりません。

  3. RGB インターフェイスをサポート、数量 2。その中で、メイン ディスプレイはパラレル RGB666 をサポートし、セカンダリ ディスプレイはパラレル RGB888 をサポートし、パラレル RGB インターフェイスは最大解像度 1920x1200@60 をサポートし、幅と高さは 2048 を超えてはなりません。

180MHz を超えないプライム クロックがサポートされます。または 2 つのシリアル RGB インターフェイス、シリアル RGB の最大解像度は 800*480@60 を超えません。

  1. 2 つのデュアルリンク LVDS インターフェイスをサポートし、最大解像度 1920x1200@60、幅と高さ 2048 を超えない、ピクセル クロック 180MHz を超えないことをサポートします。または 4 つのシングルリンク LVDS 接続

ポート、解像度は最大 1366*768@60 をサポートします。

  1. 2 つの I8080 インターフェイス。解像度は800*480@60まで対応します。

  2. LVDS インターフェイスは信号の同時表示をサポートします。2 つのシングル リンク LVDS インターフェイスはすべて、同じ LVDS インターフェイスを使用して同じ画面に接続する必要があり、同じ信号を確保するために同じデータが 2 つの画面に送信されます。それで

理論的には、T509 は 4 つのディスプレイを実現できますが、最初の 2 つと最後の 2 つは異なる解像度を持つことができ、2 つの解像度は同じである必要があり、同じ LCD 画面に接続する必要があります。

説明する

マルチディスプレイ シナリオでは、メイン ディスプレイで MIPI-DSI を使用する必要があることを除いて、上記のインターフェイスを自由に組み合わせることができます。

スキル

デュアル リンク LVDS インターフェイスには合計 20 ラインがあります。lvds0 と lvds1 を想定して 2 つのシングル リンク LVDS インターフェイスに分割できます。表示用にシングル リンクを選択する場合は、lvds0 を選択する必要があります。

4 モジュールの紹介

4.1 スクリーンドライバーを追加する手順

  1. linux4.9以前の場合は以下の最初の3箇所の計3箇所、linux5.4の場合は4箇所の修正が必要です 詳細はスクリーンドライバーのソースコードの場所を参照してください。

• Linux ソース コード リポジトリ。

• uboot ソース コード リポジトリ。uboot には、ロゴを表示することを目的としたディスプレイ ドライバーとスクリーン ドライバーもあります。

• ボードレベルの dts 構成ウェアハウス。目的は、board.dts を通じていくつかの一般的な LCD 設定パラメータを設定することです。linux4.9 の場合、この設定はカーネルと uboot の両方に有効になります。linux-5.4 の場合は、次の記事を参照してください。

• Linux5.4 の場合、追加の uboot 固有のボードレベルの dts 構成ウェアハウスを構成する必要があります。

  1. Allwinner 表示フレームワークのカーネル構成が有効になっていることを確認してください。menuconfig 構成手順を参照してください。

  2. 事前に以下の資料や情報を準備してください。

• 画面マニュアル。主にスクリーンの基本情報や電気的特性などを記載しており、スクリーンメーカーに問い合わせてください。

・ドライバーICのマニュアル。主に画面ICの詳細情報を記載します。ここでは初期化やカスタマイズに役立つ各コマンドの詳細を中心に説明しますので、スクリーンメーカーにお問い合わせください。

• 画面のタイミング情報。スクリーンメーカーへお問い合わせください。詳細については、画面タイミング パラメータの説明を参照してください。

• 画面初期化コード。スクリーンメーカーにお問い合わせください。通常、DSI および I8080 画面では、画面を初期化するための初期化コマンドが必要です。

• マルチメーター。画面を調整するには、関連する電圧の測定を避けることはできません。

  1. スクリーン ドライバーを追加する前に、まずスクリーン ドライバーについて理解する必要があります。スクリーン ドライバーの内訳を参照してください。

  2. 手順 3 の情報からスクリーン タイプを特定し、同じタイプの既存のスクリーン ドライバをテンプレートとして選択して、スクリーン ドライバを追加するか、スクリーン ドライバを直接変更します。

  3. スクリーンドライバーディレクトリ内のpanel.cとpanel.hを変更します。strcut_lcd_panel を追加したばかりの変数ポインタをグローバル構造変数 pane_array に追加します。panel.h に strcut lcd_panel サウンドを追加しました。

明るい。

  1. メイクファイルを変更します。LCD スクリーン ドライバー ディレクトリの上位にある Makefile ファイル内の disp-objs に、先ほど追加したスクリーン ドライバー .o を追加します。

  2. board.dtsのlcd0を変更します。RGB インターフェイス、MIPI-DSI インターフェイス、I8080 インターフェイス、および LVDS インターフェイスを見て、さまざまなインターフェイスの一般的な構成を紹介します。ハードウェア パラメータの説明。この章にはすべての lcd0 セクションが含まれています

構成可能なプロパティをクリックすると、詳細な説明が表示されます。

  1. uboot、カーネル、パッケージ、プログラムをコンパイルします。SDK ごとにコンパイル方法が異なることに注意してください。一部の SDK はデフォルトでは uboot をコンパイルしません。
  2. デバッグ。デバッグ方法により、最初に問題を特定できます。FAQ もあり、画面調整にも役立ちます。

4.2 スクリーンドライバーの説明書

4.2.1 スクリーンドライバーのソースコードの場所

Linux 3.4 バージョンのカーネル:

linux3-4/ドライバー/ビデオ/sunxi/disp2/disp/lcd/

Linux 3.10 バージョンのカーネル:

linux3-10/ドライバー/ビデオ/sunxi/disp2/disp/lcd/

Linux バージョン 4.9 以降のカーネル:

linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/

uboot-2014:

ブランデー/u-boot-2014.07/ドライバー/ビデオ/sunxi/disp2/disp/lcd

uboot-2018:

ブランデー/ブランディ-2.0/u-boot-2018/ドライバー/ビデオ/sunxi/disp2/disp/lcd

ボードレベルの構成では、R818などの「チップモデル」、デモなどの「ボード名」は実際の状況に応じて読み替えてください。

デバイス/config/chips/チップモデル/configs/ボード名/board.dts

linux5.4 で使用される Uboot ボードレベルの構成:

デバイス/config/chips/チップモデル/configs/ボード名/uboot-board.dts

linux5.4 で使用されるカーネル ボード レベルの構成:

デバイス/config/chips/チップモデル/configs/ボード名/linux-5.4/board.dts

4.2.2 menuconfig 設定手順

LCD 関連のコードは disp ドライバー モジュールに含まれており、カーネル ルート ディレクトリに入り、make ARCH=arm menuconfig または make ARCH=arm64 menuconfig (64 ビット プラットフォーム) を実行して、メイン設定インターフェイスに入ります。

麺。そして、次の手順に従います。

DE1.0 対応プラットフォーム: R6 (linux-3.10)、R16 (linux-3.4)。

DE2.0 対応プラットフォーム: R6 と R16 を除く。

画像-20221129102051729

図 4-1: DE1.0 menuconfig 構成図

画像-20221129102107009

図 4-2: DE2.0 menuconfig 構成図

R40 を例に挙げると、具体的な構成ディレクトリは次のとおりです。デバイス ドライバー -> グラフィック サポート -> フレーム バッファー デバイスのサポート -> sunxi のビデオ サポート -> DISP ドライバー サポート (sunxi-disp2)。

4.2.3 スクリーンドライバーの分解

スクリーン ドライバーのソース コードの場所は、主に次の 4 種類のファイルに分かれています。

  1. ユーザーが新しいスクリーン ドライバーを追加するときは、panel.c と panel.h を変更する必要があり、スクリーン構造変数をグローバル構造変数 pane_array に追加する必要があります。

  2. lcd_source.c および lcd_source.h、これら 2 つのファイルは、電源スイッチ、gpio、dsi 読み取りおよび書き込みインターフェイスなど、スクリーン ドライバーで使用される関数インターフェイスを実装します。ユーザーはこれらを変更する必要はなく、使用するだけで済みます。 。

  3. スクリーンドライバー。上記のソース ファイルに加えて、一般に c ファイルと h ファイルがスクリーン ドライバーを表します。

  4. スクリーン ドライバーのソース コードの場所の上位レベルには、ユーザーが変更する必要がある Makefile ファイルがあります。

ファイルの最後にあるスクリーンドライバーの例として、 drivers/video/fbdev/sunxi/disp2/disp/lcd/default_panel.c を開くことができます。

struct __lcd_panel default_panel = {
    /* panel driver name, must mach the lcd_drv_name in board.dts */
    .name = "default_lcd",
        .func = {
        .cfg_panel_info = LCD_cfg_panel_info,
        .cfg_open_flow = LCD_open_flow,
        .cfg_close_flow = LCD_close_flow,
        }
    ,
};

グローバル変数default_panelのメンバー名はlcd_driver_nameと一致している必要があり、これはドライバーが指定されたファイルを見つけられるかどうかに関係します。

次に func メンバーの初期化です。ここでは主に 3 つのコールバック関数が実装されています。LCD_cfg_panel_info、LCD_open_flow、および LCD_close_flow。

画面のオン/オフを切り替えるプロセスは、画面の電源をオン/オフするプロセスであり、スクリーンのマニュアルやドライバ IC のマニュアルにおけるパワーオン シーケンスとパワー オフ シーケンスに相当します。

画面切り替えの操作手順を下図に示します。

このうち、LCD_open_flow、LCD_close_flow を画面切り替え処理関数と呼び、LCD_power_on などボックス内の関数を画面切り替えステップ関数と呼びます。

lvds 画面、RGB 画面など、初期化操作を必要としない LCD 画面の場合、関数 LCD_panel_init および LCD_panel_exit は空にすることができます。

画像-20221129102353374

図 4-3: LCD 切り替え画面の処理

関数: LCD_open_flow

機能: LCD_open_flow 関数は、システムの初期化中に 1 回だけ呼び出されます。各 LCD_OPEN_FUNC を実行すると、対応する画面を開くステップ関数が登録されます。最初に登録してから実行しますが、すぐには実行されません。

画面開きステップ関数を実行します。

プロトタイプ:

static s32 LCD_open_flow(u32 sel)

一般的に使用される関数は次のとおりです。

static __s32 LCD_open_flow(__u32 sel)
{
    LCD_OPEN_FUNC(sel, LCD_power_on,10);
    LCD_OPEN_FUNC(sel, LCD_panel_init, 50);
    LCD_OPEN_FUNC(sel, sunxi_lcd_tcon_enable, 100);
    LCD_OPEN_FUNC(sel, LCD_bl_open, 0);
    return 0;
}

上記と同様に、LCD_OPEN_FUNC を 4 回呼び出すと、4 つの画面を開く処理に相当する 4 つのコールバック関数が登録されます。実際、妥当な範囲内でどれだけの関数を登録するかはユーザーが決定できます。

  1. LCD_power_on は、LCD の電源をオンにしてから 10ms 遅延させることを意味します。このステップは通常、LCD 関連の電源と、リセット ピンなどの関連ピンをオンにするために使用されます。ここでは、電力制御機能の記述と端子制御が一般的に使用されます。

操作する機能の説明です。

  1. LCD_panel_init は初期化画面であり、その後 50ms 遅延します。初期化が必要ない画面の場合、このステップは省略できます。この関数は通常、画面の初期化のために画面に初期化コマンドを送信するために使用されます。DSI 画面の場合は、DSI フェーズを確認します。

関数の説明については、I8080 画面の場合は I8080 インターフェイスの関数の説明を使用し、i2c や spi などの他の状況の場合は、iic/spi シリアル インターフェイスの初期化を使用するか、GPIO を使用してシミュレーションできます。

  1. sunxi_lcd_tcon_enable は TCON をオンにし、100ms 遅延します。このステップは固定されており、画像信号の送信を開始することを意味します。

  2. LCD_bl_open はバックライトをオンにしてから 0ms 遅延します。最初の 3 つの手順を完了した後、バックライトをオンにすると、ちらつきがなくなります。ここで一般的に使用される機能については、バックライト制御機能の説明を参照してください。

以下に示すように、これは画面マニュアルに記載されている典型的な電源投入シーケンス図ですが、スクリーン ドライバを作成する際には遅延にも注意する必要があります。

画像-20221129102545133

図 4-4: 電源オン

関数: LCD_OPEN_FUNC

機能: 画面開始ステップ関数を画面開始プロセスに登録します。これは実行ではなく登録であることに注意してください。

プロトタイプ:

void LCD_OPEN_FUNC(__u32 sel, LCD_FUNC func, __u32 delay)

パラメータの説明:

func は関数ポインタであり、その型は次のとおりです: void (*LCD_FUNC) (__u32 sel) ユーザー定義関数も統一された形式を使用する必要があります。例えば:

void user_defined_func(__u32 sel)
{
    //do something
}

遅延は、このステップを実行した後の遅延時間です。時間単位はミリ秒です。

LCD_OPEN_FUNC の第 2 パラメータは、前後 2 ステップの遅延長で、単位は ms です。ここでの値は画面マニュアルの規定に従って入力する必要がありますので、注意してください。ランダムに入力すると、画面の初期化異常や異常を引き起こす可能性があります。画面切り替え時間が経過します。

長くなり、ユーザーエクスペリエンスに影響を与えます。

LCD_open_flow に対応するのは、画面を閉じる関数を登録する LCD_close_flow です。関数の登録には LCD_CLOSE_FUNC を使用します。最初に登録し、最初に実行します。ここでは、コールバック関数は登録されるだけで、すぐには実行されません。

わかりました。

static s32 LCD_close_flow(u32 sel)
{
    /* close lcd backlight, and delay 0ms */
    LCD_CLOSE_FUNC(sel, LCD_bl_close, 0);
    /* close lcd controller, and delay 0ms */
    LCD_CLOSE_FUNC(sel, sunxi_lcd_tcon_disable, 50);
    /* open lcd power, than delay 200ms */
    LCD_CLOSE_FUNC(sel, LCD_panel_exit, 100);
    /* close lcd power, and delay 500ms */
    LCD_CLOSE_FUNC(sel, LCD_power_off, 0);
    return 0;
}
  1. 最初にバックライトをオフにして、画面のシャットダウン プロセス全体でちらつきプロセスがユーザーに表示されないようにします。

  2. TCON を閉じる必要があります。つまり、データの送信を停止します。さらに 50 ミリ秒遅らせます。

  3. 画面シャットダウン コードを実行し、200 ミリ秒待機します (初期化が必要ない画面の場合、この手順は省略できます)。

  4. 最後に電源を切り、0ms遅延させます。

以下の図は、一般的なスクリーンオフのタイミング図です。

画像-20221129102917140

図 4-5: 電源オフ

関数: LCD_cfg_panel_info

機能: ガンマ関数やカラーマッピング関数などの TCON 拡張パラメータを設定しました。

プロトタイプ:

static void LCD_cfg_panel_info(__panel_extend_para_t * info)

TCON の拡張パラメータは画面ファイル内でのみ設定可能ですパラメータの定義については表示効果に関するパラメータを参照してください。

ガンマ補正またはカラー マッピングが必要な場合は、board.dts、lcd_gamma_en、lcd_cmap_en で対応するモジュールの有効パラメータを 1 に設定し、3 つの係数テーブル lcd_gamma_tbl、lcd_gamma_tbl、および

lcd_cmap_tbl のコード部分を以下に示します。注: ガンマ、テンプレートは 18 の変曲点値を提供し、すべての値 (255) を補間します。詳細が足りないと思われる場合は、対応する表に追加してください。

子供。cmap_tbl のサイズは固定されており、テーブルのサイズを増減することはできません。

最終的に生成されたガンマ テーブル エントリは、それぞれ 8 ビットを占める 3 つのガンマ値 rgb で構成されます。現在提供されているテンプレートでは、3 つのガンマ値は同じです。

static void LCD_cfg_panel_info(struct panel_extend_para *info)
{
    u32 i = 0, j = 0;
    u32 items;
    u8 lcd_gamma_tbl[][2] = {
        /* {input value, corrected value} */
        {0, 0},
        {15, 15},
        {30, 30},
        {45, 45},
        {60, 60},
        {75, 75},
        {90, 90},
        {105, 105},
        {120, 120},
        {135, 135},
        {150, 150},
        {165, 165},
        {180, 180},
        {195, 195},
        {210, 210},
        {225, 225},
        {240, 240},
        {255, 255},
    };
    u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0, LCD_CMAP_B1, LCD_CMAP_G2, LCD_CMAP_B3},
        {LCD_CMAP_B0, LCD_CMAP_R1, LCD_CMAP_B2, LCD_CMAP_R3},
        {LCD_CMAP_R0, LCD_CMAP_G1, LCD_CMAP_R2, LCD_CMAP_G3},
        },
        {
        {LCD_CMAP_B3, LCD_CMAP_G2, LCD_CMAP_B1, LCD_CMAP_G0},
        {LCD_CMAP_R3, LCD_CMAP_B2, LCD_CMAP_R1, LCD_CMAP_B0},
        {LCD_CMAP_G3, LCD_CMAP_R2, LCD_CMAP_G1, LCD_CMAP_R0},
        },
    };
    items = sizeof(lcd_gamma_tbl) / 2;
    for (i = 0; i < items - 1; i++) {
    	u32 num = lcd_gamma_tbl[i + 1][0] - lcd_gamma_tbl[i][0];
        for (j = 0; j < num; j++) {
            u32 value = 0;
            value =
            lcd_gamma_tbl[i][1] +
            ((lcd_gamma_tbl[i + 1][1] -
            lcd_gamma_tbl[i][1]) * j) / num;
            info->lcd_gamma_tbl[lcd_gamma_tbl[i][0] + j] =
            (value << 16) + (value << 8) + value;
        }
    }
    info->lcd_gamma_tbl[255] =
        (lcd_gamma_tbl[items - 1][1] << 16) +
        (lcd_gamma_tbl[items - 1][1] << 8) + lcd_gamma_tbl[items - 1][1];
    memcpy(info->lcd_cmap_tbl, lcd_cmap_tbl, sizeof(lcd_cmap_tbl));
}
4.2.4 遅延機能の説明

関数数:sunxi_lcd_lay_ms / sunxi_lcd_lay_us

機能: 遅延機能、それぞれミリ秒レベル/マイクロ秒レベルの遅延。

原型:s32 sunxi_lcd_lay_ms(u32 ms) / s32 sunxi_lcd_lay_us(u32 us)

4.2.5 画像データ有効化機能の説明

関数数:sunxi_lcd_tcon_enable / sunxi_lcd_tcon_disable

機能: LCD コントローラの電源をオンにし、LCD ディスプレイのリフレッシュを開始します。LCD コントローラの電源を切り、データの更新を停止します。

原型:void sunxi_lcd_tcon_enable(u32 screen_id)

void sunxi_lcd_tcon_disable(u32 screen_id)

4.2.6 バックライト制御機能の説明

関数数:sunxi_lcd_backlight_enable / sunxi_lcd_backlight_disable

機能:board.dts の lcd_bl で設定された gpio を操作して、バックライトをオン/オフします。lcd_bl_en を参照してください。

原型:void sunxi_lcd_backlight_enable(u32 screen_id)

void sunxi_lcd_backlight_disable(u32 screen_id)

関数数:sunxi_lcd_pwm_enable / sunxi_lcd_pwm_disable

機能: pwm コントローラーのオン/オフを切り替えます。オンにすると、pwm は pwm 波形を出力します。lcd_pwm_chに対応するpwmに対応します。

原型:s32 sunxi_lcd_pwm_enable(u32 screen_id)

s32 sunxi_lcd_pwm_disable(u32 スクリーン ID)

4.2.7 電力制御機能の説明

関数数:sunxi_lcd_power_enable / sunxi_lcd_power_disable

機能: LCD の電源をオン/オフします。操作は、board.dts の lcd_power/lcd_power1/lcd_power2 です (pwr_id は電源インデックスを識別します)。

原型:void sunxi_lcd_power_enable(u32 screen_id, u32 pwr_id)

void sunxi_lcd_power_disable(u32 screen_id, u32 pwr_id)

  1. pwr_id = 0:board.dts の lcd_power に対応します。
  2. pwr_id = 1:board.dts の lcd_power1 に対応します。
  3. pwr_id = 2:board.dts の lcd_power2 に対応します。
  4. pwr_id = 3:board.dts の lcd_power3 に対応します。

関数: sunxi_lcd_pin_cfg

機能: LCD IO を設定します。

原型:s32 sunxi_lcd_pin_cfg(u32 screen_id, u32 bon)

説明: board.dts の lcdd0-lcdd23/lcddclk/lcdde/lcdhsync/lcdvsync に対応する、lcd の data/clk およびその他のピンを設定します。

dsi は専用ピンであるため、dsi インターフェイス画面では、board.dts でこのピンのセットを設定する必要はありませんが、対応するピンもこの関数インターフェイスでオン/オフになります。

Bon: 1: オンを意味し、0: 無効状態に設定されていることを意味します。

4.2.8 DSI関連機能説明

ほとんどの MIPI DSI 画面は、初期化に DSI-D0 チャネルの LP モードを使用して初期化する必要があります。提供されるインターフェイス関数は次のように説明されます。

関数数:sunxi_lcd_dsi_clk_enable / sunxi_lcd_dsi_clk_disble

機能: dsi インターフェース画面でのみ使用 dsi が出力する高速クロック clk 信号の有効/無効を設定します 初期化中に呼び出す必要があります。

原型:s32 sunxi_lcd_dsi_clk_enable(u32 scree_id)

s32 sunxi_lcd_dsi_clk_disable(u32 scree_id)

関数: sunxi_lcd_dsi_dcs_wr

機能: 画面への DCS 書き込み操作。

原型:__s32 sunxi_lcd_dsi_dcs_wr(__u32 sel,__u8 cmd,__u8* para_p,__u32 para_num)

パラメータの説明:

• cmd: dcs はコマンドの内容を書き込みます。

• para_p: dcs write コマンドのパラメータ開始アドレス。

• para_num: dcs write コマンドのパラメータの数 (バイト単位)。

関数: sunxi_lcd_dsi_dcs_wr_2para

機能: 画面への DCS 書き込み操作 このコマンドは 2 つのパラメーターを受け取ります。

原型:__s32 sunxi_lcd_dsi_dcs_wr_2para(__u32 sel,__u8 cmd,__u8 para1,__u8 para2)

パラメータの説明:

• cmd: dcs はコマンドの内容を書き込みます。

• para1: dcs write コマンドの最初のパラメータの内容。

• para2: dcs write コマンドの第 2 パラメータの内容。

sunxi_dsi_dcs_wr_0para、sunxi_dsi_dcs_wr_1para、sunxi_dsi_dcs_wr_3para、sunxi_dsi_dcs_wr_4para、

sunxi_dsi_dcs_wr_5para の定義は dsi_dcs_wr_2para の定義と似ていますが、違いはパラメータの数です。

関数: sunxi_lcd_dsi_dcs_read

機能: dsi 読み取り操作。

原型:s32 sunxi_lcd_dsi_dcs_read(u32 sel, u8 cmd, u8 result, u32 num_p)

パラメータの説明:

• sel、ディスプレイ ID。

• cmd、読み取るレジスタ。

• result、読み取りインターフェイスを保存するために使用される配列 ユーザーは、読み取りインターフェイスを保存するのに十分なスペースがあることを確認する必要があります。

• num_p、ポインタは読み取られるバイト数を格納するために使用され、ユーザーはそれが NULL ポインタでないことを確認する必要があります。

4.2.9 I8080インターフェース機能の説明

ディスプレイドライバーは、使用するための 5 つのインターフェイス機能を提供します。次のように:

函数:sunxi_lcd_cpu_write

機能:CPU画面の指定レジスタを指定値に設定します。

原型:void sunxi_lcd_cpu_write(__u32 sel、__u32 インデックス、__u32 データ)

関数の内容は次のとおりです。

Void sunxi_lcd_cpu_write(__u32 sel, __u32 index, __u32 data)
{
    sunxi_lcd_cpu_write_index(sel, index);
    sunxi_lcd_cpu_wirte_data(sel, data);
}

8080 バス上で 2 つの書き込み操作が実装されています。

sunxi_lcd_cpu_write_index は最初の書き込み操作を実行しますが、このとき PIN ピン RS (A1) は Low レベルであり、バス データ上のデータ内容はパラメータ インデックスの値です。

Sunxi_lcd_cpu_wirte_data は 2 回目の書き込み動作を実行しますが、このとき PIN ピン RS (A1) は High レベルであり、バス データ上のデータ内容はパラメータ データの値になります。

関数: sunxi_lcd_cpu_write_index

機能:CPU画面を指定したレジスタに設定します。

プロトタイプ:

void sunxi_lcd_cpu_write_index(__u32 sel,__u32 index)

具体的な手順については、sunxi_lcd_cpu_write を参照してください。

函数:sunxi_lcd_cpu_write_data

機能: CPU 画面レジスタの値を指定された値に設定します。

プロトタイプ:

void Sunxi_lcd_cpu_write_data(__u32 sel, __u32 data);

関数: tcon0_cpu_rd_24b_data

機能: 読み取り操作。

プロトタイプ:

s32 tcon0_cpu_rd_24b_data(u32 sel, u32 index, u32 *data, u32 size)

パラメータの説明:

• sel: 表示 ID。

• Index: 読み取られるレジスタ。

• データ: 読み取りインターフェイスの配列ポインタを保存するために使用されます。ユーザーは、データを保存するのに十分なスペースがあることを確認する必要があります。

• size: 読み取るバイト数。

4.2.10 端子制御機能の説明

関数: sunxi_lcd_gpio_set_value

機能: LCD_GPIO PIN ピンは High レベルまたは Low レベルを出力します。

原型:s32 sunxi_lcd_gpio_set_value(u32 screen_id, u32 io_index, u32 value)

パラメータの説明:

• io_index = 0:board.dts の lcd_gpio_0 に対応します。

• io_index = 1:board.dts の lcd_gpio_1 に対応します。

• io_index = 2:board.dts の lcd_gpio_2 に対応します。

• io_index = 3:board.dts の lcd_gpio_3 に対応します。

• 値 = 0: IO 出力ローレベルに対応します。

• 値 = 1: IO 出力のハイレベルに対応します。

GPIO が出力として定義されている場合にのみ使用されます。

関数: sunxi_lcd_gpio_set_direction

機能: LCD_GPIO PIN ピンを入力モードまたは出力モードに設定します。

プロトタイプ:

s32 sunxi_lcd_gpio_set_direction(u32 screen_id, u32 io_index, u32 direction);

パラメータの説明:

• io_index = 0:board.dts の lcd_gpio_0 に対応します。

• io_index = 1:board.dts の lcd_gpio_1 に対応します。

• io_index = 2:board.dts の lcd_gpio_2 に対応します。

• io_index = 3:board.dts の lcd_gpio_3 に対応します。

• 方向 = 0: 対応する IO が入力に設定されます。

• 方向 = 1: 対応する IO が出力に設定されます。

画面によっては初期化が必要な場合がありますが、LCD_panel_init関数に相当する画面開始ステップ関数では、画面を初期化するためのメソッドがいくつか用意されています。

DSI 画面の場合は、DSI-D0 チャネルを通じて初期化されます。CPU 画面は 8080 バス経由で初期化され、LCDIO (PD、PH) を使用します。この初期化メソッドでは、そのバスのピン ビットが

設定定義はCPU画面と一致します。

次のインターフェイスは、スクリーン ドライバーの分解でパスが記載されている lcd_source.c および lcd_source.h で定義および実装されています。

4.2.11 iic/spiシリアルインターフェースを使用した初期化

iic/spi デバイスのシリアル インターフェイスへのアクセスは、スクリーン ドライバーに登録する必要があります。

次のコード スニペットに示すように、ハードウェア spi を使用して IC をスクリーニングまたは転送して初期化します。

最初に spi_init 関数を呼び出して、spi ハードウェアを初期化します。spi_init 関数はいくつかのステップに分けることができます。最初にマスターを取得します。実際のハードウェア接続に従って、spi を選択します (コードでは spi1 が選択されています)。

ステップが spi が正しく設定されていないというエラーを返した場合は、spi ドライバーの担当者に連絡してください。2 番目のステップは、最大速度、spi 送信モード、各ワードに含まれるビット数などの spi デバイスを設定することです。最後に spi_setup を呼び出して完了します

マスターとデバイスの関係。

comm_out は spi 転送の例であり、コアは spi_sync_transfer 関数です。

static int spi_init(void)
{
    int ret = -1;
    struct spi_master *master;
    master = spi_busnum_to_master(1);
    if (!master) {
        lcd_fb_wrn("fail to get master\n");
        goto OUT
    }
    spi_device = spi_alloc_device(master);
    if (!spi_device) {
        lcd_fb_wrn("fail to get spi device\n");
        goto OUT;
    }
spi_device->bits_per_word = 8;
    spi_device->max_speed_hz = 60000000; /*50MHz*/
    spi_device->mode = SPI_MODE_0;
    ret = spi_setup(spi_device);
    if (ret) {
        lcd_fb_wrn("Faile to setup spi\n");
        goto FREE;
    }
	lcd_fb_inf("Init spi1:bits_per_word:%d max_speed_hz:%d mode:%d\n",
        spi_device->bits_per_word, spi_device->max_speed_hz,
        spi_device->mode);
	ret = 0;
	goto OUT;
FREE:
    spi_master_put(master);
    kfree(spi_device);
    spi_device = NULL;
OUT:
    return ret;
}
static int comm_out(unsigned int sel, unsigned char cmd)
{
    struct spi_transfer t;
    if (!spi_device)
    	return -1;
    DC(sel, 0);
    memset(&t, 0, sizeof(struct spi_transfer));
    t.tx_buf = &cmd;
    t.len = 1;
    t.bits_per_word = 8;
    t.speed_hz = 24000000;
    return spi_sync_transfer(spi_device, &t, 1);
}

ハードウェア i2c を使用して LCD& アダプタ IC を初期化します。i2c ハードウェアを初期化するコア関数は i2c_add_driver で、そのパラメータ struct i2c_driver を初期化する必要があります。

it66121_id には、デバイス名と i2c バス インデックス (i2c0、i2c1...) が含まれます。

it66121_i2c_probe この関数を入力できれば、i2c を使い始めることができます。コードセグメントでは、後で必要になるパラメータ cilent のみがグローバル ポインタ変数に割り当てられます。

it66121_match, これは dts のマッチ テーブルです。disp2 にドライバを追加するので、ここでのマッチ テーブルは disp2 のマッチ テーブルです。このテーブルは i2c が使用できるかどうかに関係します。注意してください。

間違ったフォームに記入してください。
ここでは、tv_i2c_detect 関数が非常に重要です。この関数は、プローブ関数よりも先に呼び出されます。この関数が正常に呼び出された後にのみ、i2c の使用を開始できます。strlcpy の呼び出しは成功を意味します。

Normal_i2c は、LCD または転送 IC のスレーブ デバイス アドレスと i2c インデックスが入力されたスレーブ デバイス アドレス リストです。

I2C の使用を開始できるかどうかは、プローブ関数が呼び出されるかどうかによって決まります。

i2c_smbus_write_byte_data または i2c_smbus_read_byte_data を使用して読み取りおよび書き込みを行うと、ほとんどのシナリオを満たすことができます。

#define IT66121_SLAVE_ADDR 0x4c
#define IT66121_I2C_ID 0
static const struct i2c_device_id it66121_id[] = {
    { "IT66121", IT66121_I2C_ID },
    { /* END OF LIST */ }
};
MODULE_DEVICE_TABLE(i2c, it66121_id);
static int it66121_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
    this_client = client;
    return 0;
}
static const struct of_device_id it66121_match[] = {
    {.compatible = "allwinner,sun8iw10p1-disp",},
    {.compatible = "allwinner,sun50i-disp",},
    {.compatible = "allwinner,sunxi-disp",},
    {},
};
static int tv_i2c_detect(struct i2c_client *client, struct i2c_board_info *info)
{
    const char *type_name = "IT66121";
    if (IT66121_I2C_ID == client->adapter->nr) {
    	strlcpy(info->type, type_name, 20);
    } else
		pr_warn("%s:%d wrong i2c id:%d, expect id is :%d\n", __func__, __LINE__,
    		client->adapter->nr, IT66121_I2C_ID);
    return 0;
}
static unsigned short normal_i2c[] = {IT66121_SLAVE_ADDR, I2C_CLIENT_END};
static struct i2c_driver it66121_i2c_driver = {
    .class = I2C_CLASS_HWMON,
    .id_table = it66121_id,
    .probe = it66121_i2c_probe,
    .remove = it66121_i2c_remove,
    .driver = {
        .owner = THIS_MODULE,
        .name = "IT66121",
        .of_match_table = it66121_match,
    },
    .detect = tv_i2c_detect,
    .address_list = normal_i2c,
};
static void LCD_panel_init(u32 sel)
{
    int ret = -1;
    ret = i2c_add_driver(&it66121_i2c_driver);
    if (ret) {
        pr_warn("Add it66121_i2c_driver fail!\n");
        return;
    }
    //start init chip with i2c
}
void it6612_twi_write_byte(it6612_reg_set* reg)
{
    u8 rdata = 0;
    u8 tmp = 0;
    rdata = i2c_smbus_read_byte_data(this_client, reg->offset);
    tmp = (rdata & (~reg->mask))|(reg->mask&reg->value);
    i2c_smbus_write_byte_data(this_client, reg->offset, tmp);
}
4.2.12 U-Boot スクリーンドライバーの注意事項

U-Boot でスクリーン ドライバーを作成する手順はカーネルの場合と同じであり、コード パス ファイルも同様に構成されます。

1. U-Boot では表示速度を高速化するために、画面を開く複数の関数間で非同期呼び出しを採用しており、タイマー割り込みを利用して定期的に画面を開く関数を呼び出すのが原理となっています。 bootGUI フレームワークがロードされ、

画面が開いたわけではなく、液晶が開いたら印刷は終了です。

提案: 非同期呼び出しの利点を活用するには、コールバックを登録するときに必要な遅延を指定してください。たとえば、次の 10 ミリ秒の遅延ではタイマー非同期コールバックが使用されます。この 10 ミリ秒の間、uboot

非同期呼び出しの目的を達成するために、他のことを行うこともできます。

LCD_OPEN_FUNC(sel, LCD_power_on,10);

2. sunxi_lcd_power_enable 関数および sunxi_lcd_pin_cfg は、LCD_power_on の外部で呼び出すことはできません。そうしないと、uboot が異常になります。

厳密に言えば、LCD_OPEN_FUNC に登録された最初のコールバック関数内でのみ呼び出すことができます。

4.3 RGBインターフェース

4.3.1 概要

Allwinner プラットフォームの RGB と設定例を紹介します。lcd0 以下の各属性の詳しい説明はハードウェアパラメータの説明を参照してください。

RGB インターフェイスは、Allwinner プラットフォームでは HV インターフェイス (水平同期および垂直同期) とも呼ばれます。

RGB 画面の初期化の場合:

一部の LCD 画面はガンマ、ピクセル形式設定などの高度な機能をサポートしていますが、RGB プロトコル自体は画像データ以外の送信をサポートしていないため、RGB ピンを介して LCD 画面を構成することはできません。

したがって、RGB インターフェイス画面が表示される場合は、初期化コマンドが必要ないか、SPI や I2C などの SoC を構成するための追加のピンが画面に提供されます。

4.3.2 RGB インターフェースピン

画像-20221129104718608

図 4-6: RGB ピン

特定の SoC ピンと上記のピンの機能 (ピン多重化機能) については、ピン多重化テーブルを参照してください。ピン多重化関数の名前は、一般的に "LCDX_" (X は数字) で始まります。

データピンの数は必ずしも 24 である必要はありません。RGB はいくつかのインターフェイスに分割されており、lcd_hv_if の設定によって選択されます。

表 4-1: RGB インターフェースの分類
ビット幅 クロックサイクル 色の数と形式をカウントする
24ビット 1サイクル 1670万色、RGB888
18ビット 1サイクル 262K色、RGB666
16ビット 1サイクル 65K色、RGB565
6ビット 3サイクル 262K色、RGB666
6ビット 3サイクル 65K色、RGB565

説明する

クロック サイクル数の意味: ピクセルが送信されるのに何クロック サイクルかかるかを意味します。

クロック サイクルが 1 の場合、この RGB インターフェイスをパラレル インターフェイスと呼びます。それ以外の場合は、シリアル インターフェイスと呼びます。より一般的な原理は、1 つのピクセルを送信するために複数のクロック サイクルを必要とするインターフェイスはすべてシリアル インターフェイスであるということです。

インターフェース。

24 ビットのビット幅がサポートされているかどうかを判断するには? 最も簡単な方法は、pinmux テーブル内のデータ ピンの数を数えることです。ピンが 24 個ある場合は 24 ビットをサポートし、ピンが 18 個しかない場合は 18 ビットをサポートします。

ハードウェア接続

パラレル RGB インターフェイスの場合、ビット幅が 24 未満の場合、ハードウェア接続は各コンポーネントの上位ビットを接続し、下位ビットを破棄することを選択する必要があります。これを行う理由は、失われる色数を少なくするためです。

シリアル RGB インターフェイスの場合、ハードウェア接続は、RGB および I8080 ピン構成図の同期 RGB 列を参照できます。

RGB インターフェイスには 2 つの同期方法があります。経験に応じて 2 番目の方法を使用してください。DE ピンがハードウェアに接続されていることを確認してください。

  1. 水平同期+垂直同期
  2. DE(データイネーブル)
4.3.3 パラレルRGBインターフェース構成例

パラレル RGB インターフェイスを設定する場合、24 ビット、18 ビット、16 ビットを区別する必要はありません。最大ビット幅については、ピン マルチプレクサ テーブルを参照してください。LCD 画面自体がSoC がサポートするビット幅よりも広いビット幅

ビット幅が小さい場合は、当然小さい方しか選択できません。

初期化を必要としないため、RGB インターフェイスの問題はほとんどありませんが、LCD のタイミングの合理性、つまり lcd_ht、lcd_hspw、lcd_hbp、lcd_vt、lcd_vspw、lcd_vbp の属性の合理性に注目してください。

セックス。

以下は典型的なパラレル RGB インターフェイスの Board.dts 構成例です。空白行を使用して構成をいくつかの部分に分割しています。

  1. 最初の部分は、構成を使用するかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化に使用するスクリーン ドライバーを決定します。ここでは、初期化を必要としない設定に設定される default_lcd を示します。

RGB画面

  1. 2 番目の部分では、次の構成が並列 RGB 構成であるかどうかを判断します。

  2. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。

  3. 4 番目の部分はバックライト (pwm および lcd_bl_en) を決定します。バックライト関連のパラメータを参照してください。

  4. 5 番目の部分は表示エフェクト部分の構成で、24 ビット RGB でない場合、通常は lcd_frm を設定する必要があります。

  5. 6 番目は電源とピンの構成です。RGB666 を使用するか RGB888 を使用するかは、実際の pinmux テーブルに基づいて決定する必要がありますが、チップが 18 RGB データしか持たない場合は、RGB18 しか使用できません。電源とピンを参照してください

パラメータ。

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "default_lcd";
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <0>;
    /* part 3 */
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_x = <800>;
    lcd_y = <480>;
    lcd_dclk_freq = <33>;
    lcd_hbp = <46>;
    lcd_ht = <1055>;
    lcd_hspw = <0>;
    lcd_vbp = <23>;
    lcd_vt = <525>;
    lcd_vspw = <0>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <10000>;
    lcd_pwm_pol = <1>;
    lcd_bl_en = <&pio PD 27 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    /* part 5 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    pinctrl-0 = <&rgb24_pins_a>;
    pinctrl-1 = <&rgb24_pins_b>;
};

4.3.4 シリアル RGB インターフェイスの一般的な構成

シリアル RGB はパラレル RGB に関連しています。データの送信に 1 つのラインだけを使用するという意味ではありません。1 つのピクセルのデータを送信するために複数のクロック サイクルを使用できる限り、そのような RGB インターフェイスはシリアル RGB です。

また、パラレル RGB インターフェイスと同様に、特定のシリアル RGB インターフェイスも必要なく、ハードウェアを正しく接続するだけで構成に反映されます。

以下は典型的なシリアル RGB インターフェイス ボードの dts 構成例です。データ ピンは 8 つしかありません。空白行は構成をいくつかの部分に分割するために使用されます。

  1. 最初の部分は、構成が使用されるかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化にどのスクリーン ドライバーを使用するかを決定します。

  2. Division 2 は、次の構成がシリアル RGB 構成であると判断します。

  3. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。

ヒント
ここで注意する必要があるのは、このインターフェイスの場合、SoC は 1 つのピクセルを送信するのに合計 3 サイクルを必要とするため、タイミングを設定するときは、lcd_dclk_freq 3=lcd_ht lcd_vt 60または

lcd_dclk_freq=lcd_ht 3 lcd_vt 60 は、lcd_ht の 3 倍、または lcd_dclk_freq の 3 倍のいずれかです。

  1. 4 番目の部分はバックライトを決定します。それが pwm と lcd_bl_en です。バックライト関連パラメータを参照してください。

  2. 5 番目の部分は表示効果の設定です。

  3. パート 6: ピンと電源の定義。電源とピンのパラメータを参照してください。

説明する

以下の例の LCD ドライバ IC は stv7789v であり、初期化する必要があります。初期化されたインターフェイス プロトコルは SPI なので、さらにいくつかの SPI ピン構成があります。ドライバでは SPI プロトコルをシミュレートするために GPIO が使用されているため、構成は次のとおりです

gpio機能。

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "st7789v";
    /* part 2 */
    lcd_if = <0>;
    lcd_hv_if = <8>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <320>;
    lcd_width = <108>;
    lcd_height = <64>;
    lcd_dclk_freq = <19>;
    lcd_hbp = <120>;
    ;10 + 20 + 10 + 240*3 = 760 real set 1000
    lcd_ht = <850>;
    lcd_hspw = <2>;
    lcd_vbp = <13>;
    lcd_vt = <373>;
    lcd_vspw = <2>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PB 1 1 0 3 1>;
    lcd_bright_curve_en = <1>;
    /* part 5 */
    lcd_frm = <1>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_hv_srgb_seq = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_rb_swap = <0>;
    /* part 6 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    /*reset */
    lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
    /* cs */
    lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
    /*sda */
    lcd_gpio_2 = <&pio PD 13 1 0 3 0>;
    /*sck */
    lcd_gpio_3 = <&pio PD 12 1 0 3 0>;
    pinctrl-0 = <&rgb8_pins_a>;
    pinctrl-1 = <&rgb8_pins_b>;
};

4.4 MIPI-DSIインターフェース

4.4.1 概要

MIPI-DSI (モバイル インダストリー プロセッサ インターフェイス ディスプレイ シリアル インターフェイス) は、モバイル インダストリー プロセッサ インターフェイス ディスプレイ シリアル インターフェイスです。

ユーザーは次のことを知っておく必要があります。

  1. コマンド モードは、MPU インターフェイスと同様に、バッファリングのために IC 内に GRAM を必要とします。

  2. ビデオモード。RGB インターフェイスと同様に、GRAM がないため、パネルにデータを常にフラッシュする必要があります。ビデオ モードは 3 つのサブモードに分かれています。

• 同期パルス付きの非バーストモード

• 同期イベントを備えた非バーストモード

• バーストモード。単純に理解すると、有効データ率が高くなり、伝送効率が高くなるということです。

  1. レーンとは、一対の差動ピンを意味します。
4.4.2 MIPI-DSI ピン

MIPI-DSI ピンはほとんどの IC 専用であり、ハードウェアが接続されている限り、board.dtsi で設定する必要はありません。

ただし、一部の IC の DSI ピンは専用ではなく、他の機能のピンと再利用されているため、pinctrl-0 と pinctrl-1 を設定する必要があります。

mipi-dsi のピンは差動であり、クロック ピンとデータ ピンの 2 種類のピンに分かれています。データ ピンの数は可変で、量の単位はレーンです。各ピン レーンには実際に次のものが含まれます。 2行。

一般に、LCD 画面のマニュアルに記載されているレーン数は、クロック ピンを除いたデータ ピンの数を指します。たとえば、4 レーンの MIPI-DSI 画面には、合計 (4+1)*2 個のピンがあります。

4.4.3 MIPI-DSI電源

一般に、MIPI-DSI モジュールに供給する電源があります。これはピン電源またはモジュール電源と考えることができます。IC が異なれば、この電源に対する電圧要件も異なる場合があります。IC モデルが決定されると、この電源の電圧要件も決まります。電源

この回路の電圧を無断で変更するとモジュールが異常を起こす可能性があります。

画像-20221129105502705

図 4-7: pinmux
4.4.4 特定の MIPI-DSI 画面がサポートされているかどうかを確認する

1. 解像度の制限。レーン速度制限があり、最大解像度制限を求めることができますが、計算式は以下の通りであり、lane_speed が上記の IC 仕様で指定されている速度を超えない限り、理論的にはサポートされます。

ICの仕様をご確認ください。

LANE_SPEED=lcd_vt * lcd_ht * fps * ピクセルあたりのビット数 / レーン番号 / 1e9

• 単位: Gbps。

• fps: 画面のマニュアルからわかる予想リフレッシュ レートは、通常 60 です。lcd_dclk_freq を参照してください。

• bit_per_pixel: 各ピクセルに含まれるビット数 (通常は 24 または 18) は、lcd_dsi_format によって設定されます。

• LANE_num: レーン番号。lcd_dsi_lane によって設定されます。

• 1e9:1000000000 は科学的表記法で記述されます。

  1. 解像度を選択するときは、システムの帯域幅と DE の機能を考慮する必要があります。したがって、インターフェイスがこの解像度をサポートしていても、システム全体でサポートされていない可能性があります。たとえば、ハードウェアはコストを節約するために高速解像度を選択します。

非常に遅い DDR メモリを使用し、同時に高解像度の画面を選択するのは明らかに非現実的です。

  1. レーン数制限。ほとんどの Allwinner IC は MIPI-DSI の 4 レーンまでをサポートしていますが、4 レーンを超える画面が表示される場合は、間違いなくサポートされていません。いくつかの IC は最大 8 レーンをサポートしているため、このモデルを選択する必要があります。

IC。

  1. MIPI-DSI規格には準拠していません。ICの仕様をご確認ください。
4.4.5 MIPI-DSI クロック レーン周波数の計算

オシロスコープを使用して MIPI-DSI クロック信号を測定し、その周波数が画面のニーズを満たしているかどうかを判断します。

まず、次のように、指定されたピクセル クロックとレーン番号から理論上の CLK 信号の周波数を計算できます。

Freq_dsi_clk = (Dclk * colordepth * 3 / lane ) / 2
  1. Freq_dsi_clk: 測定したい dsi クロック ピンの周波数。単位はMHzです。
  2. Dclk: ピクセルクロック。lcd_ht lcd_vt fps/1e6 の式から計算されます。
  3. Color Depth: 色深度、​​通常は 8 または 6。
  4. 3 を掛けると、RGB コンポーネントが 3 つあることを意味します。
  5. レーン: dsi のレーン番号。
  6. 2 で割った値: dsi クロックが両方のエッジでサンプリングされるため。
4.4.6 MIPI-DSIビデオモードの画面構成例

ほとんどの MIPI-DSI 画面はビデオ モードで構成されています。

以下は、MIPI-DSI ビデオ モードの典型的なboard.dts 設定例です。空行を使用して設定をいくつかの部分に分割しています。

  1. 最初の部分は、構成が使用されるかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化にどのスクリーン ドライバーを使用するかを決定します。
  2. 2 番目の部分では、設定が dsi インターフェイスであること、および dsi インターフェイスがビデオ モードを使用していることを判断します。
  3. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。
  4. 4つ目はバックライト関連の設定です。バックライト関連のパラメータを参照してください。
  5. その5、dsiインターフェースの詳細設定。
  6. 6 番目の部分にはエフェクト関連の設定が表示されます。
  7. パート 7、ピンと電源の設定。電源とピンのパラメータを参照してください。
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "k101im2qa04";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <0>;
    /* part 3 */
    lcd_x = <800>;
    lcd_y = <1280>;
    lcd_width = <135>;
    lcd_height = <216>;
    lcd_dclk_freq = <68>;
    lcd_hbp = <36>;
    lcd_ht = <854>;
    lcd_hspw = <18>;
    lcd_vbp = <12>;
    lcd_vt = <1320>;
    lcd_vspw = <4>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PB 8 1 0 3 1>;
    lcd_bright_curve_en = <0>;
    /* part 5 */
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    /* part 6 */
    lcd_frm = <0>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_pin_power = "dcdc1";
    lcd_pin_power1 = "eldo3";
    lcd_power = "dc1sw";
    lcd_gpio_0 = <&pio PD 22 1 0 3 1>;
    pinctrl-0 = <&dsi4lane_pins_a>;
    pinctrl-1 = <&dsi4lane_pins_b>;
};
4.4.7 MIPI-DSI超高解像度画面構成例

解像度のレベルに応じて、通常はいくつかのモードに分けて設定します。1080p 解像度以下: lcd_dsi_if を制御に設定するだけです。コマンド モードは通常低解像度の画面ですが、ビデオ モードは

バーストモードは高解像度向けです。解像度が 2k に達する場合は、追加の設定が必要です。

解像度 2k 以上の画面を通常に表示するには、実際には最大 8 つのデータ レーンが必要で、そのうち 4 つのレーンは画像内の奇数ピクセルを送信し、もう 1 つの画像は奇数ピクセルを送信します。

説明する

一部の IC のみが超高解像度をサポートしていることに注意してください。詳細については、チップ仕様の MIPI-DSI 部分を確認してください。

以下は、MIPI-DSI 高解像度および超高解像度 (2k を超える) の board.dts 構成例です。空行を使用して構成がいくつかの部分に分割されています。

  1. 最初の部分は、構成が使用されるかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化にどのスクリーン ドライバーを使用するかを決定します。
  2. 2 番目の部分では、設定が dsi インターフェイスであること、および dsi インターフェイスがビデオ モードを使用していることを判断します。
  3. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。
  4. 4 番目の部分、バックライト関連の設定については、バックライト関連のパラメーターを参照してください。
  5. その5、dsiインターフェースの詳細設定。


lcd_dsi_lane が依然として 4 レーンに設定されているのは、これは 1 つの dsi のレーン数を設定するためであり、この画面には 2 つの dsi が必要であることを説明します全部で8レーンあります。

このとき、lcd_tcon_mode、lcd_dsi_port_num、lcd_tcon_en_odd_even_div の 3 つのオプションを特別に設定する必要があります。クリックすると具体的な意味が表示されます。解像度 1080p 以下の画面の場合 (

4lane 以下)の場合、これら 3 つの構成はデフォルトで 0 に設定できます。
6. 6 番目の部分はエフェクトパートの設定を示します。
7. 7 番目の部分は、ピンと電源の構成です。回路図に従って構成してください。電源とピンのパラメータを参照してください。

&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "lq101r1sx03";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <0>;
    /* part 3 */
    lcd_x = <2560>;
    lcd_y = <1600>;
    lcd_width = <216>;
    lcd_height = <135>;
    lcd_dclk_freq = <268>;
    lcd_hbp = <80>;
    lcd_ht = <2720>;
    lcd_hspw = <32>;
    lcd_vbp = <37>;
    lcd_vt = <1646>;
    lcd_vspw = <6>;
    /* part 4 */
    lcd_backlight = <50>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bl_en = <&pio PH 10 1 0 3 1>;
    /* part 5 */
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_port_num = <1>;
    lcd_tcon_mode = <4>;
    lcd_tcon_en_odd_even_div = <1>;
    /* part 6 */
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_power = "vcc18-lcd";
    lcd_power1 = "vcc33-lcd";
    lcd_pin_power = "vcc-pd";
    lcd_gpio_0 = <&pio PH 11 1 0 3 1>;
    lcd_gpio_1 = <&pio PH 12 1 0 3 1>;
};
4.4.8 MIPI-DSIコマンドモードの画面構成例

コマンド モードの DSI 画面は I8080 インターフェイスに似ています。画面にはバッファリングと画像処理用の RAM が内部にあります。この場合、通常は画面の te ピンを使用して vsync 割り込みをトリガーする必要があるため、異なります。他のタイプの DSI から。

画面との違いは、ここで lcd_vsync ピンを設定する必要があることです。画面の te ピンは lcd_vsync に接続され、lcd_dsi_te は 1 に設定されます。

te ピンの設定は非常に重要です。一般的に、画面に te ピンがある場合は接続する必要があります。そうでないと、動的な画像を表示するときに画面が乱れ、ソフトウェアは問題を解決できず、直接問題が発生します。最終的なハードウェアは大量生産できません。

フルーツ。

ここでは、MIPI-DSI ビデオ モードとの主な違いのみを示します。その他の情報については、前のセクションを参照してください。

  1. 最初の部分は、構成が使用されるかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化にどのスクリーン ドライバーを使用するかを決定します。
  2. 2 番目の部分では、設定が dsi インターフェイスであると判断され、lcd_dsi_if がコマンド モードを示す 1 に設定されます。
  3. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。
  4. 4つ目はバックライト関連の設定です。バックライト関連のパラメータを参照してください。
  5. その5、dsiインターフェースの詳細設定。lcd_dsi_te、ここで 1 に設定すると、トリガーが有効になることを意味します。
  6. 6 番目の部分にはエフェクト関連の設定が表示されます。
  7. パート 7、ピンと電源の設定。lcd_vsync、ここは te ピンです。ハードウェアでは、このピンは画面の te ピンに接続する必要があります。ソフトウェアでは、vsync 機能に設定する必要があります。電源とピンのパラメータを参照してください。
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "h245qbn02";
    /* part 2 */
    lcd_if = <4>;
    lcd_dsi_if = <1>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <432>;
    lcd_width = <52>;
    lcd_height = <52>;
    lcd_dclk_freq = <18>;
    lcd_hbp = <96>;
    lcd_ht = <480>;
    lcd_hspw = <2>;
    lcd_vbp = <21>;
    lcd_vt = <514>;
    lcd_vspw = <2>;
    /* part 4 */
    lcd_backlight = <100>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bright_curve_en = <0>;
    lcd_bl_en = <&pio PB 3 1 0 3 1>;
    /* part 5 */
    lcd_dsi_lane = <1>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <1>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    /* part 7 */
    lcd_power = "axp233_dc1sw"
    lcd_power1 = "axp233_eldo1"
    lcd_gpio_0 = <&pio PB 2 1 0 3 0>;
    lcd_vsync = <&pio PD 21 2 0 3 0>;
};
4.4.9 MIPI-DSI VR デュアルスクリーン構成例

実際のシーンは 2 つの物理スクリーンで、各スクリーンは 1080p、各スクリーンには 4 レーンがあります。2 つのスクリーンにはそれぞれ画像フレームの左半分と右半分を表示する必要があります。アスペクト比により、水平および垂直の画面が表示されます。 、および DE 処理能力、係数、

1 つの DE+1 つの tcon+2 つの DSI ではもはや十分ではありません。それぞれ 1 つの dsi を駆動するには 2 つの tcon を使用する必要があります。ただし、2 つのディスプレイは同期する必要があり、そのためには 2 つの tcon の同期モードを使用する必要があります。

  1. LCD0 はスレーブ tcon としてマークされ、マスター tcon によって駆動されます (lcd_tcon_mode が設定されます)。

  2. LCD1 はマスター TCON としてマークされており、2 つの画面のすべての電源、バックライト、およびピン スイッチを担当します。

  3. LCD1 の端子や電源などを ON にします。LCD0 が先に ON になり、対応するモジュールのレジスタが初期化されますが、電源は ON になりません。その後、LCD1 を ON にします。LCD1 が有効になると、LCD0 が ON になります。データを一緒に送信するためにトリガーされます。これを同時に行う

オンとオフ。

説明する

注: このモードをサポートしている IC はわずかです。

&lcd0 {
    lcd_used = <1>;
    lcd_driver_name = "lpm025m475a";
    ;lcd_bl_0_percent = <0>;
    ;lcd_bl_40_percent = <23>;
    ;lcd_bl_100_percent = <100>;
    lcd_backlight = <50>;
    lcd_if = <4>;
    lcd_x = <1080>;
    lcd_y = <1920>;
    lcd_width = <31>;
    lcd_height = <56>;
    lcd_dclk_freq = <141>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <20000>;
    lcd_pwm_pol = <0>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <100>;
    lcd_ht = <1212>;
    lcd_hspw = <5>;
    lcd_vbp = <8>;
    lcd_vt = <1936>;
    lcd_vspw = <2>;
    lcd_dsi_if = <0>;
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_eotp = <0>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_dsi_port_num = <0>;
    lcd_tcon_mode = <3>;
    lcd_slave_stop_pos = <0>;
    lcd_sync_pixel_num = <0>;
    lcd_sync_line_num = <0>;
    };
&lcd1 {
    lcd_used = <1>;
    lcd_driver_name = "lpm025m475a";
    ;lcd_bl_0_percent = <0>;
    ;lcd_bl_40_percent = <23>;
    ;lcd_bl_100_percent = <100>;
    lcd_backlight = <50>;
    lcd_if = <4>;
    lcd_x = <1080>;
    lcd_y = <1920>;
    lcd_width = <31>;
    lcd_height = <56>;
    lcd_dclk_freq = <141>;
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <0>;
    lcd_pwm_freq = <20000>;
    lcd_pwm_pol = <0>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <100>;
    lcd_ht = <1212>;
    lcd_hspw = <5>;
    lcd_vbp = <8>;
    lcd_vt = <1936>;
    lcd_vspw = <2>;
    lcd_dsi_if = <0>;
    lcd_dsi_lane = <4>;
    lcd_dsi_format = <0>;
    lcd_dsi_te = <0>;
    lcd_dsi_eotp = <0>;
    lcd_frm = <0>;
    lcd_io_phase = <0x0000>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_dsi_port_num = <0>;
    lcd_tcon_mode = <1>;
    lcd_tcon_slave_num = <0>;
    lcd_slave_stop_pos = <0>;
    lcd_sync_pixel_num = <0>;
    lcd_sync_line_num = <0>;
    lcd_bl_en = <&pio PH 10 1 0 3 1>;
    lcd_power = "vcc-dsi";
    lcd_power1 = "vcc18-lcd";
    lcd_power2 = "vcc33-lcd";
    lcd_gpio_0 = <&pio PH 8 1 0 3 1>;
    lcd_gpio_1 = <&pio PH 11 1 0 3 1>;
    lcd_gpio_2 = <&pio PH 12 1 0 3 1>;
    lcd_pin_power = "vcc-ph"
};

4.5 I8080インターフェース

4.5.1 概要

Intel 8080 インターフェイス画面 (MCU インターフェイスとも呼ばれます) は非常に古いプロトコルであり、通常は非常に低い解像度の画面で使用されます。

信号線:

• CS チップ選択信号。チップが動作するかどうかを決定します。

• RS レジスタ選択信号。Low はインデックスまたはステータス レジスタの選択を意味し、High は制御レジスタの選択を意味します。実際のシナリオでは、通常、SoC の LCD_DE ピン (データ イネーブル ピン) に接続されます。

• /WR (ローはデータの書き込みを意味します) データ コマンド識別信号。書き込みクロック信号であり、通常は SoC の LCD_CLK ピンに接続されます。

• /RD (Low はデータの読み取りを意味します) データ読み取り信号 (読み取りクロック信号) は通常、SoC の LCD_HSYNC ピンに接続されます。

• RESET LCD をリセットします (リセットには固定コマンド series 0 1 0 を使用します)。

• データ 双方向伝送用のデータ バス。

I8080 に基づくデータ ビット幅インターフェイスは 8/9/16/18 です。どのピンがリファレンスに接続されていますか? ビット幅が同じでも、接続されているピンは異なります。考慮すべきもう 1 つの要素は RGB フォーマットです。

  1. RGB565、合計65K色があります。

  2. RGB666、合計 262K 色。

  3. 9bitは262K固定です。

画面マニュアルを参照してください: データ ビット幅、色数の合計、ハードウェア接続については RGB および I8080 ピン構成図を参照してください。

4.5.2 I8080インターフェース画面の代表的な構成例

以下は、RGB565、8 ビット I8080 インターフェイス画面の典型的なboard.dts 構成例です。

1. 最初の部分は、構成が使用されるかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化にどのスクリーン ドライバーを使用するかを決定します。

2. 後半では、構成が I8080 インターフェイス、8bit/2cycle フォーマットの RGB565 であることが決まります。

ヒント
なぜ 8 ビット/2 サイクル RGB565 と呼ばれるのですか? まず第一に、そのフォーマットは RGB565、つまり 1 ピクセルが 16 ビットで、ビット幅が 8 ビットで、1 ピクセルを送信するのに 2 クロック サイクルを必要とします。は

2サイクルといいます。

  1. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。ここで特別なのは、ピクセル クロックが次の式を満たすように設定する必要があることです: lcd_dclk_freq 2>=lcd_ht lcd_vt fps、または lcd_dclk_freq=lcd_ht
    2 lcd_vt
    60、つまり、double lcd_ht または double lcd_dclk_freq のいずれかです。

  2. 4つ目はバックライト関連の設定です。バックライト関連のパラメータを参照してください。

  3. パート 5: CPU インターフェイスの詳細設定。ここでは、lcd_cpu_te と lcd_cpu_mode が有効になっています。これは、te トリガーが使用され、トリガー間隔が指定されていることを意味します。これは非常に重要な設定です。

  4. 6 番目の部分にはエフェクト関連の設定が表示されます。ここでの lcd_frm の有効化も重要な設定です。クリックすると詳細な意味が表示されます。

  5. パート 7、ピンと電源の設定。ここで te をトリガするためには lcd_vsync も設定する必要がありますが、このフットの関数定義は pinctrl-0 に既に含まれています。ここでピンのセットをカスタマイズします。リファレンスRGBと

I8080のピン構成図 I8080のビット幅とピクセルフォーマット(色数)を決めて、どのピンに接続する必要があるかを表で決定します。電源とピンのパラメータを参照してください。

&pio {
    I8080_8bit_pins_a: I8080_8bit@0 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,function = "I8080_8bit";
        allwinner,muxsel = <2>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
    };
    I8080_8bit_pins_b: I8080_8bit@1 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        PD19", "PD20", "PD21";
        allwinner,function = "I8080_8bit_suspend";
        allwinner,muxsel = <7>;
        allwinner,drive = <3>;
        allwinner,pull = <0>;
	};
};
&lcd0 {
    /* part 1 */
    lcd_used = <1>;
    lcd_driver_name = "s2003t46g";
    /* part 2 */
    lcd_if = <1>;
    lcd_cpu_if = <14>;
    /* part 3 */
    lcd_x = <240>;
    lcd_y = <320>;
    lcd_width = <108>;
    lcd_height = <64>;
    lcd_dclk_freq = <16>;
    lcd_hbp = <20>;
    lcd_ht = <298>;
    lcd_hspw = <10>;
    lcd_vbp = <8>;
    lcd_vt = <336>;
    lcd_vspw = <4>;
    /* part 4 */
    lcd_pwm_used = <1>;
    lcd_pwm_ch = <8>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_bright_curve_en = <1>;
    /* part 5 */
    lcd_cpu_mode = <1>;
    lcd_cpu_te = <1>;
    /* part 6 */
    lcd_frm = <1>;
    lcd_gamma_en = <0>;
    lcd_cmap_en = <0>;
    lcd_rb_swap = <0>;
    /* part 7 */
    lcd_power = "vcc-lcd";
    lcd_pin_power = "vcc-pd";
    ;reset pin
    lcd_gpio_0 = <&pio PD 9 1 0 3 1>;
    ;cs pin
    lcd_gpio_1 = <&pio PD 10 1 0 3 0>;
    pinctrl-0 = <&I8080_8bit_pins_a>;
    pinctrl-1 = <&I8080_8bit_pins_a>;
};

4.6 LVDSインターフェース

4.6.1 概要

LVDS は、Low Voltage Differential Signaling の略で、低電圧差動信号インターフェイスです。

4.6.2 LVDS シングルリンクの標準構成

LVDS インターフェイスの場合、lcd0 に対応する lvds ピンと lcd1 に対応する lvds ピンは固定されており、異なります。

lvds プロトコルにはデータを送信する機能がないため、通常、画面側は初期化する必要がなく、SoC 側のみを初期化する必要があります。したがって、ここでの lcd_driver_name はまだ「default_lcd」のままですが、もちろん、次のようにすることもできます。

初期化の起動遅延に対して特別な最適化が行われます。

以下は、単一リンク LVDS 画面の典型的なboard.dts 設定例です。この例では、空行を使用して設定がいくつかの部分に分割されています。

  1. 最初の部分は、構成が使用されるかどうか、およびどのスクリーン ドライバーを使用するかを決定します。lcd_driver_name は、初期化にどのスクリーン
    ドライバーを使用するかを決定します。

  2. 2 番目の部分は、構成が lvds インターフェイスと単一リンクであるかどうかを決定することです。
    ヒント
    Dual Link 画面の場合は、lcd_lvds_if を 1 に変更するだけでなく、lcd1 のピンも下に移動する、つまり PD0 ~ PD9 と PD10 の合計を設定する必要があります。

PD19 の合計 20 ピンは lvds ピン機能 (機能 3) です。もちろん、画面に合わせて画面タイミングも変更する必要があります。

  1. 3 番目の部分は、SoC 内の LCD モジュールの送信タイミングを決定します。画面タイミング パラメーターの説明を確認してください。

  2. 4つ目はバックライト関連の設定です。バックライト関連のパラメータを参照してください。

  3. パート 5、lvds インターフェイスの詳細設定。

  4. 6 番目の部分にはエフェクト関連の設定が表示されます。

  5. パート 7、ピンと電源の設定。電源とピンのパラメータを参照してください。

&lcd0 {
    /* part 1 */
    lcd_used = 1
    lcd_driver_name = "default_lcd";
    /* part 2 */
    lcd_if = 3
    lcd_lvds_if = 0
    /* part 3 */
    lcd_x = 1280
    lcd_y = 800
    lcd_width = 150
    lcd_height = 94
    lcd_dclk_freq = 70
    lcd_hbp = 20
    lcd_ht = 1418
    lcd_hspw = 10
    lcd_vbp = 10
    lcd_vt = 814
    lcd_vspw = 5
    /* part 4 */
    lcd_pwm_used = 1
    lcd_pwm_ch = 0
    lcd_pwm_freq = 50000
    lcd_pwm_pol = 0
    lcd_pwm_max_limit = 255
    lcd_backlight = 50
    lcd_bright_curve_en = 0
    lcd_bl_en = <&pio PD 21 1 0 3 1>;
    /* part 5 */
    lcd_lvds_colordepth = 1
    lcd_lvds_mode = 0
    /* part 6 */
    lcd_frm = 1
    lcd_hv_clk_phase = 0
    lcd_hv_sync_polarity= 0
    lcd_gamma_en = 0
    lcd_cmap_en = 0
    /* part 7 */
    lcd_power = "vcc-lcd"
    pinctrl-0 = <&lvds0_pins_a>;
    pinctrl-1 = <&lvds0_pins_b>;
};

4.6.3 LVDS デュアルリンクの一般的な構成

デュアルリンク画面の場合:

  1. lcd_lvds_if は 1 (シナリオ 1) または 2 (シナリオ 2) に設定されます。
  2. ピン構成に関しても、4 データ レーンから 8 データ レーンに変更され、clk レーンのピンは合計 20 になります。

シナリオ 1、画面を 8 つのデータ レーンに物理的に接続すると、SoC はピクセルの半分、奇数ピクセルまたは偶数ピクセルを 4 レーンごとに送信します。

&lcd1 {
    lcd_used = <1>;
    lcd_driver_name = "bp101wx1";
    lcd_backlight = <50>;
    lcd_if = <3>;
    lcd_x = <2560>;
    lcd_y = <800>;
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_dclk_freq = <138>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <2>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <40>;
    lcd_ht = <2836>;
    lcd_hspw = <20>;
    lcd_vbp = <10>;
    lcd_vt = <814>;
    lcd_vspw = <5>;
    lcd_lvds_if = <1>;
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode = <0>;
    lcd_frm = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_fsync_en = <0>;
    lcd_fsync_act_time = <1000>;
    lcd_fsync_dis_time = <1000>;
    lcd_fsync_pol = <0>;
    deu_mode = <0>;
    lcdgamma4iep = <22>;
    smart_color = <90>;
    lcd_bl_en = <&pio PJ 27 1 0 3 1>;
    lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
    lcd_pin_power = "bldo5";
    lcd_power = "dc1sw";
    pinctrl-0 = <&lcd1_lvds2link_pins_a>;
    pinctrl-1 = <&lcd1_lvds2link_pins_b>;
};

シナリオ 2 (一部の IC でサポートされています)。2 つの画面が物理的に接続されています。各画面には 4 つのレーンがあります。2 つの画面は同じモデルで、同じ解像度とタイミングです。現時点では、一部の IC は各画面へのすべてのピクセルの送信をサポートしています。 、成し遂げる

デュアルディスプレイ(信号上でデュアル表示)ですが、このときlcdタイミングは1画面のタイミングであり、lcd_lvds_ifが2であることに注意してください。

lcd1: lcd1@01c0c001 {
    lcd_used = <1>;
    lcd_driver_name = "bp101wx1";
    lcd_backlight = <50>;
    lcd_if = <3>;
    lcd_x = <1280>;
    lcd_y = <800>;
    lcd_width = <150>;
    lcd_height = <94>;
    lcd_dclk_freq = <70>;
    lcd_pwm_used = <0>;
    lcd_pwm_ch = <2>;
    lcd_pwm_freq = <50000>;
    lcd_pwm_pol = <1>;
    lcd_pwm_max_limit = <255>;
    lcd_hbp = <20>;
    lcd_ht = <1418>;
    lcd_hspw = <10>;
    lcd_vbp = <10>;
    lcd_vt = <814>;
    lcd_vspw = <5>;
    lcd_lvds_if = <2>;
    lcd_lvds_colordepth = <0>;
    lcd_lvds_mode = <0>;
    lcd_frm = <0>;
    lcd_hv_clk_phase = <0>;
    lcd_hv_sync_polarity= <0>;
    lcd_gamma_en = <0>;
    lcd_bright_curve_en = <0>;
    lcd_cmap_en = <0>;
    lcd_fsync_en = <0>;
    lcd_fsync_act_time = <1000>;
    lcd_fsync_dis_time = <1000>;
    lcd_fsync_pol = <0>;
    deu_mode = <0>;
    lcdgamma4iep = <22>;
    smart_color = <90>;
    lcd_bl_en = <&pio PJ 27 1 0 3 1>;
    lcd_gpio_0 = <&pio PI 1 1 0 3 1>;
    lcd_pin_power = "bldo5";
    lcd_power = "dc1sw";
    pinctrl-0 = <&lcd1_lvds2link_pins_a>;
    pinctrl-1 = <&lcd1_lvds2link_pins_a>;
};

4.7 RGBとI8080のピン構成図

画像-20221129120014562

図 4-8: pinmux

4.8 sys_config.fexからboard.dtsiへの移行に関する注意事項

標準化やその他の理由により、一部のプラットフォームでは、board.dtsi で構成が実装されています。ここではboard.dtsiを修正する際の注意点を説明します。

4.8.1 ピンの定義

RGB 画面または LVDS 画面を構成する場合、複雑な定義は必要なく、どのピンを構成する必要があるかを知る必要も、lcd0_suspend ノードも必要ありません。ここで、rgb24_pins_a という名前は

一度定義すると、直接使用できます。通常、LCD スクリーンに直接利用できる構成はコメントに記載されています。カーネル ディレクトリの Arch/arm/boot/dts または Arch/arm64/boot/ の下にある platform-pinctrl を使用できます。 dts.dtsi テキスト

ファイル内で見つけてください。

例:

pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//休眠时候的定义,io_disable

もちろん、名前が既存の名前と重複しない限り、フィートのセットをカスタマイズして、board.dtsi に書き込むこともできます。

標準化のため、すべてのプラットフォームで一貫した名前を維持します。接尾辞 a はピンが有効であることを意味し、b はデバイスがオフのときに io_disable が使用されることを意味します。

現在、次のピン定義が利用可能です。

表 4-2: 表示端子名表
ピン名 説明する
rgb24_pins_a および rgb24_pins_b RGB 画面インターフェイス、データ ビット幅は 24、RGB888
rgb18_pins_a および rgb18_pins_b RGB 画面インターフェイス、データ ビット幅は 16、RGB666
lvds0_pins_a と lvds0_pins_b シングルリンク LVDS インターフェイス 0 ピン定義 (メイン ディスプレイ lcd0)
lvds1_pins_a および lvds1_pins_b シングルリンク LVDS インターフェース 1 ピン定義 (メインディスプレイ lcd0)
lvds2link_pins_a と lvds2link_pins_b デュアルリンク LVDS インターフェイスのピン定義 (メイン ディスプレイ lcd0)
lvds2_pins_a と lvds2_pins_b シングルリンク LVDS インターフェース 0 ピン定義 (メインディスプレイ lcd1)
lvds3_pins_a と lvds3_pins_b シングルリンク LVDS インターフェース 1 ピン定義 (メインディスプレイ lcd1)
lcd1_lvds2link_pins_a と lcd1_lvds2link_pins_b デュアルリンク LVDS インターフェースのピン定義 (メインディスプレイ LCD1)
dsi4lane_pins_a と dsi4lane_pins_b DSI 画面インターフェースのピン定義、4lane、その他のレーン番号の場合のみ
4.8.2 電源の定義

旧SDKでは電源の定義を意識する必要はなく、lcd_powerなどの属性にaxpのエイリアス文字列を直接割り当てることができましたが、新SDKでは特定の電源を使用する必要がある場合、まず最初にしなければなりません

これは disp ノードで定義されており、lcd 部分で使用される文字列は disp で定義された文字列と一致している必要があります。たとえば、次の例:

disp: disp@01000000 {
    disp_init_enable = <1>;
    disp_mode = <0>;
    /* VCC-LCD */
    dc1sw-supply = <&reg_sw>;
    /* VCC-LVDS and VCC-HDMI */
    bldo1-supply = <&reg_bldo1>;
    /* VCC-TV */
    cldo4-supply = <&reg_cldo4>;
};

このうち「-supply」は固定で、その前の文字列は任意ですが、わかりやすい名前を付けることをお勧めします。次の <®_sw> のようなものは、board.dtsi のregulator0 ノードにある必要があります。

次に、lcd0 ノードで、reg_sw を使用する場合は、次のように記述します。dc1sw は、dc1sw-supply に対応します。

lcd_power=”dc1sw”

u-boot 内にも axp ドライバとディスプレイドライバが存在するため、カーネルと同様に同じ設定を読み込みますが、相互に互換性を持たせるため、命名時に以下の制限があります。

u-boot 2018 では、axp ドライバーは bldo1 などの axp チップで定義された名前のみを認識するため、xxxsupply に名前を付けるときは、axp チップの定義に従って名前を付けることが最善です。

4.8.3 その他の注意事項

board.dtsi には、lcd0 のみが含まれていて lcd1 が含まれていない場合や、tv0 のみが含まれていて tv1 が含まれていない場合があります。この時点で追加したい場合は、カーネル ディレクトリ Arch/arm/boot/dts または Arch/ の下にある対応するプラットフォームを参照する必要があります。 arm64/ブーツ/dts。

.dtsi ファイル。最も重要なことは、@ の後のアドレス文字列がカーネル内の定義と一致している必要があることです。次に例を示します。

lcd1: lcd1@01c0c000

5 ハードウェアパラメータの説明

5.1 LCD インターフェースパラメータの説明

5.1.1 lcd_driver_name

LCD スクリーン ドライバーの名前 (文字列) は、スクリーン ドライバーの名前と一致する必要があります。

5.1.2 液晶モデル名

LCD スクリーンのモデル名 (オプション) を同じスクリーン ドライバーで使用して、異なるスクリーンをさらに区別することができます。

5.1.3 lcd_if

液晶インターフェース

対応する値を設定することの対応する意味は次のとおりです。

0:HV RGB接口
1:CPU/I80接口
2:Reserved
3:LVDS接口
4:DSI接口
5.1.4 lcd_hv_if

液晶 HV パネル インターフェース

このパラメータは、lcd_if=0 の場合にのみ有効です。RGB 同期画面でいくつかのインターフェイス タイプを定義します。

対応する値を設定することの対応する意味は次のとおりです。

0:Parallel RGB
8:Serial RGB
10:Dummy RGB
11:RGB Dummy
12:Serial YUV (CCIR656)
5.1.5 lcd_hv_clk_phase

LCD HV パネル クロック位相

このパラメータは、lcd_if=0 の場合にのみ有効です。RGB同期画面のクロックとデータの位相関係を定義します。合計 4 段階の調整が可能です。

対応する値を設定することの対応する意味は次のとおりです。

0: 0 degree
1: 90 degree
2: 180 degree
3: 270 degree
5.1.6 lcd_hv_sync_polarity

液晶 HV パネル 同期信号 極性

このパラメータは、lcd_if=0 の場合にのみ有効です。RGB 同期画面の hsync と vsync の極性を定義します。

対応する値を設定することの対応する意味は次のとおりです。

0:vsync active low,hsync active low
1:vsync active high,hsync active low
2:vsync active low,hsync active high
3:vsync active high,hsync active high
5.1.7 lcd_hv_srgb_seq

LCD HV パネル シリアル RGB 出力 シーケンス

このパラメータは、lcd_if=0 および lcd_hv_if=8 (シリアル RGB) の場合にのみ有効です。

奇数行の RGB 出力の順序を定義します。

0: Odd lines R-G-B; Even line R-G-B
1: Odd lines B-R-G; Even line R-G-B
2: Odd lines G-B-R; Even line R-G-B
4: Odd lines R-G-B; Even line B-R-G
5: Odd lines B-R-G; Even line B-R-G
6: Odd lines G-B-R; Even line B-R-G
8: Odd lines R-G-B; Even line B-R-G
9: Odd lines B-R-G; Even line G-B-R
10: Odd lines G-B-R; Even line G-B-R
5.1.8 lcd_hv_syuv_seq

LCD HV パネル シリアル YUV 出力 シーケンス

このパラメータは、lcd_if=0 および lcd_hv_if=12 (シリアル YUV) の場合にのみ有効です。

YUV 出力形式を定義します。

0:YUYV
1:YVYU
2:UYVY
3:VYUY
5.1.9 lcd_hv_syuv_fdly

液晶 HV パネル シリアル YUV F ライン 遅延

このパラメータは、lcd_if=0 および lcd_hv_if=12 (シリアル YUV) の場合にのみ有効です。

CCIR656 をエンコードするときに、有効な行と比較して F が遅延される行数を定義します。

0:F toggle right after active video line
1:Delay 2 lines (CCIR PAL)
2:Delay 3 lines (CCIR NTSC)
5.1.10 lcd_cpu_if

液晶 CPU パネル インターフェース

このパラメータは、lcd_if=1 の場合にのみ有効です。具体的なタイミングについては、RGB および I8080 ピン構成図の CPU 列を参照してください。

対応する値を設定することの対応する意味は次のとおりです。

0:18bit/1cycle (RGB666)
2: 16bit/3cycle (RGB666)
4:16bit/2cycle (RGB666)
6:16bit/2cycle (RGB666)
8:16bit/1cycle (RGB565)
10:9bit/1cycle (RGB666)
12:8bit/3cycle (RGB666)
14:8bit/2cycle (RGB565)
5.1.11 lcd_cpu_te

液晶 CPU パネルの引き裂き効果

対応する値を設定することの意味は、0 に設定するとリフレッシュ間隔時間が lcd_ht × lcd_vt になり、1 または 2 に設定するとリフレッシュ間隔時間が 2 te パルスになることです。

液晶 CPU パネルの引き裂き効果

対応する値を設定することの意味は、0 に設定するとリフレッシュ間隔時間が lcd_ht × lcd_vt になり、1 または 2 に設定するとリフレッシュ間隔時間が 2 te パルスになることです。

0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge
5.1.12 lcd_lvds_if

液晶 LVDS パネル インターフェイス

対応する値を設定することの対応する意味は次のとおりです。

0:Single Link( 1 clock pair+3/4 data pair)
1:Dual Link(8 data lane,每4条lane接受一半像素,奇数像素或者偶数像素)
2: Dual Link (每4条lane接受全部像素,常用于物理双屏,且两个屏一样)

lcd_lvds_if が 2 のシナリオは、2 つの同一の画面を接続し、2 つの画面が同じコンテンツを表示することですが、このとき、LCD の他のタイミングは 1 つの画面のタイミングを埋めるだけで済みます。

5.1.13 lcd_lvds_color Depth

LCD LVDS パネルの色深度

対応する値を設定することの対応する意味は次のとおりです。

0:8bit per color(4 data pair)
1:6bit per color(3 data pair)

5.1.14 lcd_lvds_mode

液晶LVDSモード

このパラメータは、lcd_lvds_bitwidth=0 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです (次の図を参照)。

0:NS mode
1:JEIDA mode

画像-20221129173201413

図 5-1: lvds モード
5.1.15 lcd_dsi_if

液晶 MIPI DSI パネル インターフェイス

このパラメータは、lcd_if=4 の場合にのみ有効です。2 種類の MIPI DSI 画面を定義します。

対応する値を設定することの対応する意味は次のとおりです。

0:Video mode
1:Command mode
2:video burst mode

注: ビデオ モードの LCD 画面は、ht や hbp などのタイミング パラメータの定義を使用して画面をリアルタイムで更新します。コマンド モードの画面には画面上に表示バッファがあり、通常は TE ピンがあります。

5.1.16 lcd_dsi_lane

LCD MIPI DSI パネル データ レーン番号

このパラメータは、lcd_if=4 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです。

1:1 data lane
2:2 data lane
3:3 data lane
4:4 data lane
5.1.17 lcd_dsi_format

LCD MIPI DSI パネル データ ピクセル フォーマット

このパラメータは、lcd_if=4 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです。

0:Package Pixel Stream, 24bit RGB
1:Loosely Package Pixel Stream, 18bit RGB
2:Package Pixel Stream, 18bit RGB
3:Package Pixel Stream, 16bit RGB
5.1.18 lcd_dsi_the

液晶 MIPI DSI パネル ティア エフェクト

このパラメータは、lcd_if=4 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです。

0:frame trigged automatically
1:frame trigged by te rising edge
2:frame trigged by te falling edge

注: 0 に設定すると、リフレッシュ間隔時間は lcd_ht × lcd_vt になり、1 または 2 に設定すると、リフレッシュ間隔時間は 2 te パルスになります。

この機能は、同期信号として画面側から SoC 側に信号を送信することであり、この変数が有効な場合、SoC 内の表示割り込みがこの外部ピンによってトリガーされます。

5.1.19 lcd_dsi_port_num

DSI スクリーンポートの数量

このパラメータは、lcd_if=4 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです。

0:一个port
1:两个port

このオプションの機能の 1 つは、1 つの LCD 画面に 8 レーンがある場合、1 つのドライバー IC のみを初期化する必要がある場合は、この設定を 1 に設定することです。両方のドライバー IC を初期化する必要がある場合は、この設定を 0 に設定します。そして、初期化には lcd_source.c で定義された関数を使用します。

5.1.20 lcd_tcon_mode

Tconモード

このパラメータは、lcd_if=4 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです。

0:normal mode
1:tcon master mode(在第一次发送数据同步)
2::tcon master mode(每一帧都同步)
3:tcon slave mode(依靠master mode来启动)
4:one tcon driver two dsi(8条lane)
5.1.21 lcd_slave_tcon_num
5.1.21 lcd_slave_tcon_num

スレーブ Tcon のシリアル番号

このパラメータは、lcd_if=4 および lcd_tcon_mode が 1 または 2 の場合にのみ有効です。マスター モードの tcon にスレーブ tcon のシーケンス番号を伝えるために使用されます。

対応する値を設定することの対応する意味は次のとおりです。

0:tcon_lcd0
1:tcon_lcd1
5.1.22 lcd_tcon_en_odd_even_div

このパラメータは、lcd_if=4 および lcd_tcon_mode=4 の場合にのみ有効です。

対応する値を設定することの対応する意味は次のとおりです。

0:tcon将一帧图像分左右两半来发送给两个DSI模块
1:tcon将一帧图像分奇偶像素来发给两个DSI模块
5.1.23 lcd_sync_pixel_num

このパラメータは、lcd_if=4 および lcd_tcon_mode が 2 または 3 の場合にのみ有効です。

tconから同期の開始ピクセルを設定します。

整数: lcd_ht 以下

5.1.24 lcd_sync_line_num

このパラメータは、lcd_if=4 および lcd_tcon_mode が 2 または 3 の場合にのみ有効です。

tcon からの同期開始ラインを設定します。

整数: lcd_vt 以下

5.1.25 lcd_cpu_mode

LCD CPU モード、制御。

対応する値を設定することの意味は、0 に設定するとリフレッシュ間隔時間が lcd_ht × lcd_vt になり、1 または 2 に設定するとリフレッシュ間隔時間が 2 te パルスになることです。

0:中断自动根据时序,由场消隐信号内部触发。
1:中断根据数据Block的counter触发或者由外部te触发。
5.1.26 lcd_fsync_ja

LCD は、同期のための画像出力をセンサーにトリガーするために使用される fsync 機能を有効にし、一部の IC はこれをサポートしています。

0:disable
1:enable
5.1.27 lcd_fsync_act_time

LCDのfsync機能、有効レベル時間長、単位:ピクセルクロック数。

0~lcd_ht-1
5.1.28 lcd_fsync_dis_time

LCDのfsync関数、無効レベル時間の長さ、単位:ピクセルクロック数。

0~lcd_ht-1
5.1.29 lcd_fsync_pol

LCD の fsync 機能のアクティブ レベルの極性。

0:有效电平为低
1:有效电平为高

5.2 画面タイミングパラメータの説明

次のパラメータは画面調整にとって非常に重要であり、送信側 (SoC) によって送信されるデータのタイミングを決定します。送信側と受信側のデバッグを伴うため、解像度とサイズ以外の他の値は絶対に間違っているわけではありません。

はい、同じ解像度と同じインターフェースを持つ 2 つの画面は異なる値を持つ可能性があります。

入手方法は以下のとおりです。

  1. 液晶画面メーカーにお問い合わせください。
  2. 以下の図に示すように、スクリーンのマニュアルまたはドライバー IC のマニュアルから見つけてください (これらの文書についてはスクリーンのメーカーにお問い合わせください)。

画像-20221129174730302

図 5-2: lcd_info1

画像-20221129174744511

図 5-3: lcd_info2
  1. 最初の 2 つのステップで正しく設定できない場合は、VESA 規格、主に DMT および CVT 規格に従って設定できます。

このうち、DMT とは「VESA およびコンピューター ディスプレイ モニター タイミングに関する業界標準およびガイドライン (DMT)」を指し、一般的に使用されるさまざまな解像度が含まれる規格をダウンロードします。

タイミング。CVT は、指定された解像度、リフレッシュ レート、およびその他のパラメーターのタイミングを計算するための一般的な式を提供する「VESA 調整ビデオ タイミング (CVT) 規格」を指します。

この Excel シートをダウンロードして、VESA 調整ビデオ タイミング ジェネレーターを計算できます。

次の 2 つの式から、ドライバーは他のいくつかの既知のパラメーターに基づいて lcd_hfp と lcd_vfp を自動的に計算するため、lcd_hfp パラメーターと lcd_vfp パラメーターを設定する必要はありません。

lcd_ht = lcd_x + lcd_hspw + lcd_hbp + lcd_hfp
lcd_vt = lcd_y + lcd_vspw + lcd_vbp + lcd_vfp
5.2.1 液晶_x

ディスプレイの水平ピクセル数。画面解像度の幅です。

5.2.2 lcd_y

表示画面の垂直線の数。これは最高の画面解像度です。

5.2.3 lcd_ht

水平方向の合計時間

連続する dclk サイクルの合計数を指します。以下を参照してください:

画像-20221129175141962

図 5-4: 液晶ディスプレイ
5.2.4 lcd_hbp

横型バックポーチ

これは、有効な行間の dclk サイクル数、行同期信号 (hsync) の開始、および同期信号領域を含む有効なデータの開始を指します。上の図を参照してください。hspw セグメントが含まれていることに注意してください。

これには hspw セグメントが含まれていることに注意してください
。つまり、lcd_hbp=実際の hbp+実際の hspw

5.2.5 lcd_hspw

水平同期パルス幅

水平同期信号の幅を指します。単位は 1 dclk の時間 (つまり 1 データサイクルの時間) です。上の写真を参照してください。

5.2.6 lcd_vt

垂直合計時間

フィールド内の総行数を指します。以下を参照してください:

画像-20221129182148157

図 5-5:lcdvt
5.2.7 lcd_vbp

縦型バックポーチ

フィールド同期信号 (vsync) の開始と有効なデータ ラインの開始の間のライン数を指します (フィールド同期信号領域を含みます)。

説明する

これには、vspw セグメント、つまり lcd_vbp=actual vbp+actual vspw が含まれます。

5.2.8 lcd_vspw

垂直同期パルス幅

フィールド同期信号の幅を指します。単位は行です。上の写真を参照してください。

5.2.9 lcd_dclk_freq

ドットクロック周波数

送信ピクセルの送信周波数。単位はMHzです。

fps = (lcd_dclk_freq×1000×1000) / (ht×vt)。

この値は次の式に従って計算されます。

lcd_dclk_freq=lcd_ht lcd_vt fps

知らせ:

  1. 次の 3 つのパラメータは画面マニュアルから取得し、fps は一般的に 60 です。
  2. シリアルインターフェイスの場合、1 ピクセルを送信するのに 2 ~ 3 サイクルかかります。
lcd_dclk_freq * cycles = lcd_ht*lcd_vt*fps

または

lcd_dclk_freq = lcd_ht*cycles*lcd_vt*fps
5.2.10 液晶幅

液晶パネルの幅(mm)

このパラメータは、LCD 画面の物理的な幅を mm 単位で表します。dpiの計算に使用されます。

5.2.11 lcd_height

液晶パネルの高さ(mm)

このパラメータは、LCD 画面の物理的な高さを mm 単位で表します。dpiの計算に使用されます。

5.3 バックライト関連パラメータ

現在、PWM バックライト調整が広く使用されており、その原理は、PWM パルス スイッチによって生成される高周波フリッカー効果を利用して人間の目を欺き、デューティ サイクルを調整することで明るさを調整することです。

5.3.1 lcd_pwm_used

pwmを使用するかどうか。

このパラメータは、バックライトの輝度制御に pwm を使用するかどうかを識別します。

5.3.2 lcd_pwm_ch

使用されるPwmチャネル

このパラメータは、使用される Pwm チャネルを識別します。ここでは、SoC のどの Pwm チャネルが使用されているかを指します。回路図の接続を見ることで知ることができます。

5.3.3 lcd_pwm_freq

液晶バックライトのPWM周波数

このパラメータは、PWM 信号の周波数を Hz 単位で設定します。

注意:
周波数が低すぎるとちらつきが見えやすくなり、周波数が速すぎるとバックライト調整効果が低下します。一部の画面マニュアルには、許容される PWM 周波数範囲が示されています。設定については、画面マニュアルの固定範囲に従ってください。
低輝度ではちらつきが発生しやすくなりますが、これは通常の現象であり、これは PWM バックライトの場合に発生することが現在知られています。

5.3.4 lcd_pwm_pol

LCD バックライト PWM 極性

このパラメータは、PWM 信号のデューティ サイクルの極性を設定します。対応する値を設定することの対応する意味は次のとおりです。

0:active high
1:active low
5.3.5 lcd_pwm_max_limit

LCD バックライトの PWM 最大制限、輝度値で表現

たとえば、150 は、バックライトが 150 までしか調整できず、0 ~ 255 の範囲の輝度値が 0 ~ 150 の範囲に線形にマッピングされることを意味します。バックライトの最大輝度を制御し、消費電力を節約するために使用されます。

5.3.6 lcd_bl_ja

バックライト イネーブル ピン (オプション)、回路図にあるかどうかを確認してください。バックライト回路の電圧を有効または無効にするために使用されます。

例: lcd_bl_en = ポート:PD24<1><2><1>

意味: PD24 がハイレベルを出力すると LCD バックライトをオンにします。プルダウンします。デフォルトはハイレベルです。

• 最初の山かっこ: 関数の割り当て。1 が出力されます。

• 2 番目の山括弧: 内蔵抵抗。0 が使用される場合は内部抵抗のハイインピーダンス状態を示し、1 の場合は内部抵抗がプルアップされていることを意味し、2 の場合は内部抵抗がプルアップされていることを意味します。内部抵抗がプルダウンします。デフォルトを使用すると、デフォルト状態、つまり抵抗がオンになることを表します。

引く。他のデータは無効です。

• 3 番目の山かっこ: 運転能力。デフォルトの表の運転能力はレベル 1 です。

• 4 番目の山括弧: レベル; 0 は低レベル、1 は高レベルです。

スクリーン ドライバーは、オン/オフ制御のために対応するインターフェイスを呼び出す必要があります。

説明する

一般的にハイレベルが有効となりますが、ハードウェアによるプルアップによるバックライトの早期点灯を防ぐため、内部抵抗をプルダウンに設定することを推奨します。デフォルトのレベルを高レベルとして入力してください。これは、uboot が示したものです。

滑らかでちらつきのない、コアまでの表示。

5.3.7 lcd_bl_n_percent

バックライト マッピング値、n は (0 ~ 100)

この機能は、明るさが非線形である LCD 画面用で、設定された明るさカーブに従って明るさの変化を調整し、明るさの変化をより線形にします。

たとえば、lcd_bl_50_percent = 60 は、50% の輝度値が 60% に調整されること、つまり、輝度が元の値より 10% 増加することを意味します。

説明する

このプロパティを不適切に変更すると、バックライト調整効果が低下する可能性があります。

5.3.8 lcd_バックライト

バックライトのデフォルト値、0 ~ 255。

この属性は、u​​boot のロゴ表示段階での明るさを決定します。カーネルに入るときに、保存された設定が読み取られて明るさが決定されます。

説明する

ロゴを表示する段階では、一般的に比較的明るい明るさが要求され、業界でも慣例となっている。

5.4 ディスプレイエフェクト関連パラメータ

5.4.1 lcd_frm

液晶フレームレート変調器

FRM は、PIN の削減によって引き起こされる色深度の問題を解決するためのものです。

このパラメータ設定の対応する意味は次のとおりです。

0:RGB888 -- RGB888 direct
1:RGB888 -- RGB666 dither
2:RGB888 -- RGB565 dither

一部の LCD 画面のピクセル形式は 18 ビット色深度 (RGB666) または 16 ビット色深度 (RGB565) です。表示が 24 ビットに達するように、FRM 機能をオンにし、ディザによって色深度を補正することをお勧めします。 -ビット色深度 (RGB888)

効果。下図に示すように、上の図は色深度 RGB66 の LCD 画面表示、下の図はディザをオンにした後の表示ですが、ディザをオンにした後の色のグラデーションは過度に滑らかです。

画像-20221130172026584

図 5-6: lcd_frm が開いている状態

画像-20221130172041420

図 5-7: lcd_frm を閉じる
5.4.2 lcd_gamma_ja

LCDガンマ補正有効

対応する値を設定することの対応する意味は次のとおりです。

0:Lcd的Gamma校正功能关闭
1:Lcd的Gamma校正功能开启

1 に設定すると、スクリーン ドライバーで lcd_gamma_tbl[256] を割り当てる必要があります。

5.4.3 lcd_cmap_ja

LCD カラーマップの有効化

対応する値を設定することの対応する意味は次のとおりです。

0:Lcd的色彩映射功能关闭
1:Lcd的色彩映射功能开启

1 に設定すると、Lcd カラー マップ テーブルを lcd_cmap_tbl [2][3][4] に割り当てる必要があります。

各ピクセルには R、G、B の 3 つの単位があります。4 ピクセルごとに選択範囲が構成され、合計 12 のオプションがあります。配列の最初の次元は奇数行と偶数行を表し、2 番目の次元はピクセルの RGB を表し、3 番目の次元はピクセル番号を表します。

のコンテンツは、その場所にマッピングされたコンテンツを表します。

LCD CMAP はピクセルのマッピング出力機能であり、特別なピクセル配列を持つ LCD 画面のみを設定する必要があります。

LCD CMAP では、各行の 4 つのピクセルを合計ユニットとして定義し、各ピクセルは R、G、B の 3 つの小ユニット、合計 12 の小ユニットに分割されます。lcd_cmap_tbl を通じてマッピング関係を定義すると、出力の各小さな単位を次のように定義できます。

これは、12 個の小さなユニットの 1 つにマッピングされることを目的としています。

__u32 lcd_cmap_tbl[2][3][4] = {
    {
        {LCD_CMAP_G0,LCD_CMAP_B1,LCD_CMAP_G2,LCD_CMAP_B3},
        {LCD_CMAP_B0,LCD_CMAP_R1,LCD_CMAP_B2,LCD_CMAP_R3},
        {LCD_CMAP_R0,LCD_CMAP_G1,LCD_CMAP_R2,LCD_CMAP_G3},
    },
    {
        {LCD_CMAP_B3,LCD_CMAP_G2,LCD_CMAP_B1,LCD_CMAP_G0},
        {LCD_CMAP_R3,LCD_CMAP_B2,LCD_CMAP_R1,LCD_CMAP_B0},
        {LCD_CMAP_G3,LCD_CMAP_R2,LCD_CMAP_G1,LCD_CMAP_R0},
    },
};

上記と同様に、上の3行が奇数行の画素配列を表し、下の3行が偶数行の画素配列を表す。

4 ピクセルごとが単位であり、最初の列は 4 ピクセルごとの最初のピクセル マップを表し、2 列目は 4 ピクセルごとの 2 番目のピクセル マップを表します。

上で定義したように、ピクセルの出力形式は次の図のようになります。

画像-20221130172721739

図 5-8: cmap
5.4.4 lcd_rb_swap

tcon モジュールの RGB の R コンポーネントと B コンポーネントを置き換えます。

0:不变
1:调换R分量和B分量

5.5 電源とピンのパラメータ

5.5.1 概要

特定の電源を使用する必要がある場合は、[disp] ノードで定義する必要があり、[lcd] 部分で使用される文字列は disp で定義された文字列と一致している必要があります。たとえば、次の例:

disp: disp@01000000 {
    disp_init_enable = <1>;
    disp_mode = <0>;
    /* VCC-LCD */
    dc1sw-supply = <&reg_sw>;
    /* VCC-LVDS and VCC-HDMI */
    bldo1-supply = <&reg_bldo1>;
    /* VCC-TV */
    cldo4-supply = <&reg_cldo4>;
};

このうち、-supply は固定で、-supply より前の文字列は任意ですが、意味のある名前を付けることをお勧めします。= の後の <®_sw> は、board.dtsi のregulator0 ノードにある必要があります。

次に、lcd0 ノードで、reg_sw を使用したい場合は、次のように記述します。dc1sw は、dc1sw-supply に対応します。

lcd_power=”dc1sw”

u-boot には axp ドライバー、ディスプレイ ドライバー、カーネルも含まれているため、これらはすべて同じ構成を読み込みますが、相互に互換性を持たせるために、名前を付ける際に次の制限があります。

u-boot 2018 では、axp ドライバーは bldo1 などの axp チップで定義された名前のみを認識するため、xxxsupply に名前を付けるときは、axp チップの定義に従って名前を付けることが最善です。

5.5.2 液晶パワー

上記の考慮事項を参照してください。

示例:lcd_power = “vcc-lcd”

レギュレーターの名前を設定します。構成後、スクリーン ドライバーはオンとオフを制御するために対応するインターフェイスを呼び出す必要があります。

注: オンにする必要がある電源が複数ある場合は、lcd_power1、lcd_power2 などを定義します。

5.5.3 lcd_pin_power

lcd_power の使い方は同じですが、ユーザーが設定した後はスクリーン ドライバーで操作する必要がなくなり、ドライバー フレームワークによってスクリーン ドライバーの前に有効化され、スクリーン ドライバーの後に無効化される点が異なります。

示例:lcd_pin_power = “vcc-pd”

注: 複数のグループが必要な場合は、lcd_pin_power1、lcd_pin_power2 などを追加します。ここでの電源はlcddxの他、pwmに相当するピンの電源であってもよい。

5.5.4 lcd_gpio_0
示例:lcd_gpio_0 = port:PD25<0><0><default><0>

意味: lcd_gpio_0 ピンは PD25 です。

• 最初の山括弧: 関数の割り当て; 0 が入力、1 が出力です。

• 2 番目の山括弧: 内蔵抵抗。0 が使用される場合は内部抵抗のハイインピーダンス状態を示し、1 の場合は内部抵抗がプルアップされていることを意味し、2 の場合は内部抵抗がプルアップされていることを意味します。内部抵抗がプルダウンします。デフォルトを使用すると、デフォルト状態、つまり抵抗がオンになることを表します。

引く。他のデータは無効です。

• 3 番目の山かっこ: ドライブ機能。デフォルトのテーブル ドライブ機能はレベル 1 です。

• 4 番目の山括弧: はデフォルト値を示します。つまり、出力として設定されている場合、ピン出力のレベル、0 はローレベル、1 はハイレベルです。

スクリーン ドライバーは、プルアップとプルダウンを制御するために、対応するインターフェイスを呼び出す必要があります。ピン制御機能の説明を参照してください。

注: 制御する必要がある gpio ピンが複数ある場合は、lcd_gpio_0、lcd_gpio_1 などを定義します。

5.5.5 lcddx

例: lcdd0 = ポート:PD00<3><0>

意味: lcdd0 のこのピン、つまり PD0 は、LVDS 出力として構成されています。

• 最初の山括弧: 機能割り当て; 0 は入力、1 は出力、2 は LCD 出力、3 は LVDS インターフェース出力、7 は無効です。

• 2 番目の山括弧: 内蔵抵抗。0 が使用される場合は内部抵抗のハイインピーダンス状態を示し、1 の場合は内部抵抗がプルアップされていることを意味し、2 の場合は内部抵抗がプルアップされていることを意味します。内部抵抗がプルダウンします。デフォルトを使用すると、デフォルト状態、つまり抵抗がオンになることを表します。

引く。他のデータは無効です。

• 3 番目の山かっこ: ドライブ機能。デフォルトのテーブル ドライブ機能はレベル 1 です。

• 4 番目の山括弧: はデフォルト値を示します。つまり、出力として設定されている場合、ピン出力のレベル、0 はローレベル、1 はハイレベルです。

LCD PIN の構成は次のとおりです。

LCD が HV RGB 画面または CPU/I80 画面の場合、対応する IO ポートを LCD 出力として定義する必要があります (出力 0 の場合、最初の山括弧は 2、出力 1 の場合、最初の山括弧は 2 です)。 3) 。

特定の IO 対応については、設定に関するユーザー マニュアルを参照してください。

LCD PIN のすべての IO はコメントを通じて未定義にすることができ、ディスプレイ ドライバーはコメント IO を初期化しません。

スクリーン ドライバーは、オン/オフ制御のために対応するインターフェイスを呼び出す必要があります。

注: 必ずしも lcdd0 という名前にする必要はありません。別の名前に変更しても、ドライバーには影響しません。これは記憶の便宜のためです。

5.5.6 pinctrl-0 と pinctrl-1

lcd0 ノードを構成するときに、ピンの再利用を構成する必要がある場合、pinctrl-0 と pinctrl-1 を割り当てるだけで済みます。事前に定義されたピンを使用することも、事前に定義された独自のピンを使用することもできます。

カーネル ディレクトリ Arch/arm/boot/dts または Arch/arm64/boot/dts で定義を見つけるには、platform-pinctrl.dtsi を使用します。

例:

pinctrl-0 = <&rgb24_pins_a>;
pinctrl-1 = <&rgb24_pins_b>;//休眠时候的定义,io_disable
表 5-1: 事前に定義されている端子名
ピン名 説明する
rgb24_pins_a および rgb24_pins_b RGB 画面インターフェイス、データ ビット幅は 24、RGB888
rgb18_pins_a および rgb18_pins_b RGB 画面インターフェイス、データ ビット幅は 16、RGB666
lvds0_pins_a と lvds0_pins_b シングルリンク LVDS インターフェイス 0 ピン定義 (メイン ディスプレイ lcd0)
lvds1_pins_a および lvds1_pins_b シングルリンク LVDS インターフェース 1 ピン定義 (メインディスプレイ lcd0)
lvds2link_pins_a と lvds2link_pins_b デュアルリンク LVDS インターフェイスのピン定義 (メイン ディスプレイ lcd0)
lvds2_pins_a と lvds2_pins_b シングルリンク LVDS インターフェース 0 ピン定義 (メインディスプレイ lcd1)
lvds3_pins_a と lvds3_pins_b シングルリンク LVDS インターフェース 1 ピン定義 (メインディスプレイ lcd1)
lcd1_lvds2link_pins_a と lcd1_lvds2link_pins_b デュアルリンク LVDS インターフェースのピン定義 (メインディスプレイ LCD1)
dsi4lane_pins_a と dsi4lane_pins_b 4 レーン DSI 画面インターフェイスのピン定義

足のセットをカスタマイズする

名前が既存の名前と重複しない限り、board.dtsi に記述されます。まず、使用する必要があるピンが大規模 CPU ドメインに属しているか小規模 CPU ドメインに属しているかを判断し、これを使用してピン定義が必要かどうかを判断します。 pio (大規模な CPU) に配置される

ドメイン)、または r_pio (小さな CPU ドメイン) の下にあります。

例:

&pio {
    I8080_8bit_pins_a: I8080_8bit@0 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
            PD19", "PD20", "PD21";
            allwinner,function = "I8080_8bit";
            allwinner,muxsel = <2>;
            allwinner,drive = <3>;
            allwinner,pull = <0>;
        };
        I8080_8bit_pins_b: I8080_8bit@1 {
        allwinner,pins = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
        allwinner,pname = "PD1", "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", "PD8", "PD18", "
        	PD19", "PD20", "PD21";
            allwinner,function = "I8080_8bit_suspend";
            allwinner,muxsel = <7>;
            allwinner,drive = <3>;
            allwinner,pull = <0>;
    };
};

• ピン、特定のピン。

• pname、ピン名、任意に選択してください。

• 機能、ピン機能の名前は、気軽に選択してください。

• muxsel、ピン機能の選択。ポートの仕様に応じて対応する機能を選択してください。

• drive、ドライブ容量。値が大きいほど、ドライブ容量が大きくなります。

・プル、プルアップ、プルダウン 0の場合は内部抵抗がハイインピーダンス状態、1の場合は内部抵抗がプルアップ状態、2の場合は内部抵抗がプルアップされていることを示します。引き下げています。デフォルトを使用すると、デフォルト状態、つまり抵抗プルアップが表されます。その他の番号

データが無効です。

为了规范,我们将在所有平台保持一致的名字,其中后缀为a 为管脚使能,b 的为io_disable 用于设备关闭时。

有时候,你需要用两组不同功能的管脚,可以像下面这样定义即可。

pinctrl-0 = <&rgb24_pins_a>, <&xxx_pins_a>;
pinctrl-1 = <&rgb24_pins_b>, <&xxx_pins_b>;//休眠时候的定义,io_disable

5.6 ESD 静电检测自动恢复功能

这个功能在linux4.9 以及linux 3.10 sunxi-product 分支上实现了,如果需要这个功能,需要完成以下步骤。

首先打开如下内核配置:

画像-20221130174114112

图5-9: ESD 内核配置

修改屏驱动,实现三个回调函数:

如下示例,在屏he0801a068 上添加esd 相关的回调函数。
(linux-4.9/drivers/video/fbdev/sunxi/disp2/disp/lcd/he0801a068.c)。

画像-20221130174231109

图5-10: ESD 屏驱动添加函数

esd_check 函数原型:

S32 esd_check(u32 sel)

作用:是给上层反馈当前屏的状态。

返回值:如果屏正常的话就返回0,不正常的话就返回非0。

sel:显示索引。

由于屏的类型接口众多,不同屏检测屏的状态各异,一般来说是通过驱动接口读取屏的内部信息(id 或者其它寄存器),如果获取正常则认为屏是正常的,获取失

败则认为屏是异常的。比如下面dsi 屏的做法:

画像-20221130174303084

图5-11: ESD 屏驱动函数实现

此外,一般情况下,也会通过dsi 接口读取0x0A 命令(获取power 模式)来判断屏是否正常。

sunxi_lcd_dsi_dcs_read(sel, 0x0A, result, &num)

画像-20221130174341400

图5-12: ESD MIPI 状态寄存器

reset_panel 函数原型:

s32 reset_panel(u32 sel)

作用:当屏幕异常的时候所需要的复位操作。

返回值:复位成功就是0,复位失败非0。

sel:显示索引。

每个屏的初始化都不同,顺序步骤都不一样,总的来说就是执行部分或者完整的屏驱动里面的close_flow 和open_flow 所定义的回调函数。根据实际情况灵活编写

这个函数。

值得注意的是:某些dsi 屏中,需要至少执行过一次sunxi_lcd_dsi_clk_disable(dsi 高速时钟禁止)和sunxi_lcd_dsi_clk_enable(高速时钟使能),否则可能导致

dsi 的读函数异常。

下图是复位函数示例:

画像-20221130174745808

图5-13: ESD 复位函数1

set_esd_info 函数原型:

s32 set_esd_info(struct disp_lcd_esd_info *p_info)

作用:控制esd 检测的具体行为。比如间隔多长时间检测一次,复位的级别,以及检测函数被调用的位置。

返回值:成功设置返回0,否则非0。

p_info:需要设置的esd 行为结构体。

示例:下面图所示,每隔60 次显示中断检测一次(调用esd_check 函数,如果显示帧率是60fps 的话,那么就是1 秒一次),然后将在显示中断处理函数里面执行

检测函数,由esd_check_func_pos 成员决定调用esd_check 函数的位置,如果是0 则在中断之外执行检测函数,之所以有这个选项是因为显示中断资源(中断处

理时间)是非常珍贵的资源,关系到显示帧率的问题。下图中的level 为1 表示复位全志SoC 的LCD 相关模块以及reset_panel 里面的操作,level 为0 的时候表示

仅仅执行reset_panel 里面的操作。

画像-20221130174832573

图5-14: ESD 设置信息函数

可以通过cat /sys/class/disp/disp/attr/sys 获取当前的esd info。

screen 0:
de_rate 594000000 hz, ref_fps:60
mgr0: 2560x1600 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] unblank err[0]
force_sync[0]
dmabuf: cache[0] cache max[0] umap skip[0] overflow[0]
capture: dis req[0] runing[0] done[0,0]
lcd output(enable) backlight( 50) fps:60.9 esd level(1) freq(300) pos(1)
reset(244) 2560x1600
err:0 skip:0 skip T.O:50 irq:73424 vsync:0 vsync_skip:0
BUF en ch[1] lyr[0] z[0] prem[N] fbd[N] a[globl 255] fmt[ 0] fb
[2560,1600;2560,1600;2560,1600] crop[ 0, 0,2560,1600] frame[ 0, 0,2560,1600]
addr[98100000,00000000,00000000] right[00000000,00000000,00000000] flags[0x00] trd[0,0]
depth[ 0]
acquire: 0, 25.5 fps
release: 0, 25.5 fps
display: 0, 25.5 fps

esd level(1) freq(300) pos(1) reset(244)

esd levele 和freq 和pos 的意思请看上面set_esd_info 函数原型的解释。

Reset 后面的数字表示屏复位的次数(也就是esd 导致屏挂掉之后,并且成功检测到并复位的次数)。

此功能可能遇到的问题。

  1. 打静电挂了,但是读出来的值仍然是正确的,此问题无解。

  2. Dsi 读操作卡住了,卡在中断里面了。此问题可能和DSI 的lp 模式下的速率有关系,而lp 的速率又和dclk 的频率有关系。此时可以尝试修改de_dsi_28.c() 文件

中的dsi_basic_cfg 函数,如下图所示红框所示的寄存器值,这个寄存器是Lp 模式时钟分频值,一般来说这个值越小,lp 速率越快,尝试改小看是否还会卡

住。

画像-20221130175036108

图5-15: Lp 模式时钟分频值

6 调试方法

系统起来之后可以读取sysfs 一些信息,来协助调试。

6.1 加快调试速度的方法

很明显,如果你在安卓上调试LCD 屏会比较不方便,安卓编译时间和安卓固件都太过巨大,每次修改内核后,可能都要经过10 几分钟都才能验证,这样效率就太

低下了,可用采用如下方法:

  1. 使用linux 固件而不是安卓固件。SDK 是支持仅仅编译linux 固件,一般是配置lichee 或者longan 的时候选择linux,打包的时候,用lichee 或者longan 根目录

下的build.sh 来打包就行。因为linux 内核小得多,编译更快,更方便调试。

  1. 使用内核来调试LCD 屏。我们知道Uboot 和内核都需要添加LCD 驱动,这样才能快速显示logo,但是uboot 并不方便调试,所以有时候我们需要把uboot 的

显示驱动关掉,专心调试内核的LCD 驱动,调好之后才移植到uboot,另外这样做的一个优点是,我可以非常方便的修改lcd timing 而不需要重烧固件。就是

利用uboot 命令的fdt 命令修改device tree。
比如说:

fdt set lcd0 lcd_hbp <40>

更多命令见fdt help。

如何关闭uboot 显示呢,一般是在uboot 源码路径下inlcude/configs/平台.h 中,注释掉CONFIG_SUNXI_MODULE_DISPLAY 即可,如果是uboot 2018 则是注释

掉configs/平台_defconfig 中CONFIG_DISP2_SUNXI。

6.2 查看显示信息

以下信息是所有信息中最重要的。

cat /sys/class/disp/disp/attr/sys
screen 0:
de_rate 297000000 hz, ref_fps:60
mgr0: 1280x800 fmt[rgb] cs[0x204] range[full] eotf[0x4] bits[8bits] err[0] force_sync[0]
unblank direct_show[false]
lcd output backlight( 50) fps:60.9 1280x 800
err:0 skip:31 irq:1942 vsync:0 vsync_skip:0
BUF enable ch[1] lyr[0] z[0] prem[N] a[globl 255] fmt[ 8] fb[1280, 800;1280,
800;1280, 800] crop[ 0, 0,1280, 800] frame[ 0, 0,1280, 800] addr[ 0,
0, 0] flags[0x 0] trd[0,0]

lcd output

表示当前显示接口是LCD 输出。

1280x800

表示当前LCD 的分辨率,与board.dts 中lcd0 的设置一样。

ref_fps:60

是根据你在board.dts的lcd0填的时序算出来的理论值。

fps:60.9

后面的数值是实时统计的,正常来说应该是在60(期望的fps) 附近,如果差太多则不正常,重新检查屏时序,和在屏驱动的初始化序列是否有被调用到。

irq:1942

这是vsync 中断的次数,每加1 都代表刷新了一帧,正常来说是一秒60(期望的fps)次,重复cat sys,如果无变化,则异常。

BUF

开头的表示图层信息,一行BUF 表示一个图层,如果一个BUF 都没有出现,那么将是黑屏,不过和屏驱动本身关系就不大了,应该查看应用层& 框架层。

err:0

这个表示缺数,如果数字很大且一直变化,屏幕会花甚至全黑,全红等。

skip:31

这个表示跳帧的数量,如果这个数值很大且一直变化,有可能卡顿,如果数字与irq 后面的数字一样,说明每一帧都跳,会黑屏(有背光)。

6.3 查看电源信息

查看axp 某一路电源是否有enable 可以通过下面命令查看。当然这个只是软件的,实际还是用万用表量为准。

cat /sys/class/regulator/dump
pmu1736_ldoio2 : disabled 0 700000 supply_name:
pmu1736_ldoio1 : disabled 0 700000 supply_name:
pmu1736_dc1sw : enabled 1 3300000 supply_name: vcc-lcd
pmu1736_cpus : enabled 0 900000 supply_name:
pmu1736_cldo4 : disabled 0 700000 supply_name:
pmu1736_cldo3 : disabled 0 700000 supply_name:
pmu1736_cldo2 : enabled 1 3300000 supply_name: vcc-pf
pmu1736_cldo1 : disabled 0 700000 supply_name:
pmu1736_bldo5 : enabled 2 1800000 supply_name: vcc-cpvin vcc-pc
pmu1736_bldo4 : disabled 0 700000 supply_name:
pmu1736_bldo3 : disabled 0 700000 supply_name:
pmu1736_bldo2 : disabled 0 700000 supply_name:
pmu1736_bldo1 : disabled 0 700000 supply_name:
pmu1736_aldo5 : enabled 0 2500000 supply_name:
pmu1736_aldo4 : enabled 0 3300000 supply_name:
pmu1736_aldo3 : enabled 1 1800000 supply_name: avcc
pmu1736_aldo2 : enabled 0 1800000 supply_name:
pmu1736_aldo1 : disabled 0 700000 supply_name:
pmu1736_rtc : enabled 0 1800000 supply_name:
pmu1736_dcdc6 : disabled 0 500000 supply_name:
pmu1736_dcdc5 : enabled 0 1480000 supply_name:
pmu1736_dcdc4 : enabled 1 900000 supply_name: vdd-sys
pmu1736_dcdc3 : enabled 0 900000 supply_name:
pmu1736_dcdc2 : enabled 0 1160000 supply_name:
pmu1736_dcdc1 : enabled 4 3300000 supply_name: vcc-emmc vcc-io vcc-io vcc-io

6.4 查看pwm 信息

pwm 的用处这里是提供背光电源。

cat /sys/kernel/debug/pwm
platform/7020c00.s_pwm, 1 PWM device
pwm-0 ((null) ): period: 0 ns duty: 0 ns polarity: normal
platform/300a000.pwm, 2 PWM devices
pwm-0 (lcd ): requested enabled period: 20000 ns duty: 3984 ns polarity:
normal
pwm-1 ((null) ): period: 0 ns duty: 0 ns polarity: normal

上面的“requested enabled” 表示请求并且使能了,括号里面的lcd 表示是由lcd 申请的。

6.5 查看管脚信息

cat /sys/kernel/debug/pinctrl/pio/pinmux-pins
pin 227 (PH3): twi1 (GPIO UNCLAIMED) function io_disabled group PH3
pin 228 (PH4): (MUX UNCLAIMED) (GPIO UNCLAIMED)
pin 229 (PH5): (MUX UNCLAIMED) pio:229
pin 230 (PH6): (MUX UNCLAIMED) pio:230
pin 231 (PH7): (MUX UNCLAIMED) pio:231

上面的信息我们知道PH5,PH6 这些IO 被申请为普通GPIO 功能,而PH3 被申请为twi1。

6.6 查看时钟信息

cat /sys/kernel/debug/clk/clk_summary

这个命令可以看哪个时钟是否使能,然后频率是多少。

与显示相关的是tcon,pll_video,mipi 等等。

cat /sys/kernel/debug/clk/clk_summary | grep tcon
cat /sys/kernel/debug/clk/clk_summary | grep pll_video
cat /sys/kernel/debug/clk/clk_summary | grep mipi

6.7 查看接口自带colorbar

显示是一整条链路,中间任何一个环节出错,最终的表现都是显示异常,图像显示异常几个可能

原因:

  1. 图像本身异常。
  2. 图像经过DE(Display Engine)后异常。
  3. 图像经过接口模块后异常。这是我们关注的点。

有一个简单的方法可以初步判断,接口模块(tcon 和dsi 等)可以自己输出内置的一些patten(比如说彩条、灰阶图、棋盘图等),当接口输出这些内置patten

的时候,如果这时候显示就异常,这说明了:

  1. LCD 的驱动或者配置有问题。
  2. LCD 屏由于外部环境导致显示异常。

显示自带patten 的方式:

在linux-4.9 及其以上版本的内核,disp 的sysfs 中有一个attr 可以直接操作显示:

echo X > /sys/class/disp/disp/attr/colorbar

上面的操作是显示colorbar,其中的X 可以是0 到8,对应的含义如下图所示:

画像-20221130180522997

图6-1: colorbar

如果有多个显示设备,想让第二个显示设备显示colorbar 的话,那么先:

echo 1 > /sys/class/disp/disp/attr/disp

然后再执行上面操作。

如果没有这个attr 的话,可以直接操作寄存器,也就是操作tcon 寄存器的040 偏移的最低3位。

在linux 下,cd /sys/class/sunxi_dump 然后:

echo 0x06511040 > dump;cat dump

这样会打印当前tcon 的040 偏移寄存器的值,然后在上面值的基础上修改最低3 位为上图的值即可,修改方式示例:

echo 0x06511040 0x800001f1 > write

注意tcon 的基地址不一定是0x06511000,不同平台不一样,请参考SoC 文档获取tcon 的基地址。

6.8 DE 截屏

显示出现异常的时候,有可能是下面三个原因:

  1. SoC 端屏接口模块+LCD 屏出现了问题。
  2. 图像经过SoC 端图像合成模块(DE)处理后出现了问题。
  3. 图像源本身就有问题。
    本节介绍,确认图像源本身没问题的前提下,如何进一步确认是否经过DE 处理之后图像是否有问题。

语法:

echo 屏幕索引> /sys/class/disp/disp/attr/disp
echo 路径/bmp文件名> /sys/class/disp/disp/attr/capture_dump

第一个echo 的作用是确定捕捉哪个显示的,“屏幕索引” 可选取值是0 或者1。

第二个echo 作用是生成截屏bmp 文件,确保“路径” 是可写的,有剩余空间的。

比如:

echo 0 > /sys/class/disp/disp/attr/disp
echo /data/xx.bmp > /sys/class/disp/disp/attr/capture_dump

这样就会在/data 目录下生成screen 0 的bmp 截图,文件名是xx.bmp。

除了bmp 之外,还支持保存raw 数据,包括RGB 和YUV 颜色空间,它们以后缀来区分,用法

如下:

# 截取yuv420p颜色空间的raw数据。
echo /data/xx.yuv420_p > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_uvuv颜色空间的raw数据。
echo /data/xx.yuv420_sp_uvuv > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_vuvu颜色空间的raw数据。
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# 截取yuv420_sp_vuvu颜色空间的raw数据。
echo /data/xx.yuv420_sp_vuvu > /sys/class/disp/disp/attr/capture_dump
# 截取argb8888颜色空间的raw数据。
echo /data/xx.argb8888 > /sys/class/disp/disp/attr/capture_dump
# 截取abgr8888颜色空间的raw数据。
echo /data/xx.abgr8888 > /sys/class/disp/disp/attr/capture_dump
# 截取rgb888颜色空间的raw数据。
echo /data/xx.rgb888 > /sys/class/disp/disp/attr/capture_dump
# 截取bgr888颜色空间的raw数据。
echo /data/xx.bgr888 > /sys/class/disp/disp/attr/capture_dump
# 截取rgba8888颜色空间的raw数据。
echo /data/xx.rgba8888 > /sys/class/disp/disp/attr/capture_dump
# 截取bgra8888颜色空间的raw数据。
echo /data/xx.bgra8888 > /sys/class/disp/disp/attr/capture_dump

注意:这个功能只有linux-4.9 以及后续的内核才支持这个功能。

7 FAQ

7.1 屏显示异常

总结过往经验,绝大部分屏显异常都是由于上下电时序和timing 不合理导致。

请看屏时序参数说明和屏驱动分解。

7.2 黑屏-无背光

问题表现:完全黑屏,背光也没有。

有两种可能:

  1. 屏驱动添加失败。驱动没有加载屏驱动,导致背光电源相关函数没有运行到。这个你可以通过调试方法定位下。
  2. pwm 配置和背光电路的问题,pwm 的信息可以看pwm 信息和背光相关参数,另外就是直接测量下硬件测量下相关管脚和电压。

7.3 黑屏-有背光

黑屏但是有背光,可能有多种原因导致,请依次按以下步骤检查:

  1. 没送图层。如果应用没有送任何图层那么表现的现象就是黑屏,通过查看显示信息一小节可以确定有没有送图层。如果确定没有图层,可以通过查看接口自带

colorbar,确认屏能否正常显示。

  1. SoC 端的显示接口模块没有供电。SoC 端模块没有供电自然无法传输视频信号到屏上。一般SoC 端模块供电的axp 名字叫做vcc-lcd,vcc-dsi,vcc33-lcd,

vcc18-dsi 等。

  1. 复位脚没有复位。如果有复位脚,请确保硬件连接正确,确保复位脚的复位操作有放到屏驱动中。

  2. board.dts 中lcd0 有严重错误。第一个是lcd 的timing 太离谱,请严格按照屏手册中的提示来写!参考屏时序参数说明。第二个就是,接口类型搞错,比如接

的DSI 屏,配置却写成LVDS 的。

  1. 屏的初始化命令不对。包括各个步骤先后顺序,延时等,这个时候请找屏厂确认初始化命令。

7.4 闪屏

分为几种:

  1. 屏的整体在闪。

这个最大可能是背光电路的电压不稳定,检查电压。

  1. 屏部分在闪,而且是概率性。

board.dts 中的时序填写不合理。

  1. 屏上由一个矩形区域在闪。

屏极化导致,需要关机放一边再开机则不会。

7.5 条形波纹

有些LCD 屏的像素格式是18bit 色深(RGB666)或16bit 色深(RGB565),建议打开FRM功能,通过dither 的方式弥补色深,使显示达到24bit 色深(RGB888)

的效果。如下图所示,上图是色深为RGB66 的LCD 屏显示,下图是打开dither 后的显示,打开dither 后色彩渐变的地方过度平滑。

设置[lcd0] 的lcd_frm 属性可以改善这种现象。请看lcd_frm解释。

7.6 背光太亮或者太暗

请看背光相关参数。

7.7 重启断电测试屏异常

花屏的第一个原因是fps 过高,超过屏的限制:

FPS 异常是一件非常严重的事情,关系到整个操作系统的稳定,如果fps 过高会造成系统带宽增加,送显流程异常,fps 过高还会造成LCD 屏花屏不稳定,容易造

成LCD 屏损坏,FPS 过低则造成用户体验过差。

  1. 通过查看查看显示信息一节,可以得知现在的实时统计的fps。

  2. 如果fps 离正常值差很多,首先检查board.dts 中[lcd0] 节点,所填信息必须满足下面公式。

lcd_dclk_freq*num_of_pixel_clk=lcd_ht*lcd_vt*fps /1e9

其中,num_of_pixel_clk 通常为1,表示发送一个像素所需要的时钟周期为1 一个,低分辨率的MCU 和串行接口通常需要2 到3 个时钟周期才能发送完一个像素。

如果上面填写没有错,通过查看查看时钟信息一节可以确认下几个主要时钟的频率信息,把这些信息和board.dts 发给维护者进一步分析。

7.8 RGB 接口或者I8080 接口显示抖动有花纹

  1. 改大时钟管脚的管脚驱动能力
    参考lcd_gpio_0一小节和pinctrl-0 和pinctrl-1,修改驱动能力,改大。

还有另外一种写法,比如原来是:

lcdclk = port:PD18<2><0><2><default>

可以改成:

lcdclk = port:PD18<2><0><3><default>
  1. 修改时钟相位,也就是修改lcd_hv_clk_phase。由于发送端和接收端时钟相位的不同导致接收端解错若干位。

7.9 LCD 屏出现极化和残影

何谓液晶极化现象:实际上就是液晶电介质极化。就是在外界电场作用下,电介质内部沿电场方向产生感应偶极矩,在电解质表明出现极化电荷的现象叫做电介质

的极化。

通俗的讲就是在液晶面板施加一定电压后,会聚集大量电荷,当电压消失的时候,这些聚集的电荷也要释放,但由于介电效应,这些聚集的电荷不会立刻释放消

失,这些不会马上消失的惰性电荷造成了液晶的DC 残留从而形成了极化现象。

几种常见的液晶极化现象

  1. 液晶长期静止某个画面的时候,切换到灰阶画面的时候出现屏闪,屏闪一段时间后消失。这种现象属于残留电荷放电的过程。

  2. 液晶长期静止某个画面的时候,出现四周发黑中间发白的现象,业内称为黑白电视框异常。

  3. 非法关机的时候,重新上电会出现屏闪,屏闪一定时间后消失。与第一种原因相同。

  4. 残影现象:当液晶静止在一个画面比较久的情况下,切换其他画面出现的镜像残留。残影的本质来说是液晶DC 残留电荷导致,某种意义来说也属于液晶极化

现象。

针对液晶屏出现极化和残影现象,有如下对策。

  1. 调整vcom 电压大小。
    VCOM 是液晶分子偏转的参考电压,要求要稳定,对液晶显示有直接影响,具体的屏不同的话也是不同的。电压的具体值是根据输入的数据以及Vcom 电压大

小来确定的,用来显示各种不同灰阶,也就是实现彩色显示GAMMA。Gamma 电压是用来控制显示器的灰阶的,一般情况下分为G0~G14,不同的Gamma

电压与Vcom 电压之间的压差造成液晶旋转角度不同从而形成亮度的差异,Vcom 电压最好的状况是位于G0 和G14 的中间值,这样液晶屏的闪烁状况会最

好。

调节vcom 电压的方式,如果屏管脚有vcom 管脚,直接调整相关电路,如果屏driver IC 提供寄存器接口,可以通过寄存器接口来调整大小。

  1. 严格按照屏规定的上下电时序来对屏进行开关屏。许多极化残影现象并非长时间显示静止显示某个画面导致的,而是由于关机或者关屏时没有严格按照下电时

序导致的,比如该关的电没关,或者延时不够。

8 总结

LCD ディスプレイのデバッグは、実際には、送信チップ (Allwinner SoC) と受信チップ (LCD 画面上のドライバー IC) をデバッグするプロセスです。

  1. スクリーン ドライバーを追加するには、スクリーン ドライバーを追加する手順とスクリーン ドライバーの説明を参照してください。
  2. 画面マニュアル、ドライバーICマニュアルをよくお読みください。
  3. ハードウェアパラメータの説明をよく読んでください。
  4. LCD に必要なすべての電源ピンが正常であることを確認してください。

おすすめ

転載: blog.csdn.net/thisway_diy/article/details/128458756