Mini2440組込Linux移植ステップバイステップガイドライン(10)

Mini2440/Mcro2440等開発ボード関連のフォラーム

Mini2440組込Linux移植ステップバイステップガイドライン(10)

投稿記事by dwtechadm » 水 9 11, 2013 4:18 pm

3.18  UDA1341オーディオドライバを移植
3.18.1 初期化ファイルにUDA1341デバイス構造を追加
Linux-2.6.32.2は既にUDA1341オーディオドライバを十分にサポートし、arch/arm/mach-s3c2440/mach-mini2440.cファイルに UDA1341プラットフォームデバイスの制御ポートを登録するだけ、mach-mini2440.cをオープンし、次の内容を追加する
画像
画像
こうして、UDA1341オーディオドライバを追加できた、その後、カーネルに該当ドライバを設定する



3.18.2 カーネルにUDA1341ドライバデバイスを設定
カーネルソースコードディレクトリにmake menuconfigを入力し、カーネル設定、次のサブメニューを順に選択し、オーディオドライバ設定メニューを探す
画像

スペースキ―を押して、゛[*] Preclaim OSS device numbers ゛を選択し、また゛<*> Advanced Linux Sound Architecture --->゛を選択し、Enterボタンを押してサブメニューに入る
画像
オーディオドライバシステム構造がで、OSSのインターフェイスの設定オプションを選択する。OSSのインターフェイスはALSAインターフェイスに基づいて作成され、新カーネルにはALSA設計を変更する、ここで、以前のソフトウェアと相性性がある、下図を参照する
画像
゛<*> ALSA for SoC audio support --->゛サブメニューを選択し、Enterで入る
画像
ここで、S3C24xxシリーズチップ(S3C2410/2440/2443などを含まれる)のため作成される設定オプションを見てlinux-2.6.32.2/sound/soc/s3c24xx/Makefileファイルをオープンする、下図を参照する
画像
開発ボードはUDA1341オーディオチップを使用し、゛-*- SoC I2S Audio support UDA134X wired to a S3C24XX゛を選択する


3.18.3 MP3再生テスト
カーネルソースコードディレクトリでmake zImageを実行し、生成したカーネルイメージファイルは開発ボードにプログラミングし、デフォルト・ファイルシステムroot_qtopiaを使用し、システム起動後、madplayソフトウェアを使用し、mp3を再生/テストする、スピーカーまたはヘッドフォンを開発ボードの緑オーディオ出力コンセントに接続。テストを行う、下図を参照する
画像



3.18.4 ドライバでのレコーディングコード修正
ここまでmp3の再生は正常で行われるが、録音プログラムを使用し、録音の時音声は聞こえなかった、それは開発ボードの録音回路はSMDK2440のターゲットボードの回路と異なる
Mini2440開発ボードの録音回路は下図のようになる
画像
mini2440開発ボードの録音チャンネルはVIN2で、SMDK2440のはVIN1、linux-2.6.32.2/sound/soc/codecs/ uda134x.cをオープンし、大体201行に次の赤いコードを追加する
画像
録音ドライバは修正完了、カーネルソースコードディレクトリ下にmake zImageを実行し、カーネルをコンバイルし、開発ボードにプログラミング


3.18.5 録音テスト
Qtopiaの"ボイスレコーダー"のテストプログラムをオープンし、下図を参照する
画像
゛REC゛ボタンをクリックし、録音する、マイクで話し、録音の波形を確認でき、゛STOP゛ボタンで終了、下図を参照する
画像
゛PLAY゛で再生、録音オーディオファイルは゛WAV゛フォーマットでドキュメントに保存される
画像

説明:Qtopia 2.2.0システムは録音プログラムを持って"ボイスメモ"で録音するが、ハードウェア上ボードのマイクを正常に使用、録音できない。コードのフォーマットを維持するため、修正しなかった。



3.19 シリアルポートドライバを修正

3.19.1  UART2を一般シリアルポートドライバに変更

S3C2440チップは3つのシリアルがあり、UART0、1、2、ダウンロードした Linux-2.6.32.2はパーフェクトなUART0、1ドライバを備えて、UART2では赤外線通信(Irda)として使用されるため、普通のシリアルとして使用されるように、UART2ドライバを修正する必要がある、
先ず、S3C2440シリアルの部分レジスタの説明を見る、下図のとおり
画像
カーネルでUART2に関する設定を修正し、mach-mini2440.cファイルをオープンし、次の赤いコードに従い修正する
画像
初期化、linux-2.6.32.2/drivers/serial/samsung.cをオーペンし、次の赤いコードを追加する
画像
UART2修正完了


3.19.2 シリアルポートテスト

カーネルソースコードディレクトリに戻り、make zImageを実行し、再度に生成するカーネルは開発ボードにプログラミングし、root_qtopiaファイルシステムを使用し、グラフィカルインターフェースシリアルアシスタントテストプログラムがあるため、テストに便利になる
mini2440開発ボードはUART2をRS232ポートではなく、CON3ピンを通じて引き出され、RS232変換ケーブルが必要とする。下図を参照する
画像
mini2440開発ボードのCON3インタフェースに接続し、下図を参照する
画像
引き出したシリアルはケーブルを通じて、コンピュータのシリアルに接続し、開発ボードの電源に接続し、S2をnand起動に切り替え、通電する。Qtopiaシステムに入り、シリアルアシスタントをクリック、対応のプログラムインターフェースをオープンする、下図を参照する
画像
プログラムウィンドウのデフォルト設定は゛ttySAC1 115200 8N1 [C]゛で、
- シリアルデバイス:/dev/ttySAC1、シリアルUART1に対応する
-ボーレート:115200
-データビット:8
- フロー制御:なし
-ストップビット:1
- [C]:文字モードを表示し、[H]は6進数モードを表示する
上図には2つのエディットボックスがあり、上記のエディットボックスは受信したデータを表示するに使用され、実際にはコンパイル不可で、下記のエディットボックスはUSBボタンボードやQtopiaのソフトキ―ボードを通じて取得入力する
UART2をテストするには、゛Setting゛をクリックし、設定ウィンドウで/dev/ttySAC2を選択し、メインインターフェイスに戻る、開発ボードシリアル/dev/ttySAC2をオープンし、Connectをクリック、エディット下のウィンドウに文字を入力し、Sendボタンで接続するシリアルデバイスへデータを送信できる、Windowsハイパーターミナルを通じて、受信したデータの表示である(注:ターミナルに対応するシリアルは115200 8N1を設定必要)

画像



3.20 I2C-EEPROMドライバの移植

3.20.1 カーネルにI2Cドライバを設定

Linux-2.6.32.2 はS2C2440のI2Cインタフェースにパーフェクトなドライバをサポートしている、カーネルに設定するだけで使用できる
注: Linux-2.6.32.2カーネル内のデフォルト mini2440_defconfigは既にI2Cドライバを設定済み。カーネルソースコードディレクトリにmake menuconfigを実行し、カーネルの設定メインメニューに入り、順に選択し、次のサブメニューに入る
画像
゛<*> S3C2410 I2C Driver゛を選択、ここのS3C2410はS3C2440にも適用し、I2Cポートはレジスタ定義と同じ
画像
設定対応のドライバソースコードは:linux-2.6.32.2/drivers/i2c/busses/i2c-s3c2410.cにある。


3.20.2  I2C-EEPROMをテスト

テストプログラム名前:i2c
テストプログラムソースコードファイル名前:Eeprom.c 24cXX.c
テストプログラムソースコード位置:linux\examples.tgzを解凍
クロスコンパイラ: Arm-linux-gcc-4.3.2 with EABI
開発ボードの対応のデバイス名前:/dev/i2c/0
対応のカーネルドライバソースコード: Linux-src/drivers/i2c/busses/i2c-s3c2440.c
その他

Mini2440はI2Cバスに基づいてEEPROMチップをマウントする、これはAT24C08で、このチップを書きこみ、読み取ることを通じて、I2Cバスドライバをテストできる
カーネルルート•ディレクトリ下にmake zImageを実行し、生成されたカーネルは開発ボードにプログラミングし、root_qtopoiaを使用する。この中にはI2C-EEPROMテストプログラムを含む、コマンドラインとグラフィカル•インターフェースがあり、コマンドラインテストプログラムの名前は゛i2c゛となる。
コマンドライン:i2c –wを入力すると、ボードの24C08デバイスデータ(0x00-0xffを書き込まれる
画像
コマンドライン:i2c –rを入力すると、ボードの24C08デバイスからの出力を読み出す
画像



3.21 ウォッチドッグドライバ移植

3.21.1 カーネルでウォッチドッグドライバ・コンフィグ

Linux-2.6.32.2カーネルはパーフェクトなS3C2440ウォッチドッグドライバがあり、設定するだけで使用できる。
注: Linux-2.6.32.2カーネルのデフォルトの mini2440_defconfigは既にウォッチドッグドライバを設定した、ここでそれをオープンし、確認できる
カーネルソースコードディレクトリにmake menuconfigを実行し、カーネルの設定メインメニューに入り、順に選択し、次のサブメニューに入る
画像
ウォッチドッグ設定メニューをオープン、S2C2410/2440のウォッチドッグ設定オプションを選択する
画像
対応のドライバソースコードは:linux-2.6.32.2/drivers/watchdog/s3c2410_wdt.cにある



3.21.2 ウォッチドッグのON/OFFについて
ウォッチドッグドライバプログラムで赤い部分
画像
画像

ウォッチドッグデバイス(/dev/watchdogをオープンし、ウォッチドッグデバイスに任意なデータを繰り返し書き込み、カウントをクリアし、即ちウォッチドッグにフィードできる。゛V゛を書き込む時、ウォッチドッグをオフする


3.21.3 ウォッチドッグをテスト
ウォッチドッグの動作は簡単でコードを書けずに直接テストできる。
echoコマンドを使用し、/dev/watchdogへ任意のデータを書き込み、ウォッチドッグを起動する、例えばecho 0 > /dev/watchdog、下図を参照する
画像

15秒待ち、システムは自動再起動し、この現象によりウォッチドッグが起動した事を明らかにした。
15秒うちにechoコマンドをループ使用し、ウォッチドッグへデータを書き込む、システムを再起動しない。
ウォッチドッグを停止する場合、゛V゛を入力するだけ、echoコマンドを使用し、/dev/watchdogへデータを書き込むと同時に、"Enter"も書き込まれる、だからこのように操作でき:echo –n V >/dev/watchdog
゛-n゛は"Enter"を削除と意味し、テストのため、まずecho 0 > /dev/watchdogを入力し、次にecho –n V > /dev/watchdogを入力し、システムは正常に動いている場合、ウォッチドッグはOFFと証明する


3.22 簡単LEDドライバ
3.22.1  LEDドライバ原理と書き込み
ドライバを書くには関連のハードウェアを理解する必要があり、例えば、使用されるレジスタ、物理アドレス、割り込みなど、mini2440原理図にはLEDのハードウェア接続は次の通り
画像
S3C2440のデータシートを調べて、対応のハードウェアリソースは下記の通り
画像
GPIOは汎用の入出力ポートの略称であり、S3C2440チップに、ポートは再利用し、GPIOはその1つの機能で、例えばここのGPB5ポートは普通のGPIOとして使用され、専用機能のnXBACKに使用される、ピンの機能を変更できるように、該当のポートレジスタを設定する必要がある。
四つLEDは GPBCONレジスタの四組2bitビットを使用し、対応ピンの用途を設定する。四組2bitビットの機能は同じで、00は入力、01は出力のことを現れ、10は特殊機能、11は保持 、詳細は下記の通り:
画像
mini2440開発ボードに、
LED1はGPB5を対応し、 GPB5は [11:10]ビットを使用する
LED2は GPB6を対応し、 GPB6は [12:13] ビットを使用する
LED3は GPB7を対応し、 GPB7は [14:15] ビットを使用する
LED4は GPB8を対応し、 GPB8は [16:17] ビットを使用する
ドライバプログラムにLEDは出力状態を設定される必要があり、即ち、GPBXは 01を設定される

GPBDATレジスタは四つLEDの数値状態を対応するに使用され、GPBDAT5は GPB5を対応し、 GPBDAT6はGPB6を対応する…回路図によると、GPIO出力はローレベルの時、有効、即ち、レジスタは0の位置になる時、GPB5、6、7、8はローレベルを出力し、対応のLEDは点灯する

ソフトウェアに使用されるIOポートを操作するには一般に既存の関数やマクロを呼び出す、例えばs3c2410_gpio_cfgpin、どうして S3C2410であるか、サムスンの生産するS3C2440チップが使用するレジスタ名前とリソースの割り当てはS3C2410と殆ど同じですから、現在の各バージョンのLinuxシステムに大体同じ関数定義とマクロ定義を使用する
linux-2.6.32.2/arch/arm/plat-s3c24x/gpio.cファイルに該当関数の定義と実現を見つけ関連定義できる。当関数の名前は一般変更しないので、他のドライバソースコードに該当関数を含めるヘッダーファイルで見つける。gpio.c ファイルにs3c2410_gpio_cfgpin関数の実現は下記の通り

画像
画像
画像
次のドライバプログラムリストにs3c2410_gpio_cfgpinの呼び出し情況を確認できる。他のデバイスドライバに関連する基本関数の呼び出し、例えば登録デバイスmisc_register、ドライバ関数を書く構造file_operationsと Hello、Module(ユーザーマニュアルの例を参照する)のようなmodule_initとmodule_exit関数など。
drivers/charディレクトリ下にドライバプログラムファイルを作成し、内容は下記の通り
画像
画像
画像
画像
説明:その他デバイス(misc device)
他デバイスは組み込みシステムの汎用バイスドライバであり、Linuxカーネルのinclude/linuxディレクトリ下に Miscdevice.hファイルがあり、自分定義のmisc deviceサブデバイスはここで定義される。
次に、LEDデバイスのカーネル設定オプションを追加する、drivers/char/Kconfig をオープンし、以下の赤い部分を追加する:
画像
画像
次に、ドライバの設定定義に基づき、対応するドライブのターゲット•ファイルをカーネルに追加する。linux-2.6.32.2/drivers/char/Makefileファイルをオープンし、次のように赤い部分を追加する:
画像
こうして、カーネルにLEDドライバを追加した。


3.22.2 新カーネルコンパイルとLEDテスト
上記の手順で、カーネルのソースコード・ディレクトリで下記のコマンドを実行する:make menuconfig カーネル再コンパイル、サブメニュに入る:
画像
LEDドライバの設定メニューに入る:
画像

゛<*> LED Support for Mini2440 GPIO LEDs (NEW)゛オプションを選択、上記のカーネル設定を保存し、終了する。
カーネルのソースコードのディレクトリで次のコードを実行:;make zImage、生成された新カーネルを開発ボードにプログラミングする。



3.22.3 LEDテスト

ドライバをテストするため、テストプログラムをコンパイルする必要がある、ドライバ内ioctl 関数を呼び出して、LEDを制御する、leds-test.c ファイルを生成し、コード:
画像
画像
付属DVDでテストプログラムのソースコードがあり、\linux\examples\ledsディレクトリにある、ファイル名は led.c。
コマンドライン:#arm-linux-gcc –o leds-test leds-test.c
実行可能なオブジェクト•ファイルleds-testを生成され、ネット ftpまたはUSBメモリードライブで開発ボードにプログラミングし、/home/plg ディレクトリ(注:開発ボードのデフォルトファイルシステムには既にLEDテストプログラムがあるので、ファイル名を leds-testに変更する)、開発ボードでコマンドライン:#/etc/rc.d/init.d/leds stopを実行する。led-playerから ledの制御を停止する機能である、led-playerについてはユーザーマニュアルを参照する。leds-testでled の制御方法は:
#leds-test 3 0 ; LED3オフ
#leds-test 3 1 ; LED3オン
1つのパラメータは制御するLEDのシリアル番号、2番目のパラメータはオフ(0)またはオン(1)に対応するLEDを表示する。下図を参照する:

画像




----------続く
dwtechadm
 
記事: 60
登録日時: 月 2 25, 2013 1:35 pm

Return to ARM9ボード関連

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[0人]