ページ 11

デジタルI/Oの使い方について

Posted: 2014年10月27日(月) 20:52
by あすぱら
あすぱらと申します。
現在「ARBOR製 EmCORE-i2501」のデジタルI/Oを使用しいと考えております。
具体的には、Inputに信号が入ってきたら文字を表示させたいと思っています。

マニュアルをダウンロードしC言語でのサンプルコードを見てみましたが、何をしているのか今一ピント来ません。
丸々コピペしたところエラーが出てしまいました。以下に環境とコードの一部、エラー内容を記載します。、コンパイルしたところ以下のようなエラーが出てしまいました。

環境
Ubuntu12.04 GCCコンパイラ

コード:

#include “math.h”
#include “stdio.h”
#include “dos.h”

#define SIO_ID 0x1010
#define SIO_INDEX 0x4E
#define SIO_DATA 0x4F
#define SIO_EN 0x87
#define SIO_DN 0xAA
#define LDN_ADDR 0x07
bool __fastcall TForm1::Check_ID(void)
{
DWORD iData;
SetPortVal(SIO_INDEX,SIO_EN,1); // SIO - Enable
SetPortVal(SIO_INDEX,SIO_EN,1);
SetPortVal(SIO_INDEX,SIO_EN,1);
SetPortVal(SIO_INDEX,0x01,1);
SetPortVal(SIO_INDEX,0x55,1);
SetPortVal(SIO_INDEX,0x55,1);
SetPortVal(SIO_INDEX,LDN_ADDR,1); // LDN - Configure Control
SetPortVal(SIO_DATA,0x04,1);
SetPortVal(SIO_INDEX,0x20,1); // ID Address
GetPortVal(SIO_DATA,&iData,1);
iID = iData;
SetPortVal(SIO_INDEX,0x21,1);
GetPortVal(SIO_DATA,&iData,1);
iID = ( iID << 8 ) + iData;
Label18->Caption = “ID : “ + IntToHex((int)iID,3);
SetPortVal(SIO_INDEX,SIO_DN,1); // SIO - Disable
if( iID == SIO_ID ) return true;
return false;
}
//---------------------------------------------------------------------------
unsigned char __fastcall TForm1::GPIO_Set(unsigned oMode,unsigned char oData)
{
DWORD iData;
// SIO - Enable
SetPortVal(SIO_INDEX,SIO_EN,1);
SetPortVal(SIO_INDEX,SIO_EN,1);
// LDN - GPIO
SetPortVal(SIO_INDEX,LDN_ADDR,1);
SetPortVal(SIO_DATA,0x06,1);
// GPIO5 - Mode
SetPortVal(SIO_INDEX,0xA0,1);
SetPortVal(SIO_DATA,oMode,1);
// GPIO5 - Data
SetPortVal(SIO_INDEX,0xA1,1);
SetPortVal(SIO_DATA,oData,1);
// GPIO5 - Status
SetPortVal(SIO_INDEX,0xA2,1);
GetPortVal(SIO_DATA,&iData,1);
// SIO - Disable
SetPortVal(SIO_INDEX,SIO_DN,1);
return iData;
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::DIO_Test(int iPIN)
{
int i = iPIN;
bool bTest = true;
unsigned char InData;
unsigned char oMode[8] = {0x0F,0x0F,0x0F,0x0F,0xF0,0xF0,0xF0,0xF0};
unsigned char oDataL[8] = {0xF7,0xFD,0xFE,0xFB,0xEF,0xDF,0xBF,0x7F};
unsigned char oDataH[8] = {0xF8,0xF2,0xF1,0xF4,0x1F,0x2F,0x4F,0x8F};
unsigned char iData[8] = {0x10,0x20,0x40,0x80,0x08,0x02,0x01,0x04};
InData = GPIO_Set(oMode[i],oDataL[i]) & iData[i]; // Low Test
if( !(InData == 0x00) ) bTest = false;
InData = GPIO_Set(oMode[i],oDataH[i]) & iData[i]; // Hi Test
if( !InData ) bTest = false;
return bTest;
}
//---------------------------------------------------------------------------
エラー文(一部記載)
エラー: ‘DWORD’ was not declared in this scope
エラー: expected ‘;’ before ‘iData’
エラー: ‘SetPortVal’ was not declared in this scope

変数が宣言されていないというエラーだと思うのですが、どのような形で宣言すればいいのかわかりません。
サポートに連絡したところ、技術的な問合せは受けられないという事で困っている状況です。
マニュアルを添付しておきます。何かアドバイス等あればよろしく御教示お願い致します。

Re: デジタルI/Oの使い方について

Posted: 2014年10月27日(月) 21:29
by softya(ソフト屋)
すぐに分かることはC言語ではなくC++の様です。C++の文法が使われています。
詳しくないですが開発環境がC++Builder 系の感じがします。
GPIO関係のヘッダとか無いのもありえないですね。
これだけの情報で使いこなすのは、ほぼ無理です。

Re: デジタルI/Oの使い方について

Posted: 2014年10月27日(月) 21:35
by h2so5
マニュアルを無断でアップロードしちゃダメですよ。ログインしないと見れないようですし。
All rights are reserved. No part of this manual may be reproduced by any
mechanical, electronic, or other means in any form without prior written
permission of the manufacturer.

Re: デジタルI/Oの使い方について

Posted: 2014年10月28日(火) 13:07
by あすぱら
>>softya

返信ありがとうございます。やはりこれだけの情報では難しいですか。

>>h2so5
申し訳ございません。すぐにマニュアルを削除します。

Re: デジタルI/Oの使い方について

Posted: 2014年10月28日(火) 13:36
by softya(ソフト屋)
情報が断片すぎるのとサンプルプロジェクトがない状況だとLinuxドライバが書けるぐらい実力があって時間が取れれば実物が目の前にありさえすれば何とかなるでしょうが、現状のサンプルでSetPortVal()やらGPIO_Set()とか何かライブラリを呼び出してますが、これ何?って状況だと思います。
LinuxやWindowsの標準的なAPIやライブラリにはありませんので、付属しているマニュアルやCD-ROMなどを確認して下さい。

ただ、C言語だと言いながらC++で書かれている時点でマニュアルの信憑性がありませんよね。サポートにも期待できないとすると現状難しいとしか言えません。
何とか出来る実力のある人が周りにいませんか?

Re: デジタルI/Oの使い方について

Posted: 2014年10月28日(火) 15:18
by h2so5
SetPortValはWinIoというライブラリの関数のようです。
http://www.internals.com/
http://matrix207.github.io/2012/09/16/winio-sample/

Re: デジタルI/Oの使い方について

Posted: 2014年10月28日(火) 15:24
by softya(ソフト屋)
h2so5 さんが書きました:SetPortValはWinIoというライブラリの関数のようです。
http://www.internals.com/
http://matrix207.github.io/2012/09/16/winio-sample/
それだとWindows用ですので、これを使えということは、そのボードコンピュータはOSとしてWindows Embedded推奨って事ですかね。

Re: デジタルI/Oの使い方について

Posted: 2014年10月28日(火) 16:28
by あすぱら
>>h2so5

返信ありがとうございます。使っているライブラリが分かっただけでもありがたいです。

>> softya(ソフト屋)

返信ありがとうございます。確かにubuntuでI/Oを動かすのは難しいのかも知れません。


今日1日私自身調べてみますので、何かあればよろしくお願い致します。

Re: デジタルI/Oの使い方について

Posted: 2014年10月29日(水) 13:43
by あすぱら
色々調べて見まして、仮想ファイルシステムを読み書きしてGPIOを制御するという方法を見つけました。
以下のサイトを参考にしています。

https://tool-lab.com/2013/12/raspi-gpio ... command-1/
このサイトではRaspberry Piを元に説明していました。

試しに私のボードの環境で「/sys/class/gpio」に移動してみると以下のファイルがありました。

-rwxrwxrwx 1 root root 4096 10月 29 11:42 export
-rwxrwxrwx 1 root root 4096 10月 29 08:36 unexport

これに対して仮想ファイルを作成をする為に、「sudo echo 9 > /sys/class/gpio/export」とコマンドを打ち込んだ所、無効な引数と表示されエラーとなりました。

上記を踏まえると、やはり専用のドライバー等が必要となるのでしょうか?
付属のCDを見たところ、Windows用のオーディオ、ビデオ、イーサのドライバしか見つかりませんでした。

Re: デジタルI/Oの使い方について

Posted: 2014年10月29日(水) 13:58
by softya(ソフト屋)
ラズベリーパイは専用のLinuxですので、仮想ファイルシステムとしてIOを実装しているんでしょう。

どうしても必要なら、こういう講座を受けられればよいのでは?
「組み込み Linux - デバイスドライバ開発講座 評価ボードへ組み込む実習」
http://www.lineo.co.jp/modules/products ... vice1.html

Re: デジタルI/Oの使い方について

Posted: 2014年10月29日(水) 20:58
by あすぱら
>>softya

アドバイスありがとうございます。やはりこのボードでGPIOを使うには、私の技術力がまだまだ足りそうにありません。

他の方法を探してみますので、この件に関しては解決済みとさせて頂きます。皆さんありがとうございました。