static void init_sport0_rx(void);
static void init_sport0_tx(void);
-static void pack_af_sample( int left, int right, int * word0, int * word1);
-static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int idata, int qdata );
+static void pack_af_sample( short left, short right, int * pri_ch, int * sec_ch1);
+static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata );
static void parse_non_wide_fm( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata, int* valid_iq );
unsigned int af_buffer[2][AF_BUFSIZE];
} sport_ctl;
+static struct {
+ int index;
+ unsigned short flags;
+ unsigned short smeter;
+} af_ctl;
+
/**
* \brief RX_IF受信データの処理タスク
* \param cfgファイルから値を渡すための引数。使っていない
syscall(serial_ctl_por(TASK_PORTID,
(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
+ af_ctl.index = FALSE;
+ af_ctl.flags = 0;
+ af_ctl.smeter = 0;
// SPORT0の送受割り込みを可能にする
syscall(ena_int(INTNO_SPORT0_RX));
}
-static void pack_af_sample( int left, int right, int * word0, int * word1)
+/**
+ * \brief AFサンプルをパックしてデータキューに書き込みできる形式に変換する
+ * \param left 左チャンネルのオーディオデータ。[-1,1.0)の固定小数点形式
+ * \param right 右チャンネルのオーディオデータ。[-1,1.0)の固定小数点形式
+ * \param pri_ch パック済みオーディオデータ。最初にデータキューにコピーする。
+ * \param sec_ch パック済みオーディオデータ。2番めにデータキューにコピーする。
+ * \detail
+ * 与えられたステレオ・データから、データキュー書き込み用のデータを組み立てる。
+ * 書き込みデータはSPORTのプライマリ・チャンネル用、セカンダリ・チャンネル用がある。
+ * さらに、これらがindex ==0 および 1の場合に別れる。
+ *
+ * この関数はindexを af_ctrl.index で管理しており、その値に応じて適切な
+ * プライマリ・チャンネル、セカンダリ・チャンネル用のデータを組み立てる。
+ *
+ * なお、セカンダリ・チャンネルはindex = 1の時にサブ・オーディオを伝送するが、
+ * TRX-305はサブ・オーディオを使わないためこのルーチンは常に値を0としている。
+ */
+static void pack_af_sample( short left, short right, int * pri_ch, int * sec_ch)
{
+ // オーディオデータは15bitしか使わない。Rchの16bit目は0に固定する
+ right >>= 1; // 15bitに変換
+ right &= 0x7FFF; // 本当はMSBは無視されるのだが、念の為0にする
+
+ left >>= 1; //15bitに変換
+
+ if ( af_ctl.index )
+ {
+ left |= 0x8000; // MSBを1にする
+
+ // indexが1のとき、セカンダリチャンネルはサブオーディオとなっている。
+ // TRX-305はサブオーディオを使わないのでindexデータのみ送る
+ *sec_ch = 0x00008000;
+ }
+ else
+ {
+ left &= 0x7FFF; // MSBを0にする
+ // indexが0のとき、セカンダリオーディオはDSPからSH2へのデータ回線である
+ *sec_ch =
+ af_ctl.smeter << 16 |
+ af_ctl.flags; // flagsのbit15は0なので、indexも0になる
+ }
+
+ // プライマリ・チャンネルの組み立て
+ *pri_ch = (right << 16) | left;
+
+
+ af_ctl.index = ! af_ctl.index; // indexの論理反転
}
-static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int idata, int qdata )
+
+/**
+ * \brief ワイドFMのRX-IFデータを解析する
+ * \param pri_ch プライマリ・チャンネルからのデータ
+ * \param sec_ch セカンダリ・チャンネルからのデータ
+ * \param idata 抽出したIデータ。[-1,1.0)の固定小数点形式
+ * \param qdata 抽出したQデータ。[-1,1.0)の固定小数点形式
+ * \detail
+ */
+static void parse_wide_fm ( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata )
{
}
+
+/**
+ * \brief 非ワイドFMのRX-IFデータを解析する
+ * \param pri_ch プライマリ・チャンネルからのデータ
+ * \param sec_ch セカンダリ・チャンネルからのデータ
+ * \param idata 抽出したIデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
+ * \param qdata 抽出したQデータ。[-1,1.0)の固定小数点形式。valid_iqが真の時のみ有効
+ * \param valid_iq IQデータが有効の時真、向こうの時は偽
+ * \detail
+ */
+
static void parse_non_wide_fm( unsigned int pri_ch, unsigned int sec_ch, int* idata, int* qdata, int* valid_iq )
{