2197169_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2197169_ja-JP

2197169_ja-JP

IMX8MP uboot でデュアルチャネル LVDS を構成すると、色付きの縦線が表示されます。

背景:

現在、U-BootのLVDSディスプレイはパッチに従って設定されており、1280x800のシングルチャネル画面では正常に表示されます。これに基づき、1920x1080のデュアルチャネルディスプレイが必要となり、以下の設定が実装されています。

1. LVDS 画面パラメータを設定します。

タイミングLVDS: タイミングLVDS {
クロック周波数 = <141140000>;
hactive = <1920>;
vアクティブ = <1080>;
hfront-porch = <94>;
hback-porch = <92>;
hsync-len = <2>;
vback-porch = <18>;
vフロントポーチ = <16>;
vsync-len = <2>;
hsync-アクティブ = <1>;
vsync-active = <1>;
非アクティブ = <1>;
};


2. レジスタ設定をldbに書き込みます。

//CH1
#CH1_DATA_WIDTH_24BIT を定義します (1 << 7)
#define CH1_BIT_MAPPING_JEIDA (1 <<
#define CH1_BIT_MAPPING_SPWG (0 <<

media_blk_write(priv, LDB_CTRL,
LDB_CH0_MODE_EN_TO_DI0 | CH0_DATA_WIDTH_24BIT | CH0_BIT_MAPPING_JEIDA |
LDB_CH1_MODE_EN_TO_DI0 | CH1_DATA_WIDTH_24BIT | CH1_BIT_MAPPING_JEIDA);

3. 次の式に従って PLL 値を計算します。

PLL_1443X_RATE(987980000U, 823, 5, 2, 20971),
uboot_lvds_1920x1080.jpg

ロゴは表示されているのですが、画面に色のついた縦線が表示されています。何が原因でしょうか?トラブルシューティングにご協力ください。ありがとうございます。ご返信をお待ちしております。



i.MX 8M | i.MX 8M ミニ | i.MX 8M ナノi.MX8ULPRe: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

カーネルとU-BootのBMP表示機能が異なるため、BMP表示関連の関数に問題があると思われます。video_bmp_display関数を置き換えてみてください。
int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y,
              bool align)
{
    struct video_priv *priv = dev_get_uclass_priv(dev);
    int i, j;
    uchar *start, *fb;
    struct bmp_image *bmp = map_sysmem(bmp_image, 0);
    uchar *bmap;
    unsigned long width, height;
    unsigned long pwidth = priv->xsize;
    unsigned colours, bpix, bmp_bpix;
    enum video_format eformat;
    struct bmp_color_table_entry *palette;
    int hdr_size;
    int ret;

    if (!bmp || !(bmp->header.signature[0] == 'B' &&
        bmp->header.signature[1] == 'M')) {
        printf("Error: no valid bmp image at %lx\n", bmp_image);
        return -EINVAL;
    }

    video_bmp_get_info(bmp, &width, &height, &bmp_bpix);
    hdr_size = get_unaligned_le16(&bmp->header.size);
    debug("hdr_size=%d, bmp_bpix=%d\n", hdr_size, bmp_bpix);
    palette = (void *)bmp + 14 + hdr_size;

    colours = 1 << bmp_bpix;

    bpix = VNBITS(priv->bpix);
    eformat = priv->format;

    if (bpix != 1 && bpix != 8 && bpix != 16 && bpix != 32) {
        printf("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
               bpix, bmp_bpix);
        return -EINVAL;
    }

    /*
     * We support displaying 8bpp and 24bpp BMPs on 16bpp LCDs
     * and displaying 24bpp BMPs on 32bpp LCDs
     */
    if (bpix != bmp_bpix &&
        !(bmp_bpix == 8  && (bpix == 16 || bpix == 24 || bpix == 32)) &&
        !(bmp_bpix == 24 && (bpix == 16 || bpix == 32))) {
        printf("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n",
               bpix, colours);
        return -EPERM;
    }

    debug("Display-bmp: %d x %d  with %d colours, display %d\n",
          (int)width, (int)height, (int)colours, 1 << bpix);

    unsigned long bmp_stride_bytes =
        ((width * bmp_bpix + 31) / 32) * 4;

    unsigned long dst_bytes_per_pixel = bpix / 8;
    if (!dst_bytes_per_pixel)           
        dst_bytes_per_pixel = 1;

    if (align) {
        video_splash_align_axis(&x, priv->xsize, width);
        video_splash_align_axis(&y, priv->ysize, height);
    }

    if ((x + width) > pwidth)
        width = pwidth - x;
    if ((y + height) > priv->ysize)
        height = priv->ysize - y;

    bmap = (uchar *)bmp + get_unaligned_le32(&bmp->header.data_offset);
    start = (uchar *)(priv->fb +
        (y + height) * priv->line_length + x * (bpix / 8));

    /* Move back to the final line to be drawn (BMP 自下而上存储) */
    fb = start - priv->line_length;

    switch (bmp_bpix) {
    case 1:
    case 8: {
        unsigned long src_bpp_bytes = 1;
        unsigned long dst_line_bytes = width * (bpix / 8);
        if (!dst_line_bytes)
            dst_line_bytes = width;

        for (i = 0; i < height; ++i) {
            schedule();
            for (j = 0; j < width; j++) {
                write_pix8(fb, bpix, eformat, palette, bmap);
                bmap++;
                fb += (bpix / 8) ? (bpix / 8) : 1;
            }
           
            bmap += bmp_stride_bytes - width * src_bpp_bytes;
            
            fb -= dst_line_bytes + priv->line_length;
        }
        break;
    }
    case 16:
        if (CONFIG_IS_ENABLED(BMP_16BPP)) {
            unsigned long src_bpp_bytes = 2;
            for (i = 0; i < height; ++i) {
                schedule();
                for (j = 0; j < width; j++) {
                    *fb++ = *bmap++;
                    *fb++ = *bmap++;
                }
                
                bmap += bmp_stride_bytes - width * src_bpp_bytes;
                fb   -= width * 2 + priv->line_length;
            }
        }
        break;
    case 24:
        if (CONFIG_IS_ENABLED(BMP_24BPP)) {
            unsigned long src_bpp_bytes = 3;
            for (i = 0; i < height; ++i) {
                for (j = 0; j < width; j++) {
                    if (bpix == 16) {
                        /* 16bit 565RGB format */
                        *(u16 *)fb = ((bmap[2] >> 3) << 11) |
                                 ((bmap[1] >> 2) << 5)  |
                                 (bmap[0] >> 3);
                        bmap += 3;
                        fb   += 2;
                    } else if (eformat == VIDEO_X2R10G10B10) {
                        u32 pix;
                        pix  = (u32)(*bmap++) << 2U;
                        pix |= (u32)(*bmap++) << 12U;
                        pix |= (u32)(*bmap++) << 22U;
                        *fb++ = pix & 0xff;
                        *fb++ = (pix >> 8) & 0xff;
                        *fb++ = (pix >> 16) & 0xff;
                        *fb++ = pix >> 24;
                    } else if (eformat == VIDEO_RGBA8888) {
                        u32 pix;
                        pix  = (u32)(*bmap++) << 8U;  /* blue */
                        pix |= (u32)(*bmap++) << 16U; /* green */
                        pix |= (u32)(*bmap++) << 24U; /* red */
                        *fb++ = (pix >> 24) & 0xff;
                        *fb++ = (pix >> 16) & 0xff;
                        *fb++ = (pix >> 8)  & 0xff;
                        *fb++ = 0xff;
                    } else {
                        
                        *fb++ = *bmap++;
                        *fb++ = *bmap++;
                        *fb++ = *bmap++;
                        *fb++ = 0;
                    }
                }
                
                bmap += bmp_stride_bytes - width * src_bpp_bytes;
                fb   -= priv->line_length + width * (bpix / 8);
            }
        }
        break;
    case 32:
        if (CONFIG_IS_ENABLED(BMP_32BPP)) {
            unsigned long src_bpp_bytes = 4;
            for (i = 0; i < height; ++i) {
                for (j = 0; j < width; j++) {
                    if (eformat == VIDEO_X2R10G10B10) {
                        u32 pix;
                        pix  = (u32)(*bmap++) << 2U;
                        pix |= (u32)(*bmap++) << 12U;
                        pix |= (u32)(*bmap++) << 22U;
                        pix |= ((u32)(*bmap++) >> 6) << 30U;
                        *fb++ = pix & 0xff;
                        *fb++ = (pix >> 8) & 0xff;
                        *fb++ = (pix >> 16) & 0xff;
                        *fb++ = pix >> 24;
                    } else if (eformat == VIDEO_RGBA8888) {
                        u32 pix;
                        pix  = (u32)(*bmap++) << 8U;  /* blue */
                        pix |= (u32)(*bmap++) << 16U; /* green */
                        pix |= (u32)(*bmap++) << 24U; /* red */
                        bmap++;                      /* alpha (忽略) */
                        *fb++ = (pix >> 24) & 0xff;
                        *fb++ = (pix >> 16) & 0xff;
                        *fb++ = (pix >> 8)  & 0xff;
                        *fb++ = 0xff;               /* opacity */
                    } else {
                        *fb++ = *bmap++;
                        *fb++ = *bmap++;
                        *fb++ = *bmap++;
                        *fb++ = *bmap++;
                    }
                }
               
                bmap += bmp_stride_bytes - width * src_bpp_bytes;
                fb   -= priv->line_length + width * (bpix / 8);
            }
        }
        break;
    default:
        break;
    };

    /* Find the position of the top left of the image in the framebuffer */
    fb = (uchar *)(priv->fb + y * priv->line_length + x * (bpix / 8));
    ret = video_sync_copy(dev, start, fb);
    if (ret)
        return log_ret(ret);

    return video_sync(dev, false);
}





よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは、@Zhiming

おはようございます!仕事が忙しくて返信が遅くなり申し訳ありません。

gateworks.bmp を試してみましたが、表示があまり良くありませんでした。下の logo.png をご覧ください。uboot ドライバを確認したところ、VIDEO_FONT_16X32 の設定オプションが見つかりませんでした。検証として、1920x1080 のロゴ画像を 1280x800 のロゴに変換し、uboot とカーネルの両方に配置しました。uboot のロゴは斜めの角度でギザギザのエッジが表示されましたが、カーネルは問題なく表示されました。この問題についてご報告いただきありがとうございます。

uboot_logo_H.jpg

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

この問題は、ソース素材の解像度に関係しています。ソース素材の解像度を上げると、ギザギザが大幅に軽減されます。添付ファイルのロゴの解像度は296x72ですが、実際の画面の表示領域は296x72ピクセルではないため、引き伸ばされます。同じディレクトリにあるtools/logos/gateworks.bmp(600x93)ファイルを試して、水平方向のギザギザが軽減されるかどうかを確認してください。フォントについては、高解像度画面に適したVIDEO_FONT_16X32オプションを有効にしてみてください。

Zhiming_Liu_0-1762826615066.png

よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

現在使用しているロゴ画像(上記右側のもの)のコピーをアップロードしていただけますか?デュアルチャネル1080pモードでも、デフォルトのNXPロゴは表示されますか?

よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは、ご返信ありがとうございます!状況は以下のとおりです。

1. 添付ファイルに示すように、デフォルトの NXP ロゴ表示にもギザギザの外観が現れます。
2. 新しい1920x1080のロゴ画像をインストールしました。U-Bootでは傾いた部分がギザギザに見えますが、残りの部分は正常に表示されます。しかし、カーネルではファイルが大きすぎて表示できません。
3. ロゴ画像を 1280x800 の解像度に変換すると、U-Boot でも同じ効果が維持され、カーネルに正しく表示されます。
4. 1280x800 シングルチャネル画面に切り替えると、uboot とカーネルの両方が正常に表示されます。

シングルチャネル ディスプレイは正常に動作しますが、デュアルチャネル モードでロゴ画像が変更されると、U-Boot が異常表示されます。


3.jpg4.jpg

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

ロゴを差し替える前、デフォルトのロゴの表示やフォントに問題はありましたか? 上の画像をよく確認したところ、元の素材自体の解像度が画面と互換性がないようです。高解像度での表示でどうなるかテストできる、より高解像度の画像をお持ちでしょうか?

また、カーネル段階で同じロゴ素材が表示された場合にも、このような現象が発生しますか?

よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

早上好、志明

内部コアの lvds レジスタの書き込み;私も uboot で構成を実行しました;しかし結果は改善されませんでした:ロゴの斜部分も存在します;请问その残りの操作は拡張可能です;期待してください!

uboot_lvds.png


lvds_define.png






Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

この設定はカーネルの特定の部分に対応していますが、当時はシングルチャネルテストのみが実施されていたため、U-Bootパッチには含まれていません。U-Bootパッチでlvds_ctrlレジスタに値を書き込む必要があります。

https://github.com/nxp-imx/linux-imx/blob/lf-6.12.y/drivers/phy/freescale/phy-fsl-imx8mp-lvds.c#L113

Zhiming_Liu_0-1762475137940.png

Zhiming_Liu_1-1762475147603.png





よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

ご指摘ありがとうございます。ロゴ画像の問題は、フォントとパターンの斜め部分にギザギザ感があるというものです。

2.jpg
1.jpg

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线こんにちは。U-Boot は対応する PHY ファイル「fsl,imx8mp-lvds-phy」を見つけることができません。レジスタのどこに書き込めばいいのでしょうか? <8MP_LVDS_patch> パッチにもこのドライバファイルは含まれていません。Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

Linux LVDS PHY ドライバーの設定を参照して、LVDS_CTRL のこれらの 3 つのビットを調整すると、ドライバーの機能が大幅に向上するはずです。

	phy_write(phy, priv->devdata->lvds_ctrl,
			CC_ADJ(0x2) | PRE_EMPH_EN | PRE_EMPH_ADJ(0x3));



よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线ご返信ありがとうございます!ロゴ画像の縁がギザギザになっています。1280x800のシングルチャンネル画面に切り替えると問題は解決しました。パネルクロックやPLL値をいろいろ調整しても表示は改善されませんでした。何かアドバイスはありますか?Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは、

ロゴに何か問題がありますか?テキストだけであれば、LVDSコントローラーではなく、U-Bootのフォント最適化に関係している可能性があります。

よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线こんにちは。LVDS画面のロゴ表示に問題が発生しています。ロゴの文字がギザギザに表示されてしまいます。どうすれば改善できるでしょうか?ご返信をお待ちしております。Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

ご指導ありがとうございます。それが問題の核心です。

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは、

コードには次の行が含まれています: val |= CH_EN。ここでは、チャネル0とBIT0のみが有効になっていますが、BIT2も設定する必要があります。

Zhiming_Liu_0-1762150737457.png



よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线こんにちは。ご返信ありがとうございます。LDB_CH1_MODE_EN_TO_DI0 を LDB_CH1_MODE_EN_TO_DI1 に変更しても、表示効果は変わりませんでした。Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN

LDB_CH1_MODE_EN_TO_DI0 を LDB_CH1_MODE_EN_TO_DI1 に変更してみてください

よろしくお願いします、
志明

Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは、志明

感激の逆行および問題の発生、最近の動作はより混雑しており、逆行はより混雑しています;私たちは代替操作を実行しました

1、現在 5.10.72 对应的 uboot2021 バージョン、変更後の会議には video_format 定義がありません;しかし、現在 6.6.52 对应的 uboot2024 バージョンは有ります、私もこの部分の構成:
+++ b/include/video.h
@@ -56,6 +56,15 @@ 列挙型 video_log2_bpp {
ビデオ_BPP32、
};

+
+列挙型ビデオフォーマット {
+ ビデオ_不明、
+ ビデオ_RGBA8888、
+ ビデオ_X8B8G8R8、
+ ビデオ_X8R8G8B8、
+ ビデオ_X2R10G10B10、
+};
+

2、もう一つの輖译、この一部の错、不明確怎么解决; 希望は你のもう一つの回帰を得ることができます、感谢!

DADAXIN_0-1765003767987.png


Re: IMX8MP uboot下配置双通道lvds,显示存在彩色竖线

こんにちは@DADAXIN @Zhiming_Liu

こんにちは。私もあなたと同じ問題(エイリアスされたテキスト)を抱えています。この関数(video_bmp_display)を変更した後、表示が乱れるのはなぜか教えていただけますか?他に何か変更しましたか?

Tags (1)
No ratings
Version history
Last update:
‎03-25-2026 03:28 AM
Updated by: