背景:
現在、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 値を計算します。
ロゴは表示されているのですが、画面に色のついた縦線が表示されています。何が原因でしょうか?トラブルシューティングにご協力ください。ありがとうございます。ご返信をお待ちしております。
こんにちは@DADAXIN
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);
}
よろしくお願いします、
志明
こんにちは、@Zhiming
おはようございます!仕事が忙しくて返信が遅くなり申し訳ありません。
gateworks.bmp を試してみましたが、表示があまり良くありませんでした。下の logo.png をご覧ください。uboot ドライバを確認したところ、VIDEO_FONT_16X32 の設定オプションが見つかりませんでした。検証として、1920x1080 のロゴ画像を 1280x800 のロゴに変換し、uboot とカーネルの両方に配置しました。uboot のロゴは斜めの角度でギザギザのエッジが表示されましたが、カーネルは問題なく表示されました。この問題についてご報告いただきありがとうございます。
こんにちは@DADAXIN
この問題は、ソース素材の解像度に関係しています。ソース素材の解像度を上げると、ギザギザが大幅に軽減されます。添付ファイルのロゴの解像度は296x72ですが、実際の画面の表示領域は296x72ピクセルではないため、引き伸ばされます。同じディレクトリにあるtools/logos/gateworks.bmp(600x93)ファイルを試して、水平方向のギザギザが軽減されるかどうかを確認してください。フォントについては、高解像度画面に適したVIDEO_FONT_16X32オプションを有効にしてみてください。
よろしくお願いします、
志明
こんにちは@DADAXIN
現在使用しているロゴ画像(上記右側のもの)のコピーをアップロードしていただけますか?デュアルチャネル1080pモードでも、デフォルトのNXPロゴは表示されますか?
よろしくお願いします、
志明
こんにちは、ご返信ありがとうございます!状況は以下のとおりです。
1. 添付ファイルに示すように、デフォルトの NXP ロゴ表示にもギザギザの外観が現れます。
2. 新しい1920x1080のロゴ画像をインストールしました。U-Bootでは傾いた部分がギザギザに見えますが、残りの部分は正常に表示されます。しかし、カーネルではファイルが大きすぎて表示できません。
3. ロゴ画像を 1280x800 の解像度に変換すると、U-Boot でも同じ効果が維持され、カーネルに正しく表示されます。
4. 1280x800 シングルチャネル画面に切り替えると、uboot とカーネルの両方が正常に表示されます。
シングルチャネル ディスプレイは正常に動作しますが、デュアルチャネル モードでロゴ画像が変更されると、U-Boot が異常表示されます。
こんにちは@DADAXIN
ロゴを差し替える前、デフォルトのロゴの表示やフォントに問題はありましたか? 上の画像をよく確認したところ、元の素材自体の解像度が画面と互換性がないようです。高解像度での表示でどうなるかテストできる、より高解像度の画像をお持ちでしょうか?
また、カーネル段階で同じロゴ素材が表示された場合にも、このような現象が発生しますか?
よろしくお願いします、
志明
早上好、志明
内部コアの lvds レジスタの書き込み;私も uboot で構成を実行しました;しかし結果は改善されませんでした:ロゴの斜部分も存在します;请问その残りの操作は拡張可能です;期待してください!
こんにちは@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
よろしくお願いします、
志明
ご指摘ありがとうございます。ロゴ画像の問題は、フォントとパターンの斜め部分にギザギザ感があるというものです。
こんにちは@DADAXIN
Linux LVDS PHY ドライバーの設定を参照して、LVDS_CTRL のこれらの 3 つのビットを調整すると、ドライバーの機能が大幅に向上するはずです。
phy_write(phy, priv->devdata->lvds_ctrl,
CC_ADJ(0x2) | PRE_EMPH_EN | PRE_EMPH_ADJ(0x3));
よろしくお願いします、
志明
こんにちは、
ロゴに何か問題がありますか?テキストだけであれば、LVDSコントローラーではなく、U-Bootのフォント最適化に関係している可能性があります。
よろしくお願いします、
志明
ご指導ありがとうございます。それが問題の核心です。
こんにちは、
コードには次の行が含まれています: val |= CH_EN。ここでは、チャネル0とBIT0のみが有効になっていますが、BIT2も設定する必要があります。
よろしくお願いします、
志明
こんにちは@DADAXIN
LDB_CH1_MODE_EN_TO_DI0 を LDB_CH1_MODE_EN_TO_DI1 に変更してみてください。
よろしくお願いします、
志明
こんにちは、志明
感激の逆行および問題の発生、最近の動作はより混雑しており、逆行はより混雑しています;私たちは代替操作を実行しました
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 @Zhiming_Liu
こんにちは。私もあなたと同じ問題(エイリアスされたテキスト)を抱えています。この関数(video_bmp_display)を変更した後、表示が乱れるのはなぜか教えていただけますか?他に何か変更しましたか?