OSDN Git Service

#30674 (get_volume() / set_volume() の抽象化) に対応。
authorsuikan <suikan@users.sourceforge.jp>
Sat, 9 Feb 2013 08:52:42 +0000 (17:52 +0900)
committersuikan <suikan@users.sourceforge.jp>
Sat, 9 Feb 2013 08:52:42 +0000 (17:52 +0900)
 get_voluem() set_volume()の定義をbsp_*.c に移し、その中からADC等のアクセス関数を呼ぶように変更した。

bsp_bluetankとbsp_amakusa592で対応。

uzumeapp/kernel/config/blackfin/bsp_amakusa592/sys_config.h
uzumeapp/kernel/uzume/ad7999.c
uzumeapp/kernel/uzume/ad7999.h
uzumeapp/kernel/uzume/bsp_amakusa592.c
uzumeapp/kernel/uzume/bsp_amakusa592.h
uzumeapp/kernel/uzume/bsp_bluetank.c
uzumeapp/kernel/uzume/bsp_bluetank.h
uzumeapp/kernel/uzume/rotenc.c
uzumeapp/kernel/uzume/rotenc.h

index d29cc83..605a1e9 100644 (file)
@@ -89,7 +89,7 @@
  * UZUME_SSM2603_I2C_ADRS はSSM2603 コーデックの I2Cデバイスアドレスである。7bitアドレスを右詰めで表現する
  * デフォルトは0x1A
  *
- * UZUME_AD7999_I2C_ADRS はAD7999 ADCの I2Cデバイスアドレスである。7bitアドレスを右詰めで表現する。
+ * UZUME_AD7999_I2C_ADRS はAD7991/5/9 ADCの I2Cデバイスアドレスである。7bitアドレスを右詰めで表現する。
  * デフォルトは 0x28
  *
  * その他、I2Cペリフェラルのポート番号を指定するマクロもあるが、2012年時点で0以外には対応していないので
@@ -99,8 +99,8 @@
 //#define UZUME_BLOCKSIZE 64
 //#define UZUME_INT_BITS 0
 //#define UZUME_SSM2603_I2C_ADRS 0x1A
-//#define UZUME_AD7999_I2C_ADRS 0x28
-
+#define UZUME_AD7999_I2C_ADRS 0x28
+//#define UZUME_SSM2603_I2C_ADRS_2
 // #define MAIN_TASK_PRIORITY    7
 // #define LOGTASK_PRIORITY      5
 // #define CODEC_TASK_PRIORITY   4
index 7afd095..e742e0b 100644 (file)
 #include "ad7999.h"
 
 /**
- * @brief AD7999のチャンネル数
+ * @brief AD7999のチャンネル数 UZUME_AD7999_I2C_ADRS_2が宣言されている場合にはチャンネル数を2にする。
  */
+#ifdef UZUME_AD7999_I2C_ADRS_2
+#define NUM_CH 8
+#else
 #define NUM_CH 4
+#endif
 
 /**
  * @brief ADC変換値保存用配列
@@ -37,11 +41,11 @@ static fract32 values[NUM_CH];
 
 /*
  * ADCのI2Cアドレス。
- * AD7999の7bit I2Cアドレスはデフォルトで0x28と決め打ちしている。他のアドレスを使いたい時には
+ * AD7999の7bit I2Cアドレスはデフォルトで0x29と決め打ちしている。他のアドレスを使いたい時には
  * sys_config.hで宣言すると良い
  */
 #ifndef UZUME_AD7999_I2C_ADRS
-#define UZUME_AD7999_I2C_ADRS 0x28
+#define UZUME_AD7999_I2C_ADRS 0x29
 #endif
 
 /**
@@ -68,6 +72,21 @@ void ad7999_task(VP_INT exinf)
         syscall(sig_sem(AD7999_SEM));
         /* 排他区間終了 */
 
+#ifdef UZUME_AD7999_I2C_ADRS_2
+        i2ccall(i2c_master_read(UZUME_AD7999_I2C_PORT, UZUME_AD7999_I2C_ADRS_2, adcbuf, 2));
+
+            /* 上位バイトのbit 5:4 をチャンネル番号として受け取る。2番目のADCなのでオフセットは4 */
+        ch = (( adcbuf[0] & 0x30 ) >> 4) + 4;
+            /*上位バイトのbit 3;0と下位バイトから12bitのADCデータを作る。そのデータを32bitに左詰めする */
+
+        /* 排他区間開始 */
+        syscall(wai_sem(AD7999_SEM));
+        values[ch] = ( (( adcbuf[0] & 0x0F )<<8 ) | adcbuf[1] ) << 19;
+        syscall(sig_sem(AD7999_SEM));
+        /* 排他区間終了 */
+
+#endif
+
         tslp_tsk(1);
     }
 }
@@ -78,7 +97,7 @@ void ad7999_task(VP_INT exinf)
  * \return 32bit符号付き固定小数点数のボリューム値
  */
 
-fract32 get_volume(unsigned int ch)
+fract32 ad7999_get_volume(unsigned int ch)
 {
     fract32 retval;
 
@@ -94,17 +113,3 @@ fract32 get_volume(unsigned int ch)
 
     return retval;
 }
-
-/**
- * \brief ボリューム値の設定
- * \param ch 0から始まるチャンネル指定番号。AD7999は3まで
- * \param value 32bit符号付き固定小数点数のボリューム設定値
- * \details
- * ボリュームに初期値を与える。この関数は互換性維持用なので
- * AD7999を使う場合には中身は空である。
- */
-
-
-void set_volume(unsigned int ch, fract32 value)
-{
-}
index c7abe5c..c0f15c6 100644 (file)
@@ -28,6 +28,7 @@
 #ifndef _MACRO_ONLY
 
 extern void ad7999_task(VP_INT exinf);
+extern fract32 ad7999_get_volume(unsigned int ch);
 
 #endif
 #endif /* AD7999_H_ */
index a7d00aa..c884f5c 100644 (file)
@@ -9,6 +9,7 @@
 #include <t_services.h>
 #include <cdefBF592-A.h>
 #include <bsp_amakusa592.h>
+#include <ad7999.h>
 
 void board_initialize(VP_INT exinf)
 {
@@ -21,3 +22,29 @@ void board_initialize(VP_INT exinf)
     *pPORTG_FER = 0x00ee;
 
 }
+
+/**
+ * \brief ボリューム値の取得
+ * \param ch 0から始まるチャンネル指定番号。Amakusaはボリュームを1個持っているだけなので、
+ * 3までのインデックスを扱う
+ */
+
+fract32 get_volume(unsigned int ch)
+{
+    if ( ch >= UZUME_NUM_VOLUME)
+        return 0;
+
+    return ( ad7999_get_volume( ch ) );
+}
+
+/**
+ * \brief ボリューム値の設定
+ * \param ch 0から始まるチャンネル指定番号。AD7999は3まで
+ * \param value 32bit符号付き固定小数点数のボリューム設定値
+ * \details
+ * ボリュームに初期値を与える。
+ */
+
+void set_volume(unsigned int ch, fract32 value)
+{
+}
index 44da247..392ecb4 100644 (file)
 #define BSP_AMAKUSA592_H_
 
 /**
+ * \breif ボリューム入力のチャンネル数
+ * \details
+ * BSPが持つボリュームのチャンネル数。ここでいうボリュームはポテンショメータに限らない。
+ * ロータリーエンコーダーなども含む。また、システムが複数種のボリューム(例えばADCと
+ * ロータリーエンコーダー)を持つ場合には、それらのチャンネル数の総和である。
+ */
+
+#define UZUME_NUM_VOLUME 4
+
+
+/**
  * \brief ボード・イニシャライザ
  * \param exinf 0を渡す。関数からは無視される。
  * \details
index 5d8350d..7433540 100644 (file)
@@ -9,6 +9,7 @@
 #include <t_services.h>
 #include <cdefBF592-A.h>
 #include <bsp_bluetank.h>
+#include <rotenc.h>
 
 void board_initialize(VP_INT exinf)
 {
@@ -21,3 +22,29 @@ void board_initialize(VP_INT exinf)
     *pPORTG_FER = 0x00ee;
 }
 
+/**
+ * \brief ボリューム値の取得
+ * \param ch 0から始まるチャンネル指定番号。Amakusaはボリュームを1個持っているだけなので、
+ * 3までのインデックスを扱う
+ */
+
+fract32 get_volume(unsigned int ch)
+{
+    if ( ch >= UZUME_NUM_VOLUME)
+        return 0;
+
+    return ( rotenc_get_volume( ch ) );
+}
+
+/**
+ * \brief ボリューム値の設定
+ * \param ch 0から始まるチャンネル指定番号。AD7999は3まで
+ * \param value 32bit符号付き固定小数点数のボリューム設定値
+ * \details
+ * ボリュームに初期値を与える。
+ */
+
+void set_volume(unsigned int ch, fract32 value)
+{
+        rotenc_set_volume( ch, value );
+}
index 2ade94a..0b32a01 100644 (file)
 #define BSP_BLUETANK_H
 
 /**
+ * \breif ボリューム入力のチャンネル数
+ * \details
+ * BSPが持つボリュームのチャンネル数。ここでいうボリュームはポテンショメータに限らない。
+ * ロータリーエンコーダーなども含む。また、システムが複数種のボリューム(例えばADCと
+ * ロータリーエンコーダー)を持つ場合には、それらのチャンネル数の総和である。
+ */
+
+#define UZUME_NUM_VOLUME 4
+
+/**
  * \brief ボード・イニシャライザ
  * \param exinf 0を渡す。関数からは無視される。
  * \details
index 7b33ff1..9e2fd71 100644 (file)
@@ -50,7 +50,7 @@ void rotenc_task(VP_INT exinf)
  * \return 32bit符号付き固定小数点数のボリューム値
  */
 
-fract32 get_volume(unsigned int ch)
+fract32 rotenc_get_volume(unsigned int ch)
 {
     fract32 retval;
 
@@ -75,7 +75,7 @@ fract32 get_volume(unsigned int ch)
  * \details
  * ボリュームに初期値を与える。
  */
-void set_volume(unsigned int ch, fract32 value)
+void rotenc_set_volume(unsigned int ch, fract32 value)
 {
 }
 
index 989ee1c..2409430 100644 (file)
@@ -28,6 +28,9 @@
 #ifndef _MACRO_ONLY
 
 extern void rotenc_task(VP_INT exinf);
+fract32 rotenc_get_volume(unsigned int ch);
+void rotenc_set_volume(unsigned int ch, fract32 value);
+
 
 #endif
 #endif /* ROTENC_H */