SSブログ

Raspiのセットアップで嵌った [Raspberry Pi]

(2014.04.15)
SDカード、USB電源、microUSBケーブルetc.が揃ったので、二個目のRaspiのセットアップに取り掛かりました。前にやった(これです)筈なのですが、殆ど記憶に残っていません。orz

あらためて、先人の知恵におすがりして作業を進めることにしたのですが、最初で躓きました。Rasbianが立ち上がりません。ディスプレイは真っ暗なままで、Raspberry Pi基板上のSTAUS LEDが点いたり消えたりしています。orz

<STATUS LED>
ACT = SD card activity indicator <==緑?
PWR = 5V input power present <== 赤
FDX = Ethernet Full Duplex connection <==緑
LNK = Ethernet connection present <==緑
100 = 100 Mbps Ethernet connection <==黄色

================================
2014.04.16
詳しくは(こちら)をご覧下さい(ただし英文)
================================

『うむむっ、SDカードか?電源か?』
幸い、動作しているRaspiがあるので調査は簡単です。

SDカードを差し替えても、状況は変わりません。
USB電源を差し替えると・・・起動しました。Raspberry Pi基板そのものに問題は無さそうです。
パチパチパチ~

他の方(これです)が同じUSB電源を使用されているので、親族SNS管理人が使用したmicroUSBケーブルに問題があるようです。

駄目な組み合わせ
USB電源
microUSBケーブル

購入し直した(Raspberry Piで使えた)USB電源
これ

===========================================
2014.04,18
大丈夫な組み合わせ(後日確認した)
USB電源
microUSBケーブル
===========================================

USB電源を交換し、”これで先に進める”と思ったのですが・・・
ディスプレイは相変わらず真っ暗なままです。orz

う~ん、SDカードにも問題があるのか?
よく見ると、基板上のLNK STATUS(緑のLED)がちかちかしていて、Raspbianは起動しているようです。

そこで、Nmap(これ)を使って、Ping scanを掛けてみました。

2014_0415_1.pngNmapでping scanした

二つ目のRaspbery PiのIPアドレスが判明し、Teratermを使って無事リモート・ログイン出来ました。(wheezy-raspbianはデフォールトでsshがenableになっている)
パチパチパチ~

どうやらデフォールトのディスプレイ設定(以前はVGAだった)が変わったようです。動いているRaspberry Piの設定に合わせて/boot/config.txtを修正しました。

pi@raspberrypi ~ $ diff /boot/config.txt /boot/config.txt.org
17,18c17,18
< framebuffer_width=1024
< framebuffer_height=768
---
> #framebuffer_width=1280
> #framebuffer_height=720
21c21
< hdmi_force_hotplug=1
---
> #hdmi_force_hotplug=1
24,25c24,25
< hdmi_group=2
< hdmi_mode=16
---
> #hdmi_group=1
> #hdmi_mode=1
29c29
< hdmi_drive=2
---
> #hdmi_drive=2
42,43d41
< gpu_mrm=64
<

rebootすると・・・
pi@raspberrypi ~ $ sudo reboot
2014_0415_2.pngやっと動いた
ようやく動きました。
やれやれ

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

二個目のRasPiを手に入れた [Raspberry Pi]

(2014.04.11)
開発用のRasPiとは別に実装用のRasPiを入手することにしました。

Googleの検索画面(これ)で、RSコンポーネンツのリンクをクリックするとこんな画面(これ)が表示されました。

2014_0411_1.pngType Bのリンク先

『”785-8654 は現在入手できません”ってどういうことだ?』
RSコンポーネンツのリストにType AはあるのですがType Bは見つかりません。(Amazonには在庫があった これ

『ふ~む。入手できない訳では無いようだけど、RSコンポーネンツで在庫切れってこと?』
『なんか変!』

RSコンポーネンツのRaspberry Pi関連のリストをあらためて見直すと・・・

見つけました!(これ

”シングルボードコンピュータ,ARM1176JZFS”という名称になっていました。
RS品番 756-8308
メーカー/ブランド名 Raspberry Pi
メーカー 型番 Raspberry Pi Type B
単価3300円(<==安い!)

RSコンポーネンツのSEO対策には不備があるようです。

昨日注文して、今朝届きました。
2014_0411_2.pngcamera module付き
Amazonに注文した、USB電源とSDカードが届くまでお預けです。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Raspberry PiとJavaFXは相性が良くない [Raspberry Pi]

(2014.04.10)
Raspberry PiはI2Cが使えるので、PICとの相性は抜群です。

PICの出力データをRaspberry Piのウィンドウに表示するJava(Swing)プログラムは、PICの開発を強力にアシストしてくれます。
2014_0410_1.pngFoot_Switchのデータを表示している

bcmlib_for_java(これです)を使って、JavaプログラムでI2C通信を行います。(<==ちょっと宣伝!)

以前JavaFXで作ったXYステージの操作プログラム(USBシリアルを介してWindowsと通信する)を改修して、新たにRaspberry Pi用のXYステージ操作プログラムを開発しようと計画しているのですが、どうもRaspberry PiとJavaFXの相性は良くないようです。

2013_0213_1.pngWindows上で動くJavaFXプログラム

ビデオ・バッファを直に書き換える(らしい)のも問題(リモート表示できない)なのですが、それに加えてタッチ・マウスの1ピクセル移動操作を受け付けてくれないことが判りました。

Java Swingで開発するか?
タッチ・マウスを改修して、何とかJavaFXでも使えるようにするか?

今後のことを考えるとJavaFXにする方が良いのかなぁ~
でも、リモート表示出来ないのは問題だなぁ~

う~ん、悩ましい!

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Raspberry piとPICがつながった [Raspberry Pi]

(2013.09.13)
あれこれ試行錯誤を重ね、ようやくRaspberry piとPICが繋がりました。

2013_0913.pngPICとRaspberry piを繋げた

Raspberry piとPIC(I2Cスレーブ)間を接続して、wiringPiのツールを使って接続確認を行いました。
$ sudo apt-get install libi2c-dev
$ gpio load i2c
$ i2cdetect
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: 30 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         

上手く動くか心配でしたが、呆気なく接続確認が済みました。しかし、順調に進んだのはここまででした。

JAVAからコマンドを送りLEDを点滅させることは出来ましたが、必ずしも想定した通りの動作になっていませんでした。そこで、JAVAのコマンド送信とRaspberry piのコマンド実行を同期させる機能(ope_sync)を組み込み、想定した通りの動作をきちんと行うようにしました。
$ ./run.sh
bcm_interface start
bcm2835_for_java start
Receive Hello child!      <== これがReplyの後に表示されていた
Reply Nice to meet you.   
(ここで5秒間LEDが点滅する)
ope_sync O.K.             <== 同期処理で点滅終了を待ち合わせる
Close bcm2835_for_java
Close bcm_interface

そして、いよいよI2C通信に取り掛かります。
I2C送信(Raspberry pi ==> PIC)を試すと、”I2C Send”の文字列がPICの受信バッフに蓄えられ、正常に動作したことが確認できました。しかし、I2C受信(Raspberry pi <== PIC)がなかなか上手く動きません。

PIC側のログを調べてみると、送信要求を正しく処理しているのですが、Raspberry piのFIFOから読み出したデータには変なコードが混じっています。PIC側はループ・バックテストに使用していたものだったので正しく動作していると考え(<==これが誤り)、bcm2835ライブラリの使い方(もしくはライブラリそのもの)に問題があると思い込んでしまいました。マニュアルを何度も見直し、ライブラリのコードも調べましたが、問題点は見つかりません。リターン・ステータスは”正常終了”なのに、クロックストレッチのタイムアウト時間を0x40から0x4000に変更してみたりもしました。(<==結果は何も変わらない)

思いつくことは全てやり尽くし、ギブアップ寸前まで追い込まれたところで、念のためにPICがSSPBUFに書き込んだデータのログを取ってみると・・・

『あれ~?』
『FIFOから読み出した通りのデータを書いてる!』
『・・・・・あっ!』

テストに使ったPICのI2C通信はデリミタや送信バイト数などを伴う書式化されたデータを送受する仕様であったことを思い出しました。その書式に基づくデータを送信していたのです。受信データもその書式に従わなければならないのですが、受信バッファを直に覗いたのでフォーマット・エラーを起こしたことことに気づきませんでした。

PICのプログラムを書き換えて、ようやくI2Cの送受ができるようになりました。
$ ./run.sh
bcm_interface start
bcm2835_for_java start
Receive Hello child!
Reply Nice to meet you.
ope_sync O.K.
bi_bcm2835_i2c_write = 0
bi_rec_buff:0x09 0x53 0x45 0x4e 0x44 0x20 0x44 0x41 0x54 0x41
I2C receive=SEND DATA
Close bcm2835_for_java
Close bcm_interface

初めてやるときゃ、こんなもの(見当違いの所を深掘り)です。

やれやれ

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(4)  トラックバック(0) 
共通テーマ:日記・雑感

嬉しいことと悲しいことが同時にやってきた [Raspberry Pi]

(2013.09.10)
思うところがあって、以前動かなかったjavaFXのアプリの起動をもう一度試してみました。

Cygwinから起動したXウィンドウのコンソールでコマンドを入力します。

$ java -cp StopWatch.jar Stopwatch.MainScreen
failed to add service - already in use?

前に出たのとは(前は”Stopwatch.MainScreenが見つからない”だった)違うエラー・メッセージが表示され、ここに示された処置を施すと、エラーは無くなりました。
Type sudo bash
Type raspi-config
Scroll down to memory_split
Delete the numbers in there and replace with the number 64
Press Enter
Scroll down to Finish
Reboot

しかし、StopWatchのウィンドウはやはり表示されません。
そこで、Raspberry piのHDMIコネクタにディスプレイを接続し、再起動して同じことを試してみると・・・

ビンゴ~(<==実は悲しい)
Raspberry piに接続したディスプレイにStopWatchの画面がfull screen表示されました。

つい先日、OpenJFX on the Raspberry Piのページ(これです)にこんな記述を見つけたのです。
----------------------------------
Note that the default configuration of JavaFX on the Raspberry Pi does not use X11. Instead JavaFX works directly with the display framebuffer and input devices. So you should not have the X11 desktop running when starting JavaFX.
----------------------------------

その説明通り、リモートから起動したJavaFXアプリが直接framebufferを操作して、ローカルで立ち上げたXウィンドウを上書きしました。また、リモート側には何も表示しません。

う~ん。
RaspbianでX11が(ちゃんと)動くのに、何故JavaFXはそれに背を向けるのでしょうか?

”Raspberry piでJavaFXアプリをリモート表示する”という構想が大きく揺らいでしまいました。
”the default configuration of JavaFX on the Raspberry Pi”という一文に望みを託すほかありません。
(正式リリースまでに、configurationを変更すればX11が使えるようになって欲しいな~)

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

bcm2835ライブラリの返値が受け取れるようになった [Raspberry Pi]

(2013.09.06)
usleep(0)を使ったプロセス切替に不安を抱えたまま、返値を送受する機能を組み込みました。

JAVAプロセスからBCMプロセスへは”返値のあるbcmライブラリ関数を呼び出したとき”と”fifoが一杯になったとき”に切替え、BCMプロセスからJAVAプロセスへは”fifoが空になったとき”に切替ることにしました。

ゴタゴタしましたが、ようやくbcmライブラリプロセスを起動する”Helloコマンド”を送り、その応答文字列を受け取ることが出来ました。

$ ./run.sh
Open bcm2835_for_java
Receive Hello child! <== BCMプロセスがHelloコマンドで受け取ったメッセージ
Reply Nice to meet you!  <== JAVAプロセスがHelloコマンドの返値として受け取ったメッセージ
Close bcm_interface
$

”二方向でFIFOの送受を行っているだけ”のようにも見えますが、一連のコマンド・シーケンスに沿って処理し、結果を正しく受け取ることが出来ました。
(パチパチパチ~)

多分、bcmライブラリ関数も同じように動く筈なので、次はいよいよPICとRaspberry piのI2C接続に挑戦します。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

プロセス間の切替動作を調べてみた [Raspberry Pi]

(2013.09.05)
JAVAからBCM2835ライブラリを呼び出すプログラムで、プロセス間の切替が思うようにいかない件について調べてみました。

<テスト・プログラム>
char test_buff[64];
char n_buff[] = "0123456789";

void test_func(int loop, char c)
{
    test_buff[0]= c;
    test_buff[1]= n_buff[loop];
    test_buff[2]=' ';
    test_buff[3]='\0';
    put_ring_buff(w_buff,test_buff,strlen(test_buff));
    usleep(0);
}

void do_child( char *args )
{
    test_buff[0]= 'C';
    test_buff[1]=' ';
    test_buff[2]='\0';
    put_ring_buff(w_buff,test_buff,strlen(test_buff));

//    usleep(0);  <== これと
    for(loop=0;loop<5;loop++)
    {
        test_func(loop,'C');
    }
}

void do_parent( char *args )
{
    child = fork();
    if( child < 0 )
    {
       printf("we can't create child\n");
    }
    else if( child == 0 )
    {
        do_child(args);
        exit(0);
    }

    test_buff[0]= 'P';
    test_buff[1]=' ';
    test_buff[2]='\0';
    put_ring_buff(w_buff,test_buff,strlen(test_buff));

    usleep(0);    <== これを変えてみた
    for(loop=0;loop<5;loop++)
    {
        test_func(loop,'P');
    }
    sleep(1);
    w_buff->buff[w_buff->wp] = '\0';
    printf("result\n%s\n",w_buff->buff);
}

上に示したテスト・プログラムでusleep(0)を入れた場合と、コメント・アウトした場合で結果は次のようになりました。

P: usleep (Parent側だけusleepが入る場合)
result
P C C0 P0 C1 P1 C2 P2 C3 P3 C4 P4

P&C: usleep (どちらにもusleepが入る場合)
result
P C P0 C0 P1 C1 P2 C2 P3 C3 P4 C4

P&C: not usleep (どちらにもusleepが入らない場合)
result
P P0 C C0 P1 P2 C1 P3 C2 P4 C3 C4

ここまでの結果は、usleep(0)によって実行プロセスが切り替わったことを示しています。ところが・・・

C: usleep (Child側だけusleepが入る場合)
result
P P0 P1 P2 C P3 P4 C0 C1 C2 C3 C4  <== ???

これはいったいどういうことでしょうか?
P0->P1間あるいはP1->P2間に呼び出したusleep(0)では何も起きず、P2->P3間に呼び出したusleep(0)で漸くChildプロセスに切り替わっています。
”P P0 C P1 C0 P2 C1 P3 C2 P4 C3 C4”にならないのは何故でしょうか?

謎です。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

JAVAでbcm2835ライブラリを動かしてみた(その3 再挑戦) [Raspberry Pi]

(2013.09.04)
JAVAからBCM2835ライブラリを呼び出すプログラムが動き始めました。

<JAVAプログラムはこんな感じ>
    static final byte PIN = bcm2835.RPI_GPIO_P1_11;
    public static void main(String[] args) {
        System.setProperty("jna.library.path", "/opt/samba/netbeans_project/bcm_interface/lib");
        BCMInterface.INSTANCE.bi_init(args[0]);
        BCMInterface.INSTANCE.bi_bcm2835_init();
        BCMInterface.INSTANCE.bi_bcm2835_gpio_fsel(PIN, bcm2835.BCM2835_GPIO_FSEL_OUTP);
        for(int i=0; i<10; i++ )
        {
            System.out.print("loop="+i+"\n");
            BCMInterface.INSTANCE.bi_bcm2835_gpio_write(PIN, bcm2835.HIGH);
            BCMInterface.INSTANCE.bi_bcm2835_delay(500);
            BCMInterface.INSTANCE.bi_bcm2835_gpio_write(PIN, bcm2835.LOW);
            BCMInterface.INSTANCE.bi_bcm2835_delay(500);
        }
        BCMInterface.INSTANCE.bi_bcm2835_close();
        BCMInterface.INSTANCE.bi_close();
    }


JAVAからラッパー関数(例えばbi_bcm2835_gpio_writeとか)を呼び出すと、関数コードと引数がFIFOに書き込まれ、子プロセスがそれを読み取ってBCM2835ライブラリ関数を呼び出すという仕組みです。

JAVAプログラムと子プロセス間のコンテクスト切替に問題(切替を早くすると動作が乱れる)を抱えていますが、LEDチカチカ程度であれば動きました。

次の課題は、返値の受け取りです。

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

JAVAでbcm2835ライブラリを動かしてみた(その2 仕切り直し) [Raspberry Pi]

(2013.08.30)
/dev/memのmmap処理を欠いたまま、bcm2835のシェアド・ライブラリをJAVAから呼び出す試みは失敗に終わりました。しかし、立ち直りの早いところが親族SNS管理人の強みです。
¥(^_^) <==懲りない奴

未だ、Raspberry piのGPIO制御を実際に試していなかったので、bcm2835ライブラリにblink.cを組み込んで、動かしてみました。

$ sudo bcm2835_blink
2013_0829_1.pngLEDが点滅している

これをユーザー・モードで起動できるように修正します。

$ sudo chown root:root bcm2835_blink
$ sudo chmod 4755 bcm2835_blink
$ ls -al bcm2835_blink
-rwsr-xr-x 1 root root 16275 8月 29 15:12 bcm2835_blink
$ bcm2835_blink

動きました。
(パチパチパチ~)

bcm2835_blinkを子プロセスから起動し、終了させるプログラム(<==bcm_interface.c)を書きました。
    child = fork();
    if( child == 0 )
    {
       argv[0]="bcm2835_blink";
       execve(argv[0], argv, environ);
       exit(0);
    }

    sleep(3);
    printf("%s\nO.K. setup complete\n",argv[0]);
    kill(child,SIGINT);
    exit(0);

さらに、共有メモリを設けて、その上で二つのリング・バッファを動かして、bcm2835_blinkとbcm_interface間で通信できるようにしました。

$ dd if=/dev/zero of=/tmp/shm bs=4096 count=1
$ bcm_interface /tmp/shm
struct ring_buff *r_buff,*w_buff;

      fd = open( argv[1], O_RDWR);
      s = mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

---------------------------------
親プロセス(bcm_interface)
      r_buff=(struct ring_buff *)s;
      w_buff=(struct ring_buff *)(s+sizeof(struct ring_buff));
---------------------------------
子プロセス(bcm2835_blink)
      w_buff=(struct ring_buff *)s;
      r_buff=(struct ring_buff *)(s+sizeof(struct ring_buff));
---------------------------------
 r_buff->rp =0;
 w_buff->wp =0;


これで以下のことが出来るようになりました。
(1)ユーザ・モードで起動したプログラムからbcm2835ライブラリ関数を呼び出して、GPIOを制御する。
(2)そのプログラムを子プロセスとして起動する。
(3)共有メモリを設定して、二つのプロセス間で通信する。

”JAVAからbcm2835ライブラリを呼び出す”ための道具立ては揃ったように思うのですが・・・
どうでしょう?

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(1)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

JAVAでbcm2835ライブラリを動かしてみた(その1 失敗) [Raspberry Pi]

(2013.08.27)
Cで書かれたbcm2835ライブラリをJAVAから呼び出す方法を調べ、JNIより手軽に使えるJNA(これ)を見つけました。

早速、サンプル・プログラムをWindowsとRaspberry piで動かしてみました。
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
 
public class Jna_Bcm {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary(Platform.isWindows() ? "msvcrt" : "c", CLibrary.class);
        void printf(String format, Object... args);
    }
 
    public static void main(String[] args) {
        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }
    }
}

$ java  -jar dist/jna_bcm_1.jar 1 2 3
Hello, World
Argument 0: 1
Argument 1: 2
Argument 2: 3

これにbcm2835ライブラリを追加して、JavaからRaspberry piのGPIOを操作しようという目論みです。(結論として、失敗でした)

先ずC/C++のリモート開発環境を使って、bcm2835ライブラリのシェアド・ライブラリ(libbcmlib.so)を用意しました。そして、サンプル・プログラムにbcm2835ライブラリを呼び出すコードを追加して、ビルド、実行しました。

    public interface BCMLibrary extends Library {
        BCMLibrary INSTANCE = (BCMLibrary) Native.loadLibrary("bcmlib", BCMLibrary.class);
        boolean bcm2835_init();
        void bcm2835_gpio_fsel( final char pin, final char mode);
        void bcm2835_gpio_set(final char pin);
        void bcm2835_gpio_clr(final char pin);
    }
    public static void main(String[] args) {

        CLibrary.INSTANCE.printf("Hello, World\n");
        for (int i = 0; i < args.length; i++) {
            CLibrary.INSTANCE.printf("Argument %d: %s\n", i, args[i]);
        }

        System.setProperty("jna.library.path", "/opt/samba/netbeans_project/jna_bcm_1/lib");
        if (BCMLibrary.INSTANCE.bcm2835_init())
        {
          BCMLibrary.INSTANCE.bcm2835_gpio_fsel( PIN, bcm2835.HIGH);
          BCMLibrary.INSTANCE.bcm2835_gpio_set(PIN);
        }
    }

$ java  -jar dist/jna_bcm_1.jar 1 2 3
Hello, World
Argument 0: 1
Argument 1: 2
Argument 2: 3
bcm2835_init: Unable to open /dev/mem: 許可がありません

bcm2835_init()の中でデバイス・ファイル(<==owner root)をオープンしようとして、エラーになりました。orz

bcm2835_init()の処理を調べてみると、/dev/memを読んで制御レジスタのベース・アドレスを設定しています。また、debugモードでは/dev/memを読み込まずに固定値を設定しています。

『しめた!これで行ける。』
        BCMLibrary.INSTANCE.bcm2835_set_debug(bcm2835.HIGH);
        if (BCMLibrary.INSTANCE.bcm2835_init())
        { 以下略

デバッグ・モード設定を追加して動かすと・・・
$ java -jar dist/jna_bcm_1.jar 1 2 3
Hello, World
Argument 0: 1
Argument 1: 2
Argument 2: 3
bcm2835_peri_read paddr 20200004
bcm2835_peri_write paddr 20200004, value 00200000
bcm2835_peri_write paddr 2020001C, value 00020000

bcm2835ライブラリが呼び出されました。ただし、このままでは動作表示するだけで、制御レジスタへのアクセスは行われません。

『ならば、これでどうだ!』
        BCMLibrary.INSTANCE.bcm2835_set_debug(bcm2835.HIGH);
        if (BCMLibrary.INSTANCE.bcm2835_init())
        {
          BCMLibrary.INSTANCE.bcm2835_set_debug(bcm2835.LOW);
          BCMLibrary.INSTANCE.bcm2835_gpio_fsel( PIN, bcm2835.HIGH);
          BCMLibrary.INSTANCE.bcm2835_gpio_set(PIN);
        }

bcm2835_iinit()呼び出しの前後でdebugモードをON/OFFしたところ・・・
$ java  -jar dist/jna_bcm_1.jar 1 2 3
Hello, World
Argument 0: 1
Argument 1: 2
Argument 2: 3
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0xab85d988, pid=7130, tid=3057144944
#
以下省略

”fatal error”になりました。orz

考えてみれば当然です。bcm2835ライブラリの不正なメモリ・アクセス(gpio制御)が許されるをJREが許す訳がありません。基本的な構想に誤りがあります。
------------------
(2013.08.28)
Cで書かれたライブラリのメモリ・アクセスをJVMが監視している訳では無いので記述を訂正しました。
------------------

一旦、退却です。
------------------
(2013.08.29)
mmapとmunmapの意味が少し判ってきました。ユーザ・プロセスのメモリ空間に制御レジスタをマッピングする仕組みだったのですね。
------------------

にほんブログ村 IT技術ブログへ
にほんブログ村 ネットブログ コミュニティサイトへ
にほんブログ村 IT技術ブログ オープンソースへ


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。