OSDN Git Service

SPORTのイネーブル時に、TX/RXの開始時間にずれが起きないよう、ブロックを一度空読みした。
[uzume/uzume_bfin.git] / uzume_prototype / kernel / uzume / ad7999.c
1 /**
2  * \file ad7999.c
3  * \Author: suikan
4  * \brief AD799x I2C ADCからデータを読み込み、API経由でアプリケーションへ渡す
5  */
6
7
8 #include <t_services.h>
9 #include <s_services.h>
10 #include <i2c_subsystem.h>
11 #include "kernel_id.h"
12 #include "uzume.h"
13 #include "ad7999.h"
14
15 /**
16  * @brief AD7999のチャンネル数
17  */
18 #define NUM_CH 4
19
20 /**
21  * @brief ADC変換値保存用配列
22  * @details
23  * 変換値を保存する。アクセスは排他的でなければならない。値は符号付き左詰めである。
24  * 整数部はないので、1ビットの符号の右に小数部が連なる。
25  */
26 static fract32 values[NUM_CH];
27
28 /*
29  * ADCのI2Cポート。
30  * AD7999が接続されているI2Cペリフェラルのポート番号。デフォルトは0である。他のポートを使いたい時には
31  * sys_config.hで宣言すると良い。なお、I2Cコントローラ・ペリフェラルがひとつしかない場合には0を指定
32  * する。
33  */
34 #ifndef UZUME_AD7999_I2C_PORT
35 #define UZUME_AD7999_I2C_PORT 0x00
36 #endif
37
38 /*
39  * ADCのI2Cアドレス。
40  * AD7999の7bit I2Cアドレスはデフォルトで0x28と決め打ちしている。他のアドレスを使いたい時には
41  * sys_config.hで宣言すると良い
42  */
43 #ifndef UZUME_AD7999_I2C_ADRS
44 #define UZUME_AD7999_I2C_ADRS 0x28
45 #endif
46
47 /**
48  * \brief ADU999 制御タスク
49  * \param extinf タスク引数。ADC799xが持つ7bitのI2Cアドレスを指定する。
50  */
51 void ad7999_task(VP_INT exinf)
52 {
53     unsigned int ch;
54     unsigned char adcbuf[2];
55
56
57     while(1)
58     {
59         i2ccall(i2c_master_read(UZUME_AD7999_I2C_PORT, UZUME_AD7999_I2C_ADRS, adcbuf, 2));
60
61             /* 上位バイトのbit 5:4 をチャンネル番号として受け取る */
62         ch = ( adcbuf[0] & 0x30 ) >> 4;
63             /*上位バイトのbit 3;0と下位バイトから12bitのADCデータを作る。そのデータを32bitに左詰めする */
64
65         /* 排他区間開始 */
66         syscall(wai_sem(AD7999_SEM));
67         values[ch] = ( (( adcbuf[0] & 0x0F )<<8 ) | adcbuf[1] ) << 19;
68         syscall(sig_sem(AD7999_SEM));
69         /* 排他区間終了 */
70
71         tslp_tsk(1);
72     }
73 }
74
75 fract32 get_volume(unsigned int ch)
76 {
77     fract32 retval;
78
79         // パラメータチェック
80     if (ch >= NUM_CH)
81         ch = NUM_CH - 1;
82
83     /* 排他区間開始 */
84     syscall(wai_sem(AD7999_SEM));
85     retval = values[ch];
86     syscall(sig_sem(AD7999_SEM));
87     /* 排他区間終了 */
88
89     return retval;
90 }
91
92
93 void set_volume(unsigned int ch, fract32 value)
94 {
95 }