[Armadillo:05424] DMA転送を有効にした場合のシリアル通信プログラムについて

Myoukan Kiyohito email@hidden
2010年 7月 13日 (火) 09:38:10 JST


明官と申します。

C言語のプログラムはある程度かけますが、
Linux,Armadilloに関しては初心者です。

Armadillo420でDMA転送を有効にしてシリアル通信のテストを行ったところ
うまく動作しませんでした。
確認したところ、read関数でエラー(-1)が返ってくることがわかりました。

DMA転送を使用した場合は、単純にread関数で受信することはできないのでしょうか?
参考になる情報がありましたら、ご教授お願いいたします。

<テスト>
・接続は、PCとArmadillo420をシリアルクロスで接続。
・PCから送信した文字をArmadillo420で受信し表示するプログラムを使用。
・シリアルインターフェース2を使用。
・転送速度は38400bps。
・DMA転送の設定は、linux2.6.x/arch/arm/mach-mx25/serial.h の
 UART3_DMA_ENABLE=1
 とすることで、有効にしました。

<テストプログラム>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>

#define SERIAL_PORT "/dev/ttymxc2"
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;

int main()
{
    char buf[255];                    /* バッファ */
    int fd=0;                           /* ファイルディスクリプタ */
    struct termios oldtio, newtio;    /* シリアル通信設定 */
    int res;

    fd = open(SERIAL_PORT, O_RDWR | O_NOCTTY);   /* デバイスをオープンする */
    tcgetattr(fd,&oldtio); /* 現在のシリアルポートの設定を待避させる*/
    bzero(&newtio, sizeof(newtio)); /* 新しいポートの設定の構造体をクリアする */

    newtio = oldtio;                  /* ポートの設定をコピー */
    newtio.c_cflag = B38400 | CS8 | CLOCAL | CREAD;
    newtio.c_iflag = IGNPAR ;
    newtio.c_oflag = 0;
    newtio.c_lflag = ICANON;

    tcflush(fd, TCIFLUSH);
    tcsetattr(fd,TCSANOW,&newtio);

    while (STOP==FALSE) {     /* 終了条件が満たされるまでループ */
       if((res = read(fd,buf,255)) == -1){
           printf("read error\n");
           continue;
       }
       write(fd,buf,res);
       buf[res]=0;             /* printf で使うため,文字列の終端をセットする */
       printf(":%s:%d\n", buf, res);
       if (buf[0]=='z') STOP=TRUE;
    }
    /* ポートの設定をプログラム開始時のものに戻す */
    sleep(1);
    tcsetattr(fd,TCSANOW,&oldtio);
    close(fd);
    return 0;
}

以上、よろしくお願いいたします。




armadillo メーリングリストの案内