いろいろ試す10

あけましておめでとうございます。
今年もねむいさん(と虹裏メイドたち)を宜しくお願いします(ペコリ

と関係者向けのごあいさつを終えたところで今日のブログはおわ…ったら去年の二の
舞になってしまいますので、今年こそは本気を出して出来る限り前へ前へと進んでい
こうと心に誓う次第でございます。虹裏に投下する絵やコラももう少し増やせるように
ネタの回転力もあげたいなと。



さて、MentorGraphics社に買収されたCodeSourceryが去年暮れにリニューアルして新
バージョンが(Sourcery CodeBench Lite 2011.09-69)リリースされています。
やはりと思いましたが落とすのにメールでユーザーの登録を求めて来るようになり、
非常にかったるくなってしまいましたがこちらからフツーに落とせますのでご活用ください。

今回の変更点はGCC4.5.1からGCC4.6.1にアップした点ですが、LinkTimeOptimization
の効果が少し変わっています。以前と同じままだと必要な部分まで削られてしまい
ますので以下のように変更しておいてください。細かい変更はGCCの本家丸投げ
-flto -fipa-sra

-flto-partition=none -fipa-sra
またデバッグ時にLTOを有効にしてるとブレークポイントが上手く張ることができない
ことがあるので無効にしておきましょう。
さらに最適化レベルに-Ofast(-ffast-mathを強制付与)が加わりました。

新しいSourceryでCMSISを含むコードをコンパイルしていると以下のようなエラーを吐いて

"Error: registers may not be the same -- `strexb r0,r0,[r1]"
というエラーメッセージを吐いてビルドが止まることがあります。
"ことがある"と書いたのはコードの流れによってはエラーを回避できる機械語に落とし
込まれる場合もあり、発見が遅れるケースが出てきます。
この件についてはこちらのディスカッションにある内容が詳しいです。
回避方法は…
引っかからないようにレジスタ変数を強制的に割り当てるというベタベタ
なコードに置き換えるのが唯一の方法です…。_STREXBとか_STREXHとか使わないから
コメントアウトするというのは後で困ることになるのでなるべく避けましょう。
__STREXB関数の変更例。__STREXHも同じような感じで変更してください。
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;

__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
return(result);
}




uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
register uint32_t result asm ("r2");
register uint8_t value1 asm ("r0") = value;
register volatile uint8_t* addr1 asm ("r1") = addr;
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr1), "r" (value1) );
return(result);
}


audin氏のブログのコメントにてiruka氏によりスマートな回避方法が提示されています。
上にあるディスカッションにも記述されていますがインラインアセンブラに早期破壊
オペランドを示す修飾子"&"を付与することによって__STREXB、__STREXHをコンパイル
した時にオペランドが同一レジスタとなりエラーが出るのを回避するとのことです。

CMSIS1.x系はcore_cm*.cに記述されていますが、CMSIS2.0以降はcore_cmInstr.hに記述
されています。変更する内容はどちらも同じです。CMSISの方が修正されるまでこれで
回避しておきましょう。
20120529追:
CMSIS3.0xでは早期破壊オペランドを使用する修正になっています。
おきぱにおいてあるサンプルはすべてCMSIS3.01にしておりますので安心して
お使いください。

これらは液晶表示デモも兼ねています。今回の更新にあたり、多数のSPI液晶を含め
た液晶モジュールのドライバも追加しています。少し前にaitendoさんより販売された
S95591-AAA(コントローラIC:S6D0129)TFT1P2797-E(コントローラIC:ILI9481)のドラ
イバももちろん作り込んでいますので参考にどうぞ。
あと業務連絡ですが、S95591-AAAとTFT1P2797-Eの初期化手順は全く違いますので
勘違いされないようご注意ください。




おまけ
もうキリがないから辞めようと思ったのにまたやってしまった中華液晶モジュール
のコレクションたち…さらに詳しい詳細は私までご連絡を…




176x220サイズのQCIFなSPI専用液晶。コントローラICはHX8340Bなのですが…
なんとHX8340B(N)という細かい型番が存在しているようで初期化手順どころかレク
タングルの指定・GRAMの書き込みコマンドまで全く違う別物でした…以前紹介した
HX8340Bは本当はHX8340B(T)という型番だそうです。
しかもSPIは9bit固定でした!!!!orz
てわけでハードウエアで9bitシリアルがサポートされてるMARY(LPC1114)とかには
いかがでしょうか?ちょっと解像度的にきついと思いますけど…



Mouserで購入できるSDT018ATFTと言う液晶モジュール。コントローラICはILI9163C
だそうですがこいつも外に出てるピンの関係でシリアル接続は9bit固定でしたorz
てわけでハードウエアで9bitシリアルがサポートされてるMA(ry
(8-bit 8080,9-bitSerial接続)



これはセカンドソースがたくさんあり、ebayでも最安5USD前後で購入できるNOKIAの
液晶です。情報元はこちらの方のページです。
コントローラICはSPFD54124Bです…が案の定外に出てるピンの関係でシリアル接続は
9bit固定でしたorzてわけでハードウエアで9bitシリアルがサポ(ry


それとねむいさんのぶろぐ見てる人なら楽勝でしょうが、0.4mmピッチのハンダつけが
出来る人向けです。
(8-bit 8080,9-bitSerial接続)






最後に128x128以上の解像度がなかなか手に入らないアクティブマトリクスOLEDの中で
176x220のQCIFサイズなC0200QILC-Cを


視野角とか素晴らしいのですが、OLEDの弱点である焼きつきが起こるので同じ画像を
ずっと表示することはできず、フォトフレームとかに使うと泣きを見るでしょう。
ここ最近は広い視野角TFT液晶がどんどん出てきているので無理してOLEDを選択する
必要も無くなってきました。

クリスマスの時の頂き物を…。いなちゃんは性的すぎる…♥

Comments

ねむいさん、おめでとうございます。今年もよろしく。

精力的なご活動に感服しております。
沢山のTFT液晶のサポートには驚くばかりです。

実は、私もAitendoでTFT液晶(YHY024006A-PCB)を入手しており、そろそろ手持ちのSTM32F107で動かそうと企んでいますが、ねむいさんから頂いた32F107のソースコードには、この液晶のコントローラーILI9325用がなく、9327のものしか見つかりませんでした。

このドライバーはフルコンパチなのでしょうか。それとも別のところに9325のものがあるのでしょうか。

おてすきのときにでも、教えていただけると幸いです。

がた老様、ねむいです。おはようございます。

ILI9325の初期化手順は当zipファイルを解凍して出てくるディレクトリ
"./lib/display/drivers/src"内のili932x.cファイル内にあります。
ili932x.c内ではILI9320,ILI9325,ILI9325c,ILI9328,R61505U,LGDP4531の
ドライバが共用となっており初期化時のデバイスコードの読み出し操作で
分岐するような仕組みにしてあります。

それゆえにスマートさが全くないものすごく単調なコードとなっているので
webを散見した限りでは私の公開しているコードの該当するドライバICの
初期化手順だけ抜き出して流用されている方がほとんどです。

早速の、しかもご丁寧な回答、ありがとうございました。
そうか、探し方が下手だっただけですね。すみません。
お手数をおかけしました。

Post a Comment








Go to top of page