From b306cf2673561405cd6c7a0d9f37f809aadfcec3 Mon Sep 17 00:00:00 2001 From: suikan Date: Sun, 8 Mar 2015 23:40:48 +0900 Subject: [PATCH] =?utf8?q?AF=E3=82=B5=E3=83=B3=E3=83=97=E3=83=AB=E3=81=AE?= =?utf8?q?=E3=83=91=E3=83=83=E3=82=AD=E3=83=B3=E3=82=B0=E9=96=A2=E6=95=B0?= =?utf8?q?=E3=82=92=E6=9B=B8=E3=81=84=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- trx305/rx_if.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 78 insertions(+), 4 deletions(-) diff --git a/trx305/rx_if.c b/trx305/rx_if.c index 14efc42..038d3dd 100644 --- a/trx305/rx_if.c +++ b/trx305/rx_if.c @@ -9,8 +9,8 @@ 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 ); @@ -31,6 +31,12 @@ static struct { 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ファイルから値を渡すための引数。使っていない @@ -49,6 +55,9 @@ void rx_if_task(VP_INT exinf) 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)); @@ -151,14 +160,79 @@ void af_task(VP_INT exinf) } -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 ) { -- 2.11.0