--- /dev/null
+/**
+ * \file ad7999.c
+ * \Author: suikan
+ * \brief AD799x I2C ADCからデータを読み込み、API経由でアプリケーションへ渡す
+ */
+
+
+#include <t_services.h>
+#include <i2c_subsystem.h>
+#include "kernel_id.h"
+#include "uzume.h"
+#include "ad7999.h"
+
+/**
+ * @brief ADC変換値保存用配列
+ * @details
+ * 変換値を保存する。アクセスは排他的でなければならない。値は符号付き左詰めである。
+ * 整数部はないので、1ビットの符号の右に小数部が連なる。
+ */
+static int values[4];
+
+
+/**
+ * \brief ADU999 制御タスク
+ * \param extinf タスク引数。ADC799xが持つ7bitのI2Cアドレスを指定する。
+ */
+void ad7999_task(VP_INT exinf)
+{
+ unsigned int adcaddress, ch;
+ unsigned char adcbuf[2];
+
+ /* タスク引数として渡される数字を、7bitのI2Cデバイスアドレスとみなす */
+ adcaddress = (unsigned int) exinf;
+
+ while(1)
+ {
+ i2c_master_read(0, adcaddress, adcbuf, 2);
+ syslog( LOG_NOTICE, "ADC is : %02x%02x ", adcbuf[0], adcbuf[1]);
+
+ /* 上位バイトのbit 5:4 をチャンネル番号として受け取る */
+ ch = ( adcbuf[0] & 0x30 ) >> 4;
+ /*上位バイトのbit 3;0と買いバイトから12bitのADCデータを作る。そのデータを32bitに左詰めする */
+
+ /* 排他区間開始 */
+ wai_sem(AD7999_SEM);
+ values[ch] = ( (( adcbuf[0] & 0x0F )<<8 ) | adcbuf[1] ) << 19;
+ sig_sem(AD7999_SEM);
+ /* 排他区間終了 */
+
+ tslp_tsk(1);
+ }
+}
+
+FX32 get_volume(unsigned int ch)
+{
+ FX32 retval;
+
+ /* 排他区間開始 */
+ wai_sem(AD7999_SEM);
+ retval = values[ch];
+ sig_sem(AD7999_SEM);
+ /* 排他区間終了 */
+
+ return retval;
+}
--- /dev/null
+
+/*
+* I2C ADCである、AD7999をボリューム・入力として使うUZUMEのサブシステム(オプション)
+* このコンフィギュレーション・ファイルはBSPのコンフィギュレーション・ファイルから
+* インクルードして使う。インクルードするときは、i2c0_m.cfgより後にインクルードする。
+*
+* 関連するソースは次の2つ
+* ad7999.h
+* ad7999.c
+*/
+
+#define _MACRO_ONLY
+
+INCLUDE("\"ad7999.h\"");
+
+/*
+* プライベートな資源
+*/
+
+ /* AD7999サブシステムの排他利用のためのセマフォ */
+CRE_SEM (AD7999_SEM,
+ {
+ TA_TPRI, /* タスク優先順位に基づいてセマフォを奪い合う。 */
+ 1, /* 初期状態で資源数は1。すなわち、最初に排他領域を獲得しようとしたタスクは、待ちなしに獲得できる。 */
+ 1 /* 最大返却資源数は1。これは PV セマフォによる排他処理を行う場合の普通の値。 */
+ }
+ );
+
+CRE_TSK( AD7999_TASK,
+ {
+ TA_HLNG|TA_ACT, /* 初期状態からアクティブ */
+ 0x28, /* タスク引数(AD7999のI2C デバイスアドレス) */
+ ad7999_task, /* タスク本体 */
+ AD7999_PRIORITY, /* タスク優先順位 */
+ 1024, /* タスク・スタックサイズ */
+ NULL /* タスク・スタック。NULLならシステムが準備 */
+ });
+
--- /dev/null
+/**
+ * \file ad7999.h
+ * \Author takemasa
+ * \brief AD7999制御プログラム
+ * \details
+ * AD7999制御タスク及びAPI。cfgファイルから読み込んで使う
+ */
+
+
+#ifndef AD7999_H_
+#define AD7999_H_
+
+
+#define AD7999_PRIORITY 7
+
+#ifndef _MACRO_ONLY
+
+extern FX32 get_volume(unsigned int ch);
+extern void ad7999_task(VP_INT exinf);
+
+#endif
+#endif /* AD7999_H_ */