4

LCD画面を組み込みLinux(ARM9)システムに統合する必要があります。LCDは縦向き320x480で、画面を横向き480x320で実行する必要があります。LCD構成レジスタを使用して、ハードウェアで回転できるため、(x、y)(0,0)が90度回転します。ここから問題が始まります。画面の広い側が480ピクセルから320ピクセルに狭くなり、画像の長い側が画面の外に出ます。これは、フレームバッファのサイズをAFAIKに変更することで修正する必要がありますが、いくつかの方法を試しましたが、まだ成功していません。fbsetを使用して、以下はポートレートの設定です。

mode "480x320-55"
    # D: 9.091 MHz, H: 18.182 kHz, V: 55.096 Hz
    geometry 480 320 480 320 16
    timings 110000 4 4 4 4 12 2
    rgba 5/0,6/5,5/11,0/0
endmode

コマンドの送信:

fbset --geometry 480 320 480 320 16

結果:

mode "480x320-55"
    # D: 9.091 MHz, H: 18.182 kHz, V: 55.096 Hz
    geometry 480 320 480 320 16
    timings 110000 4 4 4 4 12 2
    rgba 5/0,6/5,5/11,0/0
endmode

これにより、画像が数回表示されて重なりますが、画面の幅が狭すぎます。

仮想xresとyresの画面サイズを2倍にしようとしましたが、変更はありません。

fbset --geometry 480 320 960 640 16

また、ウェブ「saFbdevRotation.c」で見つけたFB IOCTLを使用するfb回転機能を使用してみましたが、アクティブな画面サイズが正しくありません。

90度回転します。出力を参照してください

$> ./fb_rotate -r 90
## Before rotation
### Fix Screen Info:
Line Length - 640
Physical Address = 81a00000
Buffer Length = 1048576

### Var Screen Info:
Xres - 320
Yres - 480
Xres Virtual - 320
Yres Virtual - 480
Bits Per Pixel - 16
Pixel Clk - 110000
Rotation - 0
## after rotation
###  Fix Screen Info:
Line Length - 960
Physical Address = 81a00000
Buffer Length = 1048576

### Var Screen Info:
Xres - 480
Yres - 320
Xres Virtual - 480
Yres Virtual - 320
Bits Per Pixel - 16
Pixel Clk - 110000
Rotation - 90

また、システムが空きメモリで非常に制限されていることを追加することもできます。これにより、fbが新しいバッファを割り当てない可能性がありますか?ただし、dmesgにエラーはありませんでした。

あなたのアドバイスに感謝します。

4

3 に答える 3

0

あなたの問題は、使用しているLCDに関連していると思います。90 度回転をサポートすると主張する組み込み LCD をいくつか見てきましたが、結果はまさにあなたが説明したとおりでした。私の問題は、常に RGB ディスプレイ インターフェイスを使用して発生しました。CPUインターフェースを使用して回転が機能した可能性があります。RGB インターフェイスの回転を正しく行うことができた組み込みディスプレイは 1 つしか見たことがありません。

問題は、LCD HW、プロセッサ HW、または純粋な SW のいずれかでローテーションを実行するようにする必要があるということです。Linux フレームバッファが純粋な SW を使用するのか、プロセッサ ハードウェアを使用するのかはわかりません。おそらく、ドライバに依存します。

于 2016-08-08T13:31:56.487 に答える
0

また、システムの空きメモリが非常に限られていることも付け加えることができます。これにより、fb が新しいバッファを割り当てない可能性がありますか? ただし、dmesg にはエラーはありませんでした。

通常、ビデオ バッファを割り当てる標準的な方法は、ブート時に (サポートする最大ビデオ解像度に基づいて) 大きなビデオ バッファを事前に割り当てることです。これにより、カーネルが占有しないようにカーネルに men= 引数が渡されます。最初に。

その後、ビデオドライバーができること

void *ioremap(unsigned long phys_addr, unsigned long size)

ドライバがフレームバッファを直接操作するための mmap 領域を作成します。

あなたはそれを行うことでそれをチェックすることができますcat /proc/iomen

したがって、ビデオ ドライバー メモリは事前に割り当てられており、Linux カーネル システム メモリ (kmalloc()、get_free_pages()、vmalloc() など) とは異なります。

于 2015-05-04T22:28:31.470 に答える