デバイスドライバ解析

 CAT760に添付されてきた「組み込みLinuxガイド」に
 Bootloaderの記述がありました。
 説明の中に、カーネル起動パラメータに、videoを利用
 する指定が可能と記されています。
 ページ12に、詳しい内容があります。

 video=sh7760fb:on

 と指定すると、LCD用のデバイスドライバを有効にできます。

 そこで、Bootloaderの起動パラメータを変更しました。
 操作内容は、以下です。
 (>>と#が、システムからのプロンプト)

 ボード上のSW1の4をONにします
 >>config
  console=ttySC0,115200 root=/dev/mtdblock2 ro rootfstype=jffs2
  >>admin
 パスワードタイプします
 フレームバッファ用デバイスドライバを利用できるようにパラメータ変更です
  #setparam console=ttySC0,115200 root=/dev/mtdblock2 ro rootfstype=jffs2 video=sh7760fb:on
  #config
  console=ttySC0,115200 root=/dev/mtdblock2 ro rootfstype=jffs2 video=sh7760fb:on
  #boot

 上記操作で、内蔵LCDコントローラが動作するようになりました。
 ブート時から、少しの間、LCDディスプレイの左上に下の絵が出力
 されます。



 このデバイスドライバで、利用しているLCDが動作を続けられるか
 不明なので、C言語で記述されてたソースコードを解析しました。


sh7760fb.cの存在場所

 CAT760に添付されてきたCD-ROMから、カーネルを展開すると  カーネルに関連するディレクトリの/drivers/videoの中に  sh7760fb.cというLCDコントローラ用のデバイスドライバが  ありました。  オライリーシリーズの「Linuxデバイスドライバ第2版」を  読むと、/drivers/videoの中に必要なデバイスドライバを  格納しておけば、カーネル再構築で、フレームバッファに  関連する内容を、カーネルに取り込むことが可能だとか。  (詳細は、実際に書籍を読んで確認してください。)  デバイスドライバの存在場所がわかったので、解析を  始めました。

水平表示ピクセル数

 自分は、表示関係デバイスの特徴を理解するため、表示ピクセル数を  基にして、必要なパラメータを把握していきます。  ソースコードを見ていくと、次のマクロ定義がありました。  #define LCD_X_SIZE 320  #define LCD_X_ALL 400  #define LCD_Y_SIZE 240  #define LCD_Y_ALL 262  LCD_X_SIZEは横のピクセル数、LCD_Y_SIZEは縦のライン数かな  と思いつつ、次々にコードを読み進めていきました。  ある部分で、コメント入りのマクロ定義が出てきます。  // 水平キャラクタ数レジスタ  #define HDCN LCD_X_SIZE  #define HTCN LCD_X_ALL ctrl_outw(((HDCN/8-1)<<8) | ((HTCN/8)-1), LDHCNR);  このコメントを見た時点で、確証が持てました。  「LCD_X_SIZEは、横ピクセル数。LCD_Y_SIZEは、縦ライン数。」  であると。  表示関係のデバイスは、CRTディスプレイを基準にし、内部  レジスタの構成を考えてきた経緯があります。さらに、キャラ  クタディスプレイが、最初だったので、キャラクタを単位とし  データシートに一貫性を持たせています。  データシートのLCD関係部分を読むと、1キャラクタ=8ビット  とすると、但し書きがありました。  HDCNは、Horizontal Density Charactorか何かの略で、Nは数値を  表すNumberです。この略号は、水平キャラクタ数を意味すると考え  られ、320/8=40が有効キャラク数になります。  また、HTCNはHorizontal Total Charactor Numberの略でしょう。  水平総キャラクタ数に相当します。何故、総キャラクタが必要か  というと、CRTディスプレイには、水平と垂直双方に帰線区間  が必要だからです。この場合、総キャラクタ数−キャラクタ数が  水平の帰線区間になります。  水平の帰線区間は、80ピクセル(10キャラクタ)となります。  ハードウエアの整合性を検討したとき、次の内容が出てきました。  表示開始前に48D(48クロック)、表示終了後に8D(8クロック)を入れます。  これは、表示320Dを固定にしたとしても、3D、48D、8Dは最低確保する  クロック値になっています。  3D、48D、8Dを、すべて加算すると、59Dになります。Dは、ドット  クロックで、ピクセルクロックと同じとしてよいため、最低59ピク  セルより大きい帰線区間を入れたと等価です。  従って、この設定のまま、変更の必要はありません。  帰線区間の中に、同期信号を入れるので、最低3ピクセル分の同期  信号長になっているかを、確認します。次のコードがありました。  // 水平同期信号レジスタ  #define HSYNW 8  #define HSYNP (LCD_X_ALL-HSYNW-52) ctrl_outw( ((HSYNW/8-1)<<12) | (HSYNP/8-1), LDHSYNR);  HSYNWは、Horizontal SYNchronous Widthの略と検討がつきます。  8ピクセルなので、1キャラクタ分、水平同期信号を出力します。  HSYNPは、Horizontal SYNchronous Positionの略だと検討がつきます。  マクロ定義の計算式より、340となります。  ここまでの内容を振り返り、接続しているLCDに表示できるか  を検討してみます。  1ラインの表示を、画像ピクセル表示と水平帰線区間に分けます。  水平帰線区間は、同期信号の前に20ピクセル、同期信号の後に  52ピクセル、表示に無関係の部分があります。  同期信号を先頭にして、並べ替えると、下図となります。  デバイスドライバとLCDの仕様で比較します。  水平同期信号の幅は、最低3ピクセルに対して、8ピクセルで  LCDの要求する仕様を満足しています。  水平同期信号に続く、画像ピクセル表示開始までは、最低48  ピクセルに対し、52ピクセルで要求仕様を満足しています。  画像ピクセル表示終了から、最低8ピクセルが必要なのに対し  20ピクセルで要求仕様を満足しています。  これで、水平方向の信号のタイミングは、変更なしでいけます。  水平同期信号は、LCDの仕様は、負論理となっています。  CAT760に利用している、SH-4のLCDモジュールの設定部分に  次の記述がありました。  // モジュールタイプレジスタ  #define FLMPOL 1 // 負論理  #define CL1POL 1 // 負論理  負論理で利用しているので、この部分の変更も必要ありません。

垂直表示ライン数

 LCDは、2次元で表示しているため、垂直方向の設定も  仕様を満足しているか、見る必要があります。  ソースコードを見ていくと、次のマクロ定義があります。  #define LCD_Y_SIZE 240  #define LCD_Y_ALL 262  これで、有効な表示ライン数は、240ラインとわかります。  1画面の総ライン数は、262ラインで、垂直帰線区間は、  22ラインになります。  垂直に関連する部分を探すと、次のコメント入りマクロ定義が  ありました。  // 垂直表示ライン数レジスタ  #define VDLN LCD_Y_SIZE ctrl_outw(VDLN-1, LDVDLNR);  // 垂直総ライン数レジスタ  #define VTLN LCD_Y_ALL ctrl_outw(VTLN-1, LDVTLNR);  // 垂直同期信号レジスタ  #define VSYNW 4  #define VSYNP (VTLN-7) ctrl_outw( ((VSYNW-1)<<12) | (VSYNP-2), LDVSYNR);  VDLNは、Vertical Density Line Numberの略。  VTLNは、Vertical Total Line Numberの略。  垂直同期がどうなっているかを、解析してみます。  VSYNWは、Vertical SYNchronous Widthの略です。  これが、4ラインとなっています。  また、VSYNPは、Vertical SYNchronous Positionの略で  マクロ定義の計算式より、255です。  ハードウエアの整合性を検討したとき、次の内容が出てきました。  垂直同期信号のため、最低3H(3ライン)は電圧レベルが  Lです。そして表示開始前に4H(4ライン)、表示終了後  に4H(4ライン)を入れます。これは、表示の1〜240  Hは、固定ですが、3H、4H、4Hは最低限確保するカウント値  になっています。  3H、4H、4Hを、すべて加算すると、11Hになります。Hは  1ラインと等価なので、最低11ラインの帰線区間を入れる  とよいことになります。  デバイスドライバでは、22ライン入れているので、設定  を変更するか否かは、タイミングが仕様を満たすかを見て  みます。  1画面表示を、画像ライン表示と垂直帰線区間に分けます。  垂直区間は、同期信号の前に16ライン、同期信号の後には  3ライン表示に無関係の部分があります。  同期信号を先頭にして、並べ替えると、下図となります。  デバイスドライバとLCDの仕様で比較します。  垂直同期信号の幅は、最低3ラインに対して、4ラインで  LCDの要求する仕様を満足しています。  垂直同期信号に続く、画像ライン表示開始までは、最低4  ラインに対し、3ラインで要求仕様を満たしません。  画像ライン表示終了から、最低4ライン必要なのに対して  15ラインで要求仕様を満足しています。  一部、垂直方向の信号タイミングは仕様を満足していません  が、表示できたので、変更なしとしました。  水平同期信号は、LCDの仕様は、負論理となっています。  CAT760に利用している、SH-4のLCDモジュールの設定部分に  次の記述がありました。  // モジュールタイプレジスタ  #define FLMPOL 1 // 負論理  #define CL1POL 1 // 負論理  負論理で利用しているので、この部分の変更も必要ありません。

ピクセルクロック

 ピクセル(ドット)クロックは、4.7MHz〜7.60MHzに入って  いなければ、表示が乱れます。  ピクセル(ドット)クロックの設定は、次のマクロ定義で  確認します。  // インプットクロックレジスタ  #define ICKSEL 2  #define DCDR 4  はじめのICKSELで、外部からLCDモジュールにクロックを入力する  指定になっています。外部クロックは、25MHzとなっています。  下のDCDRで、分周比率を設定します。データシートから、クロックを  4分周するので、25MHz÷4=6.25MHz。  4.7MHz〜7.60MHzに入っているので、そのままで、要求仕様を満たし  ます。

その他

 帰線区間中に、同期信号を出すか止めるかという設定がありますが  これは、出す必要があり、デバイスドライバの設定をそのまま利用  しました。  AC制御は、利用したLCDディスプレイでは不要なので、設定を  そのまま利用しました。

戻る