2013/07/20(土)[CMD] stty

シリアルコンソールが狭い

defaultでは、80x25の表示領域として振る舞うようだ。
vimやlessコマンドを入れた場合に、その大きさが把握できるハズ。

実際にコードを編集する際に手狭に感じるので、コレを大きくしたい。
検索してみると、次のコマンドが使えることが判った。
STTY(1) : stty - change and print terminal line settings
bash上では、環境変数にも見当たらず、sttyコマンドで設定値を
見れば反映されていることが判る。
どこにどういう形式で保存されているか、は、把握しておきたい所ではある。
でも実際にアプリ開発などでブチ当たるまでは調査保留で...
$ stty rows 40; columns 120;
$ stty -a
speed 115200 baud; rows 40; columns 120; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

[ARM] kernel先頭から。その1

2013/07/17Linux::ARMimport

ARMv7 ARCHのARMから...

MPcoreから追加されている話も新規として扱います. 脳内はARM928EJ-Sあたりで停止していましたので..
メモリ空間の属性は、
  • ストロングリオーダ(Strongly ordered)
  • ノーマル()\メモリ属性は以下がある。
    • (Outer Shareable)
    • (Inner Shareable)
    • (Non shareable)
  • デバイス
    • (shareable)
    • (Non shareable)
ここでいうshareは、プロセッサ間で共有アクセスの有無を示す。
Outer/Inter sharebleの差異は、Outerが実装定義でレベルをつけたアクセス制御が入るらしい???
A3-27あたりからatomic accessに関する記載がある。

mm初期化処理を追う... ために, kernel起動先頭から少し追ってみる.

vmlinuxをdisasすると entry pointが "stext"なのがわかる.*1
entry pointには、以下のコメントがあり、展開される位置、状態、レジスタ値について記載がある。

・・・どのみちすぐにldscript読まなあかんかった。
FILE:arch/arm/kernel/vmlinux.lds
 .init.pv_table : {
  __pv_table_begin = .;
  *(.pv_table)
  __pv_table_end = .;
 }

 Kernel startup entry point.
 ---------------------------

 This is normally called from the decompressor code.  The requirements
 are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
 r1 = machine nr, r2 = atags or dtb pointer.

 This code is mostly position independent, so if you link the kernel at
 0xc0008000, you call this at __pa(0xc0008000).

 See linux/arch/arm/tools/mach-types for the complete list of machine
 numbers for r1.

 We're trying to keep crap to a minimum; DO NOT add any machine specific
 crap here - that's what the boot loader (or in extreme, well justified
 circumstances, zImage) is for.
	/*
	 * r1 = machine no, r2 = atags or dtb,
	 * r8 = phys_offset, r9 = cpuid, r10 = procinfo
	 */
	bl	__vet_atags			// ゴミデータなら r2=NULL と修正される。
#ifdef CONFIG_SMP_ON_UP
	bl	__fixup_smp
#endif
#ifdef CONFIG_ARM_PATCH_PHYS_VIRT //enable
	bl	__fixup_pv_table	//
#endif
	bl	__create_page_tables
kernel imageがロードされた物理アドレス と kernel空間を設置しようとしている論理アドレス、との
アドレス値の差分を r8に計算、保持する。
__fixup_pv_tableを呼び出して、"arch/arm/include/asm/memory.h"で定義した関数・マクロの
論理ー物理変換関数が参照する変数を書き換える。
ロード位置が固定されていればいらないのかもしれないけれど,headの記述からするとそうもいかんような.
このheadは展開後のkernel start位置なので、compressed kernelの先頭は別のところ。*2

*1 : 本当は順序建てて ldscriptから..のほうがいいけれど, この手順でやってもうたので、こう記しておく。

*2 : たぶん、これだけど、未検証:arch/arm/boot/compressed/head.S

2013/07/14(日)LInux開発入門(外部URL参照)

初学者のためのLinux起動シーケンス概要

題名はもっともらしいですが、とりあえずURL貼っておくだけで。。。
Linux kernelが起動するまで、と、起動してからユーザランドに渡るまで、
ユーザランドの起動処理、くらいに分類できるかな、と思います。
最後のユーザランド起動処理の手前までは、Androidも一緒でしょう。(未確認)

京都マイクロコンピュータ様のblogリンクが多いのは、それを見てまとめておこうと感じたからです(^^;
他にもネタが出てきたら追加しいこうと思います。オレオレメモってやつですね(ぉ

起動シーケンス(uboot/barebox)

ちょうどこの切り替わりに遭遇していました。
昔からのマイコンは、外部メモリからbootしていましたよね。
ワンタイムROM、UVEPROM、EEPROM・・・と来ていますね。

昨今は原低のため、外部記憶にSD card/NAND Flashのみという構成を取るようになってきているので、
SoC内のMaskROMに埋め込まれているbootloaderから起動してくれます。
このへんの設定は、SoC次第ですし、boot modeでNORからの起動するようなものもいます。
かならずMaskROMからしか起動しないのもきた気がする。
U-bootのデバッグ

ユーザランドの処理(Linux版)

initrd有効の場合は、initramの/linuxrcから起動したはず。
process id=1として、最初に起動されるのは、kernel parameterにinit=で指定したもの、
それがなければ、/sbin/initの順にチェックして、rootfsがmount出来なかったり、init実行ファイルが
なければ、OOPS吐いて止まります。ポーティング作業とか疲れてくるとよく見かけます(謎

ユーザランドの処理(Android版)

Androidのinit処理の流れ。Linuxの普通?のinitとはフローが違うので参考に。
いきなり渡されて流用できるとは思っていなかったからなぁ。こちらと別のblogを参考にさせていただいた記憶が…。
Androidのinit

その他紹介したい記事

「組み込みエンジニアのためのLinux入門 仮想メモリ編」

kernel documentも見ておきましょう。最後はソースコードが正義です。。

LInux開発入門

2013/06/09linux::入門編import
冒頭から逃げを書いておきますが・・・
手探り状態、読者対象が具体的に見えない状況下で記載を始めます。
昨今、マトモな出版物も増えてきているので、需要がないかもしれませんが、少しでも道標になれば幸いです。

Linux OSを用いた開発

以前までは、組み込みといえばuITRON系のRTOSが幅をきかせていましたが、
プロセッサ能力向上・メモリ単価の減少、要求要件の拡大などの要因により、
見直されてきているように思います。
最も影響があるのはNetwork Protocol Stackや、複数プラットフォームで共通的に使えるソフトでしょう。

もちろん、ITRON系のリソースも現役です。少ないROM/RAM、軽量なマイコンでも動くので、住み分けができるでしょう。
より低機能であればOSレスもありますし、畑は広大です。

さておき、ひとことでLinux OS開発といっても、OSはもよとり、コンパイラ・アセンブラ・リンカその他ツール類すべてがOpen Source Softwareを使用します。自らソースコードを元に開発環境や実行環境を用意することができます。MicrosoftのVisual Cのように、コンパイラに対価を支払うのとは対照的ですが、何か問題が起きたとき、起きそうなとき、それを知るための方法を、どのように確保するのか、が課題となります。これを商売にしている会社もありますね。

構成

以下に、クロス開発環境を前提としたソフトの構成例を記します。
開発ツールを買えば、裏ではこれらのソフトを準備してくれたりします。
MSDOSやWindows、商用UNIXでやってきた方には、高い金でコンパイラや統合開発環境を買った記憶があることでしょう。

Linux_SW_001.png


黄色い部分が、ターゲットに載せるべきものです。
右下にある、libraryを除く開発ツールは、必須ではありません。必要に応じてセルフ開発環境やデバッグツールを取り込むのがよいでしょう。

ubuntoやdebianの各arch向けディストリを使う場合は、セルフ環境も必要になりそうな気はします。いや、基本はバイナリインストールになっているしょうか。

ベンダ提供

あえてドライバ・アプリのところへ、ベンダ提供〜を記載しました。
実務で使っていると、必ずしもすべてをopenにしているのでは無いですから、ね。各社の製造ソフトに関しても、GPL伝播していないものは公開義務を負いませんから公開されることは無いです。GPLv2までの場合は、その再配布責任を追うことから、なんらかの手段で製品で使用したtarballなどの提供を受けることができます。
液晶テレビ・レコーダ・STB・そのほかそれっぽい家電の説明書を眺めてみれば、Open Source使用の旨と、その製品で使用したものの入手方法が記載されているでしょう。
尤も、オンラインでさくっと手に入るところもあれば、電話問い合わせ・郵送による配送もあります。
エンドユーザから公開の依頼が頻繁にはないのでしょう、かねぇ?

ライセンスの話が出てきましたが、これだけで深いネタになります。
僕も把握しきれておらず、法的な問題になる場合は判例を調べた上で判断したほうが良いでしょう。
個人で楽しむ分にも、価値が認められ、公開義務を追うような作りをした場合は、開示を迫る人がでてくるかもしれません。

toolchain

いわゆるコンパイル環境、です。ソースコードをターゲットで動くバイナリに変換します。
最近は LLVMというのが注目を集めているようです?

汎用性を考慮されたソフトの配布では、Makefileを利用していることでしょう。
また、autoconfや独自のconfigrationツールを用意して、buildするホスト環境差分を自動的に検出・適切に変更するような手段を提供しています。

しばらくしてわかったこと

何事も過去の経緯を知ることが理解への早道に繋がることがあります。同じようなものがなぜ複数存在するのか、ディストリビューションのそれぞれの目的、本当に全てが無料なのか。製品に搭載するために必要なことは?などなど。いまだにわからない事だらけですが、所詮個人がわかる範囲なんてのはしれてるわけで。

必要なとき、必要なところで、短時間でほしい情報に辿りつけるハナ・直感力を持てるようにしておくのが、対策となろうかと思います。もしくは大まかに畑を分割して、担当範囲を分けておくか、です。ですよね・・・?
後半は妄想でしかないので...

2013/05/22(水)DisplayLink社のチップを使う

DisplayLink社のUSB-Display出力インタフェースは、kernel mode driverが
main lineに投入されている。

以下を信用するならば、ubuntuでは標準で投入されているようだ。
http://cateee.net/lkddb/web-lkddb/FB_UDL.html
http://whitesc3.blog7.fc2.com/blog-entry-106.html

更新頻度が低いのと、有効活用?のため、ちまちま更新しておくかな...

x86-64環境

PCに接続してデバイス情報を見てみる。kernel driverも認識しているけれども、
どうもうまく表示されない。
今回はなんとか画像を表示したい、てことで、libdloで簡易確認。
ディスプレイ解像度1280x1024設定では、ディスプレイがついてこなかった。
テストプログラムを1024x768に強制指定して何とか動く程度。
自動では解像度の認識をせず、1600x1200にしようとしてくれた。無念。
突貫工事ができるスキルも欲しいですね。あとで綺麗にしないといけないので、
メモは重要・・・。そして尾蔵入り(ェー
Bus 002 Device 008: ID 17e9:032e Newnham Research 

T:  Bus=02 Lev=01 Prnt=01 Port=03 Cnt=01 Dev#=  8 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=17e9 ProdID=032e Rev=01.02
S:  Manufacturer=DisplayLink
S:  Product=I-O DATA USB-RGB_D2
S:  SerialNumber=0031A9
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=00 Prot=00 Driver=udlfb
リンク先メモ
http://libdlo.freedesktop.org/wiki/
Libdlo
Working version (git): http://cgit.freedesktop.org/libdlo/
http://whitesc3.blog7.fc2.com/blog-category-13.html

libdlo,libusb,libusb-compat

BuildRootでもパッケージとして提供されているので、チェックするだけ。
古いものだと入っていないかもしれないので、そのへんは適当に拝借すると良い。