3.12 LCDディスプレイドライバを移植
3.12.1 LCDドライバ基礎知識
Linux-2.6.32.2カーネルはS3C2440のLCDコントローラドライバをサポートした。先ず、2440 LCDコントローラとドライバ関連のLCD基礎知識を説明する
注:TFT LCD、即ちトゥルーカラーを紹介する。
LCDドライバの最も肝心な点はクロック周波数(Clock frequency)の設定のことで、クロック周波数の設定は間違えたらLCDのディスプレイは点滅、または表示しない場合がある。一方、LCDのDatasheetにはデフォルト周波数があり、例えばmini2440に使用するToppoly 3.5゛LCD、データマニュアルは下記の通り:
デフォルト周波数は6.39MHzで、6.4MHzに近く、範囲は5M-6.85MHzで、S3C2440のLCDコントローラと関連設定はCLKVALで、設定を通じて、LCDインタフェースのVCLKピンにLCDの必要なクロック周波数を生成する。CLKVALとVCLKの関係は2440データシートで(411ページ)、次の説明がある
関連数学関係式は下記の通り
結論
HCLKについて、開発ボードは400Mhzで実行し、bootloaderのソースコードのヘッダファイルで分かる、下図を参照する
上記により:FCLK:HCLK:PCLK = 1:4:8、結論HCLK=100Mhz、上述の公式よりCLKVALはCLKVAL=HCLK/(VCLK*2) -1、CLKVAL = 100000000 / (6400000 * 2) - 1 = 6.8の結果が出る。
一番近い整数値7を選択し、LCDCON1:17-8に書き込み(注:実際値は8である)、これによって生成されたVCLK周波数、実際テストは5.63Mhzぐらいで、これは5-6.85Mhzの間の値であり、下図を参照する
3.12.2 新しいカーネルpixclockパラメータ
旧バージョンのLinuxカーネルのLCDレジスタの設定は直接CLKVALをコンパイルするが、Linux-2.6.32.2カーネルからは゛pixclock゛というパラメータで調整する。これによって、計算が複雑となり、実際操作では誤差があると思われる。
注:本章提供したpixclockパラメータはCLKVALの値により繰り返しのテストで得るもので、推論計算の値ではありません。
Framebufferドライバ (linux-2.6.32.2/ drivers/video/s3c2410fb.c)には次の関数がある
clkdiv = DIV_ROUND_UP(s3c2410fb_calc_pixclk(fbi、 var->pixclock)、 2);
ここのclkdivは上記のCLKVALとなり、DIV_ROUND_UPは一つのマクロ定義で、include/linux/kernel.hファイルにある。
#define DIV_ROUND_UP(n、d) (((n) + (d) - 1) / (d))
実はこれは数学的な概念であり:整数を切り上げ。次は゛上へ整数を切り上げ゛についての説明である
本アルゴリズムに対して、除数は "2"で、゛(n/2)+0.5゛を対応するする整数値と理解できる。だから、ここで、誤差を予想される。即ち、n値は一定の範囲があり、ここのnは゛s3c2410fb_calc_pixclk(fbi、 var->pixclock)゛ であり、だから上記の公式は次のように変更されできるclkdiv= s3c2410fb_calc_pixclk(fbi、 var->pixclock)/2 + 0.5、そしてs3c2410fb_calc_pixclk(fbi、var->pixclock)関数はinux-2.6.32.2/drivers/video/s3c2410fb.cに次のように定義される
clkdiv=clk*pixclk/(10^12)/2 + 0.5を出し、プリントアウトした結果を検証したら、ここのclkはHCLKである、static void s3c2410fb_activate_var(struct fb_info *info)関数の説明より次の関係を出し:
CLKVAL=clkdiv-1
2440データシートから得る公式CLKVAL=HCLK/(VCLK*2) -1と結び付け、次の゛ソフト゛結果が出る(゛ソフト゛は誤差範囲)
Pixclk=(HCLK-VLCK)x10^12/HCLK*VCLK
Toppoly画面を例として
HCLK=100Mhz=100、000、000Hz
VLCK=6.4Mhz=6400、000Hz
計算は:pixclk =146250、単位は ps(picoseconds)で、実際の設定値170000と誤差がある
その他Linuxカーネルドキュメントには既に一つpixclockを計算する方法があり、linux/Documentation/fb/framebuffer.txtを参照する。
パラメータに対して理解し難い方々は、検証済みの移植パラメータで設定する方法をお勧める。
3.12.3 カーネルに各種LCDタイプのサポートを追加
arch/arm/mach-s3c2440/mach-mini2440.cをオープンし、最初のLCDデバイスプラットフォームのコードを削除する
移植コードを追加する、次のように示す
次にdrivers/video/Kconfigをオープンし、1935行ぐらいの位置でに次の設定情報を追加する
これでLCDドライバの移植が完了する。上述方式で他型のLCDドライバも追加できる。小サイズのpixclockパラメータはToppoly 3.5 "を参照し、640x480解像度以上のタイプのパラメータは8゛LCDのを参照し、使用LCDの長さ・幅も変更する必要がある。
3.12.4 カーネルを設定し、開発ボードにダウンロードし、テストする
コマンドライン:make menuconfigを入力し、カーネル設定に入り、次のサブメニューに従い順に選択する
下図を参照するLCDモデルの設定オプションが出る
spaceまたはEnterボタンを押して必要のLCDモデルを選択し、カーネル設定を保存し、終了する
コマンドライン:#make zImageを実行し、arch/arm/boot/zImageを生成し、開発ボードにプログラミングし、スクリーンには小さなペンギンがでると見えます。
3.13 Linux Logoを変更
3.13.1 コマンドラインツールでLinux LOGOを変更
Linuxシステムは起動する時、下記の画像が表示する
対応するするファイルはlinux-2.6.32.2/drivers/video/logo/linux_logo_clut224.ppm
画像のlogoファイルを変更する方法はたくさんあり、よく使われるのはnetpbmツールセットである。
゛netpbm゛はコマンドラインのツールで、多数のフォーム画像を変換できる、ここで、pngフォームを例として、PNGファイルを必要のLinux LOGO画像へ変換する。
仮に、変換されるファイルの名前はlinux_logo.pngで、まずpng画像はpnmに変換される
# pngtopnm linux_logo.png > linux_logo.pnm
png画像のの色は224に制限される
# pnmquant 224 linux_logo.pnm > linux_logo_clut224.pnm
最後にpng画像は必要のLinux LOGO画像を変換する
# pnmtoplainpnm linux_logo_clut224.pnm > linux_logo_clut224.ppm
最後、linux_logo_clut224.ppmはlinux-2.6.32.2/drivers/video/logoの対応画像を取り替えるだけ
3.13.2 グラフィカルLogoMakerでLinux LOGOを作成
ユーザーに便利に使用させるようにLogoMakerを使用し設計し、これはFedora 9プラットフォームに基づいて開発し、実はこの最下層が呼び出すのは上述コマンドラインツールである。実行結果は浮動小数点エラーな場合、Fedora9を使用する時下記図のようなエラーが出る場合、netpbmツールを正しくインストールされていないと思う(マニュアルの手順に従いFedora9プラットフォームをインストール)
次はLinux LogoMakerの使用手順である(mini2440ユーザーマニュアルから写し取る)
まずユーザーマニュアルに従いlogomakerツールプログラムをインストールし、任意コマンドライン:logomakerを入力し、起動する。花の画像が表示する、下図を参照する
File->Open a picture file…、またはショ—トカットキ—Ctrl+Oを使用し、画像ファイルをオープン、ファイルウィンドウで画像を選択
画像はlogomakerウィンドウで表示するる、下図を参照する
File->Convert the picture to a Linux Logo File、またはショ—トカットキ—Crtl+Cを使用し、ファイルディレクトリ保存、保存ディレクトリを選択し、ファイル名前はlinux_logo_clut224.ppmと自動的に保存する。このファイルをlinux-2.6.32.2/drivers/video/logoディレクトリ下の同名ファイルを入れ替える。
LogoMakerの説明は下図を参照する(メニュー゛help->About゛をクリックするだけ、これをオープンする)
3.14 ADCドライバ追加
3.14.1 S3C2440のADCとタッチ•スクリーン•インタフェースについて
Linux-2.6.32.2カーネルはS3C2440をサポートするADCドライバプログラムを提供しないため、自分で設計必要となり、ドライバはキャラクタデバイスで、drivers/charディレクトリ下にある、ドライバプログラムのファイルの名前はmini2440_adc.cである
S3C2440チップにはAD入力とタッチ•スクリーン•インタフェースは共同のA / Dコンバータを使用し、2440データシート第16章節を参照する
3.14.2 カーネルにADCドライバを追加
ADCドライバとタッチ•スクリーンドライバは共存させるには、A / Dコンバータリソースを共用の問題を解決する必要がある、ADCドライバプログラムにグロバル゛ADC_LOCK゛ セマフォ変数を定義し、ADCドライバプログラムの内容とコメントは下記の通り
上記のドライバプログラムには、簡単なヘッダファイル头文件゛s3c24xx-adc.h゛を含め、これはdrivers/charディレクトリ下にある、内容は下記の通り
その後、drivers/char/Makefileファイルをオープンし、大体114行にADCドライバプログラム目標モジュールを追加する
次にdrivers/char/Kconfigをオープンし、ADCドライバ設定オプションを追加する
カーネルにADCドライバを追加し、カーネルソースコードディレクトリのコマンドライン:make menuconfigを実行し、次のサブメニューを順に選択し、先に追加したADCドライバ設定オプションを探す
スペースバーを押して、ADC設定オプションを選択する
その後、終了し、設定保存、コマンドライン:make zImageを実行し、arch/arm/boot/zImageを生成し、superviviの゛k゛コマンドを使用し、開発ボードにプログラミング
----------続く