目次: RISC-V
以前HiFive Unleashedの動作周波数を調べました(2019年7月4日の日記参照)。今回はHiFive Unmatchedの動作周波数を調べます。Unmatchedに元々書き込んであるLinuxを起動したあと、PRCIレジスタ領域を見てみました。ダンプすると下記のようになっています。
0x10000000: 0xc0000000 0x820544c2 0x00000000 0x820d1180 0x10000010: 0x80000000 0x00000000 0x00000000 0x8206b982 0x10000020: 0x80000000 0x00000000 0x0000006f 0x00000004 0x10000030: 0x00000000 0x00000000 0x030187c1 0x00000000 0x10000040: 0x00000000 0x00000000 0x00000000 0x00000000 0x10000050: 0x82063bc2 0x80000000 0x00000000 0x00000000 0x10000060: 0x00000000 0x00000000 0x00000000 0x00000000
ビット31がPLL enableですので、オフセット0x4:core_pll, 0xc: ddr_pll, 0x1c: gemgxl_pll, 0x50: hfpclk_pllの設定が有効になっているようです。
いずれのPLL設定もビットフィールドの意味は同じで、[5:0] divr, [14:6] divf, [17:15] divqです。ビットフィールドが4bit境界にないので、PythonなどでPLLの設定値を表示させると楽だと思います。
SiFive U740の仕様書(7. Clocking and Reset)を見ると、PLLの出力周波数foutは
fout = fin / (div_r + 1) * 2 * (div_f + 1) / 2 ^ (div_q)
とのこと。PLLの入力finはいずれのPLLも同じでhfclkという26MHzの外部クロックです。
>> def dump(val):
... r = val & 0x3f
... f = (val >> 6) & 0x1ff
... q = (val >> 15) & 0x7
... o = 26 / (r + 1) * 2 * (f + 1) / pow(2, q)
... print("r", r, "f", f, "q", q, "freq", o)
>>> dump(0x820544c2)
r 2 f 275 q 2 freq 1196.0
>>> dump(0x820d1180)
r 0 f 70 q 2 freq 923.0
>>> dump(0x8206b982)
r 2 f 230 q 5 freq 125.12499999999999
>>> dump(0x82063bc2)
r 2 f 239 q 4 freq 260.0
出力結果を見るとcore_pll:1196MHz, ddr_pll:923MHz, gemgxl_pll:125.125MHz, hfpclk_pll: 260MHzという設定です。どうしてこの値なのかはわからないですけど、参考になります。
PLL設定に [20:18] rangeというフィールドがあるのですが、SiFiveの仕様書には説明が書かれていません。クロック周りはAnalog Bitsという会社のCLN28HPC Wide Range PLLを使っているようですが、PLLの詳細仕様はNDAを結ばないと知ることができません。うーむ、不親切……。
しかしSiFiveの人たちはLinuxのクロックドライバを作ってくれており、実装からPLLの仕様を窺い知ることができます。ドライバはlinux/drivers/clk/analogbits/wrpll-cln28hpc.cにあります。
/**
* __wrpll_calc_filter_range() - determine PLL loop filter bandwidth
* @post_divr_freq: input clock rate after the R divider
*
* Select the value to be presented to the PLL RANGE input signals, based
* on the input clock frequency after the post-R-divider @post_divr_freq.
* This code follows the recommendations in the PLL datasheet for filter
* range selection.
*
* Return: The RANGE value to be presented to the PLL configuration inputs,
* or a negative return code upon error.
*/
static int __wrpll_calc_filter_range(unsigned long post_divr_freq)
{
if (post_divr_freq < MIN_POST_DIVR_FREQ ||
post_divr_freq > MAX_POST_DIVR_FREQ) {
WARN(1, "%s: post-divider reference freq out of range: %lu",
__func__, post_divr_freq);
return -ERANGE;
}
switch (post_divr_freq) {
case 0 ... 10999999:
return 1;
case 11000000 ... 17999999:
return 2;
case 18000000 ... 29999999:
return 3;
case 30000000 ... 49999999:
return 4;
case 50000000 ... 79999999:
return 5;
case 80000000 ... 129999999:
return 6;
}
return 7;
}
単純に入力をswitch文で見ているだけです。説明を見るとpost-R-dividerとあるのでfin / (divr + 1) の周波数を見て決めれば良さそうですね。この情報を公開していただけるのは非常にありがたいのですが、NDAは大丈夫なんですかね……?大した情報ではないとはいえ、ちょっと心配になってしまいます。
この記事にコメントする
目次: Zephyr
Zephyrを最新にしたところSDKのバージョンが古いと怒られてしまいました。
Zephyr SDK 0.13にアップデートしたところ「Debian TestingにはPython 3.8が無くてGDBが動かない」問題が再発しました。Python 3.9を使い、不具合を治すパッチを当てないといけません(その1〜3を参照)が、以前と同様の方法ではダメなようです。
調べてみると少し仕組みが変わっています。バージョン0.12まではUpstreamのtarballを参照し、ローカルでパッチを持っていました。バージョン0.13はnewlib-nano, binutils, gcc, gdb, newlibについてはGitHubのZephyrプロジェクト以下にあるフォークされたソースコード(パッチ適用済み)を参照し、tarballを作成するように変更されました。
今まではローカルでパッチを当てる仕組みが動いていたため、パッチファイルを1つ追加するだけで修正を適用できましたが、0.13からローカルでパッチを当てる仕組み自体を使わなくなったため、パッチファイルを置いても修正が適用されなくなりました。困った。
バージョン0.12以前の設定と同じようにsdk-ng/patches/gdbの下にあるパッチファイルを見るようにする方法です。まずローカルパッチ機能を有効にするため、コンフィグを追加します。追加する場所はどこでも良い(順序は特にない)です。私はファイルの最後に追加しています。
# sdk-ng/configs/riscv64.config
...
CT_PATCH_BUNDLED_LOCAL=y
CT_LOCAL_PATCH_DIR="${CT_TOP_DIR}/../../patches"
注意点としてはGDBのバージョンは9.2ですが、パッチのディレクトリ名はtarballの名前に準じてgit-xxxxxxxxのようにしなければならないことです。ディレクトリ名を9.2にするとパッチが無視されます。例えば今回試した環境ではgit-76b05e96だったので、sdk-ng/patches/gdb/git-76b05e96/0007-gdb-fix-python3.9.patchのように置けば良いです。
もしgit-xxxxxxxxのバージョンがわからないときは、configs/riscv64.configのCT_GDB_DEVEL_REVISIONを見るとリビジョンが書いてありますが、ぶっちゃけ一旦ビルドしてみてビルドログを見た方が早いです。
動きにややクセがあるもののバージョン0.13だとこちらのほうが変更量が少なくスマートです。0.12でも同じ方法が使えると思いますが、未確認です。
Zephyr SDKの配下にあるCrosstool-NGはパッチセットを持っています。パッチセットに追加しておけば初回ビルド時(sdk-ng/share以下にファイルコピーが行われる)にパッチを持っていってくれます。例えばsdk-ng/crosstool-ng/packages/gdb/git-76b05e96/0007-gdb-fix-python3.9.patchのように置けばよいです。
注意点としては、その1同様の点でディレクトリ名(git-xxxxxxxx)に気をつけること、もう1つあって「コピーのタイミング」にクセがあることです。Crosstool-NGのパッチセットはsdk-ng/share配下にコピーされますが、これはgo.shの初回実行時しかコピーされません。
パッチファイルを追加するなど、再びコピーを実行してほしい場合sdk-ng/binとsdk-ng/shareを消してからgo.shを実行すると初回の処理が再実行されるようです。ただgo.shはヘルプが一切なく、私のやり方が正しいかどうか良くわからないのが欠点です……。
Crosstool-NGのパッチ当てを行っているスクリプトfunctionsはsdk-ng/crosstool-ng/scripts/functionsが元のスクリプトですが、Zephyr SDKのビルドでは初回ビルド実行時にsdk-ng/share/crosstool-ng/scripts/functionsにコピーされます。ビルド時はコピーしたスクリプトを実行します。
そのためスクリプトにログなどを入れたい場合、コピーの方(sdk-ng/share/crosstool-ng/scripts/functions)を改変しないと効果がないです。ご注意を。
この記事にコメントする
Facebookは内蔵ブラウザで、Webサイトへのリンクを開きます。私はWebサイトはブラウザで開いてほしい(タブが残せるし、あとで閲覧履歴を確認することもできる)ので、この挙動はぜひとも無効化したいです。
今まで無効化する方法がわからなくて困っていましたが、今日、設定を頭から試していたら、
[設定] - [メディア] - [リンクを外部で開く]
をONにすると外部のブラウザで開いてくれることがわかりました。Webサイトってメディアか……?まあやりたいことはできたから良いか。
LINEも内蔵ブラウザでリンクを開きます。無効化したいですが、設定にそのような項目が見当たりません。うーん、嫌な挙動ですね。
メモ: 技術系の話はFacebookから転記しておくことにした。
この記事にコメントする
目次: Kindle
初代Kindle Fire HDの話。
第七世代Kindle Fire HDもしくはKindle for PCの話。
Kindle用のAndroidタブレットの話。
Amazonそのものの話。
目次: 一覧の一覧
この記事にコメントする
目次: Kindle
第七世代Kindle Fire HDの挙動がどんどんおかしくなってきています。前にも発生した(2018年11月17日の日記参照)、買った本を認識しなくなる病気です。ここのところおかしくなりすぎだぞ?頑張ってくれKindleさん。
前回はスクリーンショットを取り損ねたので、今回はスクリーンショット付きでお届けします。
本を買ったことを認識できていない機能としては、
逆に本を買ったことを認識できている機能としては、
です。そろそろファクトリリセットの時期なんですかね……?
ファクトリリセットは時間かかって嫌なので、なんとか直せないかなと頑張りましたけど、前回の解決策なども通じずじまいで駄目でした。
となりました。どうやっても「役立たずスキルに……」の3巻を読めません。困ったね。
TwitterでKindleの文句ばっかり言ってたせいか、最近Amazonのサポートデスクの人からTwitterでリプライをいただけることがあります。
たぶん世界中に私のようなヤツが一杯いるんでしょう。中の人も相当お疲れなようで、かなり機械的というか、マニュアルかなんかありそうな対応(最初にFAQに案内され、それでも駄目だって言うと、サポートデスクチャットを案内される)ですけど……。いやまあ、声掛けていただけるだけありがたいことですよね、うん……。
サポートデスクの人曰く、Amazonのトラブルシューティング(Amazon.co.jpヘルプ - Kindle本がライブラリに表示されない)を参考に試してみてほしいとのことでした。こんな内容です。
上から順に試してみると、6番目の「コンテンツと端末の管理を使用して、ご希望の端末に本を配信します。」が大当たりでした。スゲエ。この手のFAQ系の手順で直ったことって一切ないんで、これが初めてかも??
未読/既読、どこまで読んだか?情報はキレイさっぱり消えていました。配信したかどうかすら忘れてるんだもん、そりゃそうか。
とまあ、この通りKindleはいつ何が消えるか予想がつかないため、しおり、位置保存、などの機能は一切信用しませんし、使うこともないですね……。
Amazonサポートデスクの人に「なんで勝手に配信解除されたのでしょうか」ってTwitterで聞いたらシカトされました。悲しいよ。
今回に限らないですが、Amazonサポートデスクの人に「どうしたらいいですか?」と聞くと超スピードで答えてくれます(最終奥義は返金です)が、「どうしてこうなるんですか?」って聞くとシカトされる傾向にあります。Amazonは開発部門とサポート部門の距離が遠くて答えを持ってない、機密漏洩等を恐れて意図的に知らせていない、とかかな?
色々事情がありそうなことは察しますが、こちらも人間なのでシカトは辛いよね……。普通に「技術面の質問はわかりませんorお答えできかねます」って言ってくれたら「そうなのか〜」で終わりなんだけど。何か過去にモメごとでもあったのかもね?
この記事にコメントする
| < | 2021 | > | ||||
| << | < | 08 | > | >> | ||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | - | - | - | - |
25年10月15日
25年10月18日
22年5月5日
25年10月19日
23年4月11日
06年4月22日
25年10月17日
25年10月6日
25年10月13日
20年10月23日
25年10月12日
20年8月29日
19年1月13日
18年10月13日
18年9月3日
18年8月20日
18年7月23日
18年7月22日
18年10月14日
18年11月10日
wiki
Linux JM
Java API
2002年
2003年
2004年
2005年
2006年
2007年
2008年
2009年
2010年
2011年
2012年
2013年
2014年
2015年
2016年
2017年
2018年
2019年
2020年
2021年
2022年
2023年
2024年
2025年
過去日記について
アクセス統計
サーバ一覧
サイトの情報合計:
本日: