「USRP2の設定」の編集履歴(バックアップ)一覧はこちら
「USRP2の設定」(2011/07/10 (日) 16:56:49) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
今まであまり深堀していなかったUSRP2について調査をする。
*pick_bitrate.py
**_pick_bitrate()
xrate(interpolation)及びsamples_per_symbolが決まっている場合、ビットレートを以下の式で決定している。
ビットレート = converter_rate(100Mbps) / xrate / samples_per_symbol
*新しく買ったUSRP2が動かない。。
以下、./benchmark_tx.pyを実行すると発生するエラー。
>>> gr_fir_ccf: using SSE
dac_rate= 100M
samples/symbol= 2
Requested TX Bitrate: 100k Actual Bitrate: 100k
interp_rates= 500
Failed to set Rx frequency to 2.45G
Traceback (most recent call last):
File "./test_cdma_tx.py", line 174, in <module>
main()
File "./test_cdma_tx.py", line 162, in main
tb = my_top_block(mods[options.modulation], options)
File "./test_cdma_tx.py", line 74, in __init__
self._setup_usrp_sink(options)
File "./test_cdma_tx.py", line 116, in _setup_usrp_sink
raise ValueError, eng_notation.num_to_str(options.tx_freq)
ValueError: 2.45G
USRP2の送信周波数を2.45Gにセットできないそう。。ドーターボードを取り換えても
だめなので、どうやら本体に原因がある?
エラーを出している元、usrp2_impl.cc
bool
usrp2::impl::set_tx_center_freq(double frequency, tune_result *result)
{
op_config_tx_v2_cmd cmd;
op_config_tx_reply_v2_t reply;
init_config_tx_v2_cmd(&cmd);
cmd.op.valid = htons(CFGV_FREQ);
u2_fxpt_freq_t fxpt = u2_double_to_fxpt_freq(frequency);
cmd.op.freq_hi = htonl(u2_fxpt_freq_hi(fxpt));
cmd.op.freq_lo = htonl(u2_fxpt_freq_lo(fxpt));
pending_reply p(cmd.op.rid, &reply, sizeof(reply));
if (!transmit_cmd_and_wait(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT)) //ここでfalseが戻ってしまう。
return false;
bool success = (ntohx(reply.ok) == 1);
if (result && success) {
result->baseband_freq =
u2_fxpt_freq_to_double(
u2_fxpt_freq_from_hilo(ntohl(reply.baseband_freq_hi),
ntohl(reply.baseband_freq_lo)));
result->dxc_freq =
u2_fxpt_freq_to_double(
u2_fxpt_freq_from_hilo(ntohl(reply.duc_freq_hi),
ntohl(reply.duc_freq_lo)));
result->residual_freq =
u2_fxpt_freq_to_double(
u2_fxpt_freq_from_hilo(ntohl(reply.residual_freq_hi),
ntohl(reply.residual_freq_lo)));
result->spectrum_inverted = (bool)(ntohx(reply.inverted) == 1);
}
return success;
}
bool
usrp2::impl::transmit_cmd_and_wait(void *cmd, size_t len, pending_reply *p, double secs)
{
d_pending_replies[p->rid()] = p;
if (!transmit_cmd(cmd, len)){
d_pending_replies[p->rid()] = 0;
return false; //こいつか(たぶんこいつ)
}
int res = p->wait_for_completion(secs); //それともこいつか
d_pending_replies[p->rid()] = 0;
return res == 1;
}
bool
usrp2::impl::transmit_cmd(void *cmd_, size_t len_)
{
const void *cmd = cmd_;
int len = len_;
unsigned char tmp[64];
if (len_ < 64){ // pad to minimum ethernet frame size
memset(tmp, 0, sizeof(tmp));
memcpy(tmp, cmd_, len_);
cmd = tmp;
len = sizeof(tmp);
}
return d_eth_buf->tx_frame(cmd, len) == eth_buffer::EB_OK;
}
[[ここ>http://mach123.wordpress.com/2010/10/24/usrp2-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D/]]が参考になるかも
-結局分らなかったので、Ettus Resarchの人に聞いてみた
以下の回答の通り、XCVR2450用のファームウェアをSDカードにインストールしたら動いた!
If you're using the "classic" USRP2 interface, you'll need to use the XCVR2450-specific firmware on the USRP2:
http://code.ettus.com/redmine/ettus/attachments/71
Since "benchmark_tx.py" uses the "classic" raw-ethernet interface, you'll need the XCVR-specific firmware.
インストールコマンド
./u2_flash_tool --dev=/dev/sdb -t s/w ~/txrx_xcvr_raw_eth_20100608.bin -w
----
今まであまり深堀していなかったUSRP2について調査をする。
*pick_bitrate.py
**_pick_bitrate()
xrate(interpolation)及びsamples_per_symbolが決まっている場合、ビットレートを以下の式で決定している。
ビットレート = converter_rate(100Mbps) / xrate / samples_per_symbol
*新しく買ったUSRP2が動かない。。
以下、./benchmark_tx.pyを実行すると発生するエラー。
>>> gr_fir_ccf: using SSE
dac_rate= 100M
samples/symbol= 2
Requested TX Bitrate: 100k Actual Bitrate: 100k
interp_rates= 500
Failed to set Rx frequency to 2.45G
Traceback (most recent call last):
File "./test_cdma_tx.py", line 174, in <module>
main()
File "./test_cdma_tx.py", line 162, in main
tb = my_top_block(mods[options.modulation], options)
File "./test_cdma_tx.py", line 74, in __init__
self._setup_usrp_sink(options)
File "./test_cdma_tx.py", line 116, in _setup_usrp_sink
raise ValueError, eng_notation.num_to_str(options.tx_freq)
ValueError: 2.45G
USRP2の送信周波数を2.45Gにセットできないそう。。ドーターボードを取り換えても
だめなので、どうやら本体に原因がある?
エラーを出している元、usrp2_impl.cc
bool
usrp2::impl::set_tx_center_freq(double frequency, tune_result *result)
{
op_config_tx_v2_cmd cmd;
op_config_tx_reply_v2_t reply;
init_config_tx_v2_cmd(&cmd);
cmd.op.valid = htons(CFGV_FREQ);
u2_fxpt_freq_t fxpt = u2_double_to_fxpt_freq(frequency);
cmd.op.freq_hi = htonl(u2_fxpt_freq_hi(fxpt));
cmd.op.freq_lo = htonl(u2_fxpt_freq_lo(fxpt));
pending_reply p(cmd.op.rid, &reply, sizeof(reply));
if (!transmit_cmd_and_wait(&cmd, sizeof(cmd), &p, DEF_CMD_TIMEOUT)) //ここでfalseが戻ってしまう。
return false;
bool success = (ntohx(reply.ok) == 1);
if (result && success) {
result->baseband_freq =
u2_fxpt_freq_to_double(
u2_fxpt_freq_from_hilo(ntohl(reply.baseband_freq_hi),
ntohl(reply.baseband_freq_lo)));
result->dxc_freq =
u2_fxpt_freq_to_double(
u2_fxpt_freq_from_hilo(ntohl(reply.duc_freq_hi),
ntohl(reply.duc_freq_lo)));
result->residual_freq =
u2_fxpt_freq_to_double(
u2_fxpt_freq_from_hilo(ntohl(reply.residual_freq_hi),
ntohl(reply.residual_freq_lo)));
result->spectrum_inverted = (bool)(ntohx(reply.inverted) == 1);
}
return success;
}
bool
usrp2::impl::transmit_cmd_and_wait(void *cmd, size_t len, pending_reply *p, double secs)
{
d_pending_replies[p->rid()] = p;
if (!transmit_cmd(cmd, len)){
d_pending_replies[p->rid()] = 0;
return false; //こいつか(たぶんこいつ)
}
int res = p->wait_for_completion(secs); //それともこいつか
d_pending_replies[p->rid()] = 0;
return res == 1;
}
bool
usrp2::impl::transmit_cmd(void *cmd_, size_t len_)
{
const void *cmd = cmd_;
int len = len_;
unsigned char tmp[64];
if (len_ < 64){ // pad to minimum ethernet frame size
memset(tmp, 0, sizeof(tmp));
memcpy(tmp, cmd_, len_);
cmd = tmp;
len = sizeof(tmp);
}
return d_eth_buf->tx_frame(cmd, len) == eth_buffer::EB_OK;
}
[[ここ>http://mach123.wordpress.com/2010/10/24/usrp2-%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D/]]が参考になるかも
-結局分らなかったので、Ettus Resarchの人に聞いてみた
以下の回答の通り、XCVR2450用のファームウェアをSDカードにインストールしたら動いた!
If you're using the "classic" USRP2 interface, you'll need to use the XCVR2450-specific firmware on the USRP2:
http://code.ettus.com/redmine/ettus/attachments/71
Since "benchmark_tx.py" uses the "classic" raw-ethernet interface, you'll need the XCVR-specific firmware.
インストールコマンド
./u2_flash_tool --dev=/dev/sdb -t s/w ~/txrx_xcvr_raw_eth_20100608.bin -w
----