Sirius -旧ブログ、更新されません-

<< 前のページ | 次のページ >>

2011年1月17日(月) 21:57

KURO-RS 用 daemon その1

土曜日の夜に熱を出し寝込んでいました。



赤外線データの解析と平行して daemon プログラムを作成しています。まず、KURO-RS とやり取りする共通関数を製作しています。

次のような関数です。



・open_rs

KURO-RS デバイスを開きます。引数として、デバイスファイル、ブロックするかどうかが必要です。戻り値として KURO-RS 用構造体のポインタを返します。

・close_rs

KURO-RS デバイスを閉じます。引数として、KURO-RS 用構造体のポインタが必要です。

・send_command

KURO-RS へコマンドを送信します。引数として、KURO-RS 用構造体のポインタ、1文字のコマンドが必要です。

・send_data

リモコン信号を送信します。引数として、KURO-RS 用構造体のポインタ、送信ポート、送信データが必要です。

・recive_data

リモコン信号を受信します。引数として、KURO-RS 用構造体のポインタ、受信データ格納場所が必要です。

・send_irdata

リモコン信号を送信します。引数として、KURO-RS 用構造体のポインタ、送信ポート、送信データが必要です。

send_data との違いは、送信要求も含めてこの関数が行います。

・recive_irdata

リモコン信号を受信します。引数として、KURO-RS 用構造体のポインタ、受信データ格納場所が必要です。

recive_data との違いは、受信要求も含めてこの関数が行います。



上記関数は既に実装済みで、これらを使って送受信プログラムを作成してみました。

受信プログラム


----------------------ここから----------------------

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <string.h>

#include <malloc.h>



#include "kuro_rs.h"

#include "kuro_rs_common.h"



int main(int argc,char *argv[])

{

    unsigned char buf[255];

    char *data_file = NULL;

    char *device = "/dev/ttyUSB0";

    FILE *fp;

    RS *rp;



    if( argc >= 2 && argv[1] && *argv[1] )

        data_file = argv[1];



    if( !data_file ) {

        printf("%s data file\n", argv[0]);

        exit(1);

    }



    if( !(rp = open_rs(device, 1)) ) {

        printf("device open error(%s)\n", device);

        exit(1);

    }

    if( recive_irdata(rp, buf) ) {

        printf("recive error\n");

        exit(1);

    }

    close_rs(rp);



    if( !(fp = fopen(data_file, "wb")) ) {

        printf("file open err(%s)\n", data_file);

        exit(1);

    } else {

        fwrite(buf, sizeof(unsigned char), REC_DATA_SIZE, fp);

        fclose(fp);

    }

    printf("Rec File : %s\n", data_file);

    exit(0);

}

----------------------ここまで----------------------


KURO-RS を開き、データを受信。最後に閉じます。



送信プログラム


----------------------ここから----------------------

#include <stdio.h>

#include <stdlib.h>

#include <signal.h>

#include <string.h>

#include <malloc.h>



#include "kuro_rs.h"

#include "kuro_rs_common.h"



int main(int argc,char *argv[])

{

    unsigned char buf[255];

    char *port = "1";

    char *data_file = NULL;

    char *device = "/dev/ttyUSB0";

    FILE *fp;

    RS *rp;



    if( argc >= 2 && argv[1] && *argv[1] )

        data_file = argv[1];

    if( argc >= 3 && argv[1] && *argv[2] )

        port = argv[2];



   if( !data_file ) {

        printf("%s data file [port]\n", argv[0]);

        exit(1);

    }



    if( !(fp = fopen(data_file, "rb")) ) {

        printf("file open err(%s)\n", data_file);

        exit(1);

    } else {

        fread(buf, sizeof(unsigned char), REC_DATA_SIZE, fp);

        fclose(fp);

    }



    if( !port || (*port < '1' || *port > '4') )

        *port = '1';



    if( !(rp = open_rs(device, 1)) ) {

        printf("device open error(%s)\n", device);

        exit(1);

    }

    if( send_irdata(rp, *port, buf) ) {

        printf("can't send data\n");

        exit(1);

    }

    close_rs(rp);

    printf("Send File : %s\n", data_file);



    exit(0);

}

----------------------ここまで----------------------


送信データを読み込んで、KURO-RS を開き、送信します。最後に KURO-RS を閉じます。



保存したファイルを指定して動かしてみました。リモコンデータの送信が行われました。

大丈夫なようです。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2011年1月13日(木) 22:12

赤外線信号の解析その2

HDUSF のリモコン信号の形式が NEC フォーマットのようなので、デコードするプログラムを考えてみました。

NEC フォーマットの詳細は、ルネサスのホームページを参照してください。


------------------------ここから------------------------

#include <stdio.h>

#include <stdlib.h>



#define bits(x) ((x) < 0 ? 0 : (buf[(x)/8]>>((x)%8))&0x1)

#define is_one(on, off)  ((on) >= 3 && (off) >= 10)

#define is_zero(on, off) ((on) >= 3 && (off) <= 9)



int main(int argc, char *argv[])

{

    FILE *fp;

    unsigned char buf[255];

    int i, on, off, count, leader, tailer;

    unsigned long code;



    if( argc != 2 ) exit(1);



    if( !(fp = fopen(argv[1], "rb")) ) exit(1);



    fread(buf, sizeof(unsigned char), 240, fp);

    fclose(fp);



    printf("%-14s ", argv[1]);

    on = off = code = count = leader = tailer = 0;

    for( i = 0 ; i < 240*8; i++ ) {

        if( bits(i) && bits(i-1) ) on++;

        else if( !bits(i) && !bits(i-1) ) {

            off++;

            if( off > 90 ) {

                tailer = 1;

                break;

            }

        } else if( !bits(i) &&  bits(i-1) ) off = 1;

        else if(  bits(i) && !bits(i-1) ) {

            if( on > 20 && off > 10 )  leader = 1;

            else if( is_one(on, off) )  code = (code<<1) + 1,count++;

            else if( is_zero(on, off) ) code = (code<<1), count++;

            on = 1;

        }

    }

    printf("code = %-8lx(%d bit) %s-%s ", code, count,

                leader ? "true " : "false", tailer ? "true " : "false");

    if( count == 32 ) {

        if( ((code>>16) & 0xff) != (~(code>>24) & 0xff) )

            printf("Vender = 0x%04x ", (code>>16)&0xffff);

        else

            printf("Vender = 0x%02x ", (code>>24)&0xff);

        if( (code & 0xff) == (~(code>>8) & 0xff) )

            printf("Data = 0x%02x\n", (code>>8)&0xff);

        else

            printf("data error\n");

    } else

        printf("\n");

}

------------------------ここまで------------------------


コードが 32bit の場合、前半 16bit がカスタムコード、後半 16bit がデータコードになります。

カスタムコードは、16bit の場合と、8bit + 反転 8bit のケースと二つあります。カスタムコードがベンダーを表します。

データコードは、8bit + 反転 8bit となります。データのエラーチェックをすることが出来ます。



実行した結果は次のようになります。


HDUS_Power     code = 50ef817e(32 bit) true -true  Vender = 0x50ef Data = 0x81


同じボタンを何回か記録して試しましたが全て同じ結果となりました。これで押されたボタンを識別できそうです。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2011年1月12日(水) 22:11

赤外線信号の解析その1

KURO-RS で保存したリモコンのデータをビット列で表示したところ、先頭の 1 のビット列がリーダのようです。

リモコンの赤外線信号がどのようなフォーマットになっているか調べたところ、いくつかの種類があるようです。

その中で、HDUSF のリモコン信号は、NEC フォーマットといわれるもののようです。次のようなページが見つかりました。



赤外線リモコンの利用

赤外線リモコンの製作 送信側



その他のフォーマットとしては、NEC フォーマットに似た SONY フォーマットと、マンチェスター符号化を利用した PHILIPS フォーマットがあるようです。上の二つのサイトの説明は NEC フォーマットのようです。詳しい形式については参考サイトを見てください。



同じビットが何個連続するかを表示するプログラムをつくり、実行してみました。




----------------------ここから----------------------

#include <stdio.h>

#include <stdlib.h>



#define bits(x) ((x) < 0 ? 0 : (buf[(x)/8]>>((x)%8))&0x1)

#define max(x, y) (((x) > (y)) ? (x) : (y))



int main(int argc, char *argv[])

{

    FILE *fp;

    unsigned char buf[255];

    int i, max_on, max_off, on, off, count;



    if( argc != 2 ) exit(1);



    if( !(fp = fopen(argv[1], "rb")) ) exit(1);



    fread(buf, sizeof(unsigned char), 240, fp);



    max_on = max_off = on = off = count = 0;

    for( i = 0; i < 240*8; i++ ) {

        if( bits(i) ) {

            if( bits(i-1) ) on++;

            else {

                if( i ) {

                    count++;

                    printf("%-3d, " , off);

                    if( (count % 8) == 7 ) printf("\n");

                } else count--;

                max_off = max(max_off, off);

                on = 1;

            }

        } else {

            if( bits(i-1) ) {

                count++;

                printf("%-3d, ", on);

                if( (count % 8) == 7 ) printf("\n");

                max_on = max(max_on, on);

                off = 1;

            } else off++;

        }

    }

    if( bits(i-2) == bits(i-1) ) {

        if( bits(i-1) ) {

             printf("%-3d\n", on);

             max_on = max(max_on, on);

        } else {

             printf("%-3d\n", off);

            max_off = max(max_off, off);

        }

    }

    printf("max on bit %d, off bit %d\n", max_on, max_off);

}



----------------------ここまで----------------------




実行した結果

91 , 45 , 6 , 5 , 6 , 17 , 6 , 5 ,

6 , 17 , 5 , 6 , 6 , 5 , 6 , 6 ,

5 , 6 , 5 , 17 , 6 , 17 , 6 , 16 ,

6 , 6 , 5 , 17 , 6 , 17 , 5 , 17 ,

6 , 17 , 5 , 17 , 6 , 6 , 5 , 6 ,

6 , 5 , 6 , 5 , 6 , 6 , 5 , 6 ,

6 , 16 , 6 , 6 , 5 , 17 , 6 , 17 ,

5 , 17 , 6 , 17 , 6 , 16 , 6 , 17 ,

6 , 5 , 6 , 388, 90 , 23 , 6 , 719

max on bit 91, off bit 719



最初のビットの並びは、1 が 91 個、次が 0 が 45 個です。KURO-RS は 0.1ms 毎にサンプリングするので、HIGH が 9ms、LOW が 4.5ms のリーダ部とぴったりマッチします。



データは、



1 -- 0.56 ms の HIGH 1.69 ms の LOW

0 -- 0.56 ms の HIGH 0.56 ms の LOW



となるそうです。また、データの最後には 0.56ms の HIGH があります。つまり、リーダ部以外では 0.56ms 以上の HIGH はこないということです。カウントした結果では、1 の連続は、5 〜 6 個、0 の連続が 5 〜 6 または 16 〜 17 個なのでこれもぴったり合います。

上の実行結果を色分けしてみます。リーダ部を赤、データ部を青、データの最後を緑色で表示しています。

91 , 45 , 6 , 5 , 6 , 17 , 6 , 5 ,

6 , 17 , 5 , 6 , 6 , 5 , 6 , 6 ,

5 , 6 , 5 , 17 , 6 , 17 , 6 , 16 ,

6 , 6 , 5 , 17 , 6 , 17 , 5 , 17 ,

6 , 17 , 5 , 17 , 6 , 6 , 5 , 6 ,

6 , 5 , 6 , 5 , 6 , 6 , 5 , 6 ,

6 , 16 , 6 , 6 , 5 , 17 , 6 , 17 ,

5 , 17 , 6 , 17 , 6 , 16 , 6 , 17 ,

6 , 5 ,
6 , 388, 90 , 23 , 6 , 719



データ部の 1 の連続 + 0 の連続のペアは 32 個です。リモコンのデータも 32bit だそうなのでこれもぴったりと合います。

これをもとにして信号をデコードできそうです。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2011年1月11日(火) 20:50

KURO-RS 用 daemo プログラムの作成

玄箱で KURO-RS が使えることが分かったので、サービスとして動き、リモコンでコントロールできるようなソフトを探してみました。しかし、自分の利用に合うようなものが見つからなかったので自分で作ってみることにしました。



自分が欲しい機能は、



1、登録しているリモコンのボタンで玄箱をコントロールする。

2、登録しているリモコンのボタンで KURO-RS から他の機器へリモコンの信号が送れる。

    このときボタンひとつで複数の機器へそれぞれリモコン信号を送れるようにする。

3、daemon として動き、daemon が動いていても、外部コマンドからの要求でリモコン信号の送出や学習が出来る。

4、KURO-RS とやり取りする標準的な関数群を作成し、再利用できるようにする。



リモコン信号の保存と送信は付属のソースをコンパイルして出来ますが、同時使用は当然出来ないでしょう。

また送られてきたリモコン信号と登録されている信号の比較をどうするかも考えないといけません。



まず、リモコンの信号と KURO-RS(PC-OPRS1) について検索してみると次のようなページにたどり着きました。



[PC-OP-RS1]SONYフォーマットを合成する(Perlで)

赤外線リモコンを Linux からコントロール



なるほど、KURO-RS は送られてきた信号 240 バイト分をそのまま記録してそのまま送出しているだけのようです。

この信号をちゃんとデコードできればいいのか。



まず、自分なりに保存したリモコンの信号を解析してみることにしました。

保存したデータをビット列で表示するプログラムを作成しました。

-------------------ここから-------------------


#include <stdio.h>

#include <stdlib.h>



int main(int argc, char *argv[])

{

    FILE *fp;

    int i, j;

    int msb, byte;

    unsigned char buf[255], c;



    if( argc != 3 ) exit(1);



    msb = byte = 0;

    if( *(argv[2]) == '1' ) msb = 1;

    if( *(argv[2]+1) == '1' ) byte = 1;



    if( !(fp = fopen(argv[1], "rb")) ) exit(1);



    fread(buf, sizeof(unsigned char), 240, fp);



    for( i = 0; i < 240; i++ ) {

        if( byte ) {

            if( i % 2 ) c = buf[i-1];

            else        c = buf[i+1];

        } else c = buf[i];

        for( j = 0; j < 8; j++ ) {

            if( msb ) printf("%d", (c>>j) &0x1);

            else      printf("%d", (c>>(7-j)) &0x1);

        }

        if( (i % 8) == 7 ) printf("\n");

        else               printf(" ");

    }

    printf("\n");

}


-------------------ここまで-------------------

最初の引数がリモコン信号を保存したファイル名、次の引数の最初の文字が最上位ビットの位置、次の文字がバイトスワップするかどうかを指定します。



PC 用の USB 接続地デジチューナー HDUSF のリモコンが余っていたので、この電源ボタンの信号を保存し、ビット列で表示してみました。

$ dump Power 00

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 11111111 00000111 00000000 00000000 00000000 00000000

00000000 00111111 11111000 00000001 00000000 11111100 11100000 00000111

00000000 11110000 10000001 00011111 11111100 11000000 00000111 00111110

00000000 10000000 00011111 00000000 11000000 00001111 00000000 11110000

00000011 00011111 00000000 11000000 00001111 00000000 11100000 00000011

00000000 11111000 00000001 00000000 01111100 00000000 00000000 00111111

11110000 10000001 00011111 11111100 11100000 00000111 00111110 11110000

00000011 00000000 11111100 11000000 00000111 00000000 11110000 00000011

00000000 11111000 00000000 00000000 01111110 00000000 00000000 00111111

00000000 11000000 00001111 00000000 11100000 00000111 00111111 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111100

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 00001111 00000000 00000000 11111000 00000001 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000



$ dump Power 10

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 11111111 11100000 00000000 00000000 00000000 00000000

00000000 11111100 00011111 10000000 00000000 00111111 00000111 11100000

00000000 00001111 10000001 11111000 00111111 00000011 11100000 01111100

00000000 00000001 11111000 00000000 00000011 11110000 00000000 00001111

11000000 11111000 00000000 00000011 11110000 00000000 00000111 11000000

00000000 00011111 10000000 00000000 00111110 00000000 00000000 11111100

00001111 10000001 11111000 00111111 00000111 11100000 01111100 00001111

11000000 00000000 00111111 00000011 11100000 00000000 00001111 11000000

00000000 00011111 00000000 00000000 01111110 00000000 00000000 11111100

00000000 00000011 11110000 00000000 00000111 11100000 11111100 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00111111

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 11110000 00000000 00000000 00011111 10000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000



$ dump Power 01

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 00000111 11111111 00000000 00000000 00000000 00000000

00111111 00000000 00000001 11111000 11111100 00000000 00000111 11100000

11110000 00000000 00011111 10000001 11000000 11111100 00111110 00000111

10000000 00000000 00000000 00011111 00001111 11000000 11110000 00000000

00011111 00000011 11000000 00000000 00000000 00001111 00000011 11100000

11111000 00000000 00000000 00000001 00000000 01111100 00111111 00000000

10000001 11110000 11111100 00011111 00000111 11100000 11110000 00111110

00000000 00000011 11000000 11111100 00000000 00000111 00000011 11110000

11111000 00000000 00000000 00000000 00000000 01111110 00111111 00000000

11000000 00000000 00000000 00001111 00000111 11100000 00000000 00111111

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 11111100 00000000

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 00000000 00001111 11111000 00000000 00000000 00000001

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000



$ dump Power 11

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 11100000 11111111 00000000 00000000 00000000 00000000

11111100 00000000 10000000 00011111 00111111 00000000 11100000 00000111

00001111 00000000 11111000 10000001 00000011 00111111 01111100 11100000

00000001 00000000 00000000 11111000 11110000 00000011 00001111 00000000

11111000 11000000 00000011 00000000 00000000 11110000 11000000 00000111

00011111 00000000 00000000 10000000 00000000 00111110 11111100 00000000

10000001 00001111 00111111 11111000 11100000 00000111 00001111 01111100

00000000 11000000 00000011 00111111 00000000 11100000 11000000 00001111

00011111 00000000 00000000 00000000 00000000 01111110 11111100 00000000

00000011 00000000 00000000 11110000 11100000 00000111 00000000 11111100

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00111111 00000000

11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111111

11111111 11111111 00000000 11110000 00011111 00000000 00000000 10000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000



どうやら MSB でバイトスワップもしなくていいようです。そのままやればいいんですね。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2011年1月7日(金) 20:16

KURO-RS のアプリケーション

玄箱が KURO-RS を認識するようになったので、アプリケーションをインストールしていきます。

まずはじめに、 KURO-RS 付属のアプリケーションをコンパイルして動かしてみます。

付属 CD 内の Linux/Linux.tgz を作業ディレクトリで展開します。

$ tar xvzf Linux.tgz

既にドライバは動いているので、必要なものはアプリケーションのソースだけです。

展開された中の Linux/LinuxApp にあります。

$ cd Linux/LinuxApp

バイナリファイルはそのまま使えるようですが、退避してコンパイルします。



rs_rec.c と rs_send.c は、#include <strings.h> を #include <string.h> に替えておきます。

$ mv rec rec.org

$ gcc -O2 -o rec rs_rec.c

$ mv send send.org

$ gcc -O2 -o send rs_send.c

send については起動時に動かすとうまく動かない不具合があるので、昔作ったパッチを当てようと探しましたがありませんでした。が、今回は特に修正しなくても大丈夫なようです。



コンパイルしたものを /usr/local/bin へコピーします。

# install -s rec /usr/local/bin/kuro-rs-rec

# install -s send /usr/local/bin/kuro-rs-send

USB デバイス (/device/ttyUSB0) へアクセスできる様に dialout グループへユーザを追加しておくと便利でしょう。



リモコンの信号を記録します。

$ kuro-rs-rec test

test - /dev/ttyUSB0

rec code waiting.........

Create Rec File : [test]



リモコン信号を送信します

$ kuro-rs-send test

test - 1 - /dev/ttyUSB0

Send File : [test]



うまく行ったようです。これで動作の確認が出来ました。

そろそろ Apache と PHP をきちんと設定して Web 経由で KURO-RS をコントロールできるようにしたいですね。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2011年1月4日(火) 10:38

KURO-RS の利用

赤外線リモコン KURO-RS を使えるようにします。

KURO-RS を認識させるには、カーネルソース ftdi_sio.c の id_table_combined に次の一行を追加します。

    { USB_DEVICE(0x0411, 0x00b3) },



もともとのカーネルは、USB FTDI Single Port Serial Driver がはじめから組み込まれているのでこれをモジュールに変更して、カーネルとモジュールのコンパイルしなくてはなりません。

LinkStation/TeraStation/玄箱/PPC/kernel/2.6.30.5を参考にしてカーネルをコンパイルします。

今回はカーネルも入れ替えるので上のページの "MTD の認識" 項目は必要です。

# make meucofig

Device Drivers -> Memory Technology Device (MTD) support -> Mapping drivers for chip access の

    ・Physmap compat support を y に

    ・Physical start address of flash mapping を 0xffc00000 に

    ・Physical length of flash mapping を 0x400000 に

    ・Bank width in octets を 1 に設定します。

その他、必要なモジュールの設定をします。



カーネルとモジュールをコンパイルします。

# make uImage modules

だいたい一時間くらいで終わりました。



念のため現在のモジュールを上書きしないように移動させでからモジュールのインストールをします。

# mv /lib/modules/2.6.31.12_kurobox /lib/modules/2.6.31.12_kurobox_old

# make modules_install



カーネルをインストールします。

# cp -p System.map /boot/System.map-2.6.31.12_kurobox_new

# cp -p arch/powerpc/boot/uImage /boot/vmlinux.UBoot-2.6.31.12_kurobox_new



次に起動するカーネルの入れ替えを行います。

# cd /boot

# rm System.map vmlinux.UBoot

# ln -s System.map-2.6.31.12_kurobox_new System.map

# ln -s vmlinux.UBoot-2.6.31.12_kurobox_new vmlinux.UBoot



電源を切って、電源を入れます。(再起動がうまく動かないので・・・)

# halt



電源 ON。シリアルコンソールを付けていない玄箱なので起動確認ができるまでちょっと不安です。

大丈夫でした。普通に起動しました。

# cat /proc/version

Linux version 2.6.31.12_kurobox (root@XXXXXX01) (gcc version 4.4.4 20100630 (Red Hat 4.4.4-10) (GCC) ) #1 Mon Jan 3 21:28:51 JST 2011

ちゃんと新しいカーネルで動いているようです。



KURO-RS をつなぎ、/proc/bus/usb/devices の中に、次のような内容があり、Driver に ftdi_sio があれば大丈夫です。



T:  Bus=01 Lev=02 Prnt=02 Port=01 Cnt=02 Dev#= 5 Spd=12 MxCh= 0

D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1

P:  Vendor=0411 ProdID=00b3 Rev= 4.00

S:  Manufacturer=BUFFALO

S:  Product=BUFFALO RemoteStation PC-OP-RS1

S:  SerialNumber=xxxxxxxx

C:* #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=500mA

I:* If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=ftdi_sio

E:  Ad=81(I) Atr=02(Bulk) MxPS= 64 Ivl=0ms

E:  Ad=02(O) Atr=02(Bulk) MxPS= 64 Ivl=0ms



後はアプリケーションを使って動作を確認します。

カーネルの入れ替えがうまく行ったようなのでカーネルのバージョンを上げることが出来そうです。そのうちやってみたいと思います。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

2007年6月4日(月) 00:08

WindowsでKURO-RS のコンパイル

KURO-RS はサポート外になるが、Buffalo の PC-OP-RS1 のドライバを入れることで Windows 上でも使えるようです。(ってハードは同じものなんでしょう?)サンプルのソースコードも付属しているので、まずこれをコンパイルしてみたいと思います。

コンパイルには MinGW5.0.0 以降と MSYS-1.0.11.2004.04.30-1 以降が必要ということなので早速インストールしてみました。

MinGW ってはじめて知りました。まず、インストーラをダウンロードして実行します。インストールしてみたところ、Windows 用の GCC のようです。インストーラがインターネットから必要なものをダウンロードしてくれます。パッケージは Current を選び、"MinGW base tools" と "g++ compiler" をインストールします。

次に MSYS をインストールします。Cygwin の最小構成のような感じです。シェルやツール類が入ります。ここでいくつかの質問に答えるだけで MinGW の設定もやってくれるようです。

早速、MSYS を動かしてコンパイルしてみました。

$ make clean
$ make

なんともあっさりコンパイルができ、irremote.exe が出来上がりました。まだ PC-OP-RS1 のドライバを入れていないので動作確認は出来ていません。

written by sirius [KURO-RS] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

<< 前のページ | 次のページ >>

Sirius -旧ブログ、更新されません-

MySketch 2.7.2 written by 夕雨