検索
ホームページシステムチュートリアルLinux1 つの記事で理解 | Linux クロック サブシステム

1 つの記事で理解 | Linux クロック サブシステム

Feb 12, 2024 am 09:42 AM
linuxLinuxチュートリアルLinuxシステムLinuxコマンドシェルスクリプトLinux を始めるLinux学習

クロック クロックは SoC 内のパルスであり、各コンポーネントが独自のペースで動作するように制御します。たとえば、CPU 周波数設定、シリアル ポートのボー レート設定、I2S サンプリング レート設定、I2C レート設定などです。これらの異なるクロック設定は 1 つまたは複数のクロック ソースから取得され、最終的にクロック ツリーを形成する必要があります。このクロック ツリーは、cat /sys/kernel/debug/clk/clk_summary コマンドを通じて表示できます。

CCF フレームワークは、カーネルでクロックを管理するために使用されます。下図に示すように、右側がクロックプロバイダー、つまり Clock Provider、中央が CCF、左側がデバイスドライバーのクロックコンシューマー、つまり Clock Consumer です。

一文搞懂 | Linux 时钟子系统

クロックプロバイダー

  • ルート ノードは通常、オシレーター (アクティブ オシレーター) またはクリスタル (パッシブ オシレーター) です。
  • 中間ノードには、PLL (位相ロック ループ、周波数を上げるために使用)、Divider (分周器、周波数を下げるために使用)、Mux (複数のクロック パスから 1 つを選択)、Gate (ON/OFF の制御に使用) など、さまざまな種類があります。オフ)。
  • リーフ ノードは、クロックを入力として使用する特定の機能を備えた HW ブロックです。

クロックの特性に応じて、クロック フレームワークはクロックを 6 つのカテゴリ (固定レート、ゲート、デバイダー、マルチプレクサ、固定ファクター、コンポジット) に分類します。

#########データ構造###### 一文搞懂 | Linux 时钟子系统上記の 6 つのカテゴリは本質的にクロック デバイスです。カーネルはこれらのクロック HW ブロックの特性を抽出し、struct clk_hw を使用してそれらを表現します。詳細は次のとおりです:

リーリー 固定周波数バイブレータの固定レートを例にとると、そのデータ構造は次のとおりです。 リーリー これはおそらく他の特定のクロック デバイスにも当てはまるため、ここでは詳しく説明しません。

これらのデータ構造間の関係を説明する図は次のとおりです:

登録方法

データ構造を理解したところで、各種時計デバイスの登録方法を見ていきましょう。 一文搞懂 | Linux 时钟子系统

1. 固定レートクロック

このタイプのクロックは周波数が固定されており、オン/オフの切り替え、周波数の調整、親の選択はできません。最も単純なタイプのクロックです。 DTS 構成を通じて直接サポートできます。次のように、インターフェイスを介して固定レート クロックを直接登録することもできます。 リーリー

2. ゲートクロック

このタイプの時計はオンとオフのみ可能であり (.enable/.disable コールバックが提供されます)、次のインターフェイスを使用して登録できます:

リーリー

3.分周器クロック

このタイプのクロックは、分周値を設定できます (したがって、.recalc_rate/.set_rate/.round_rate コールバックが提供されます)。これは、次の 2 つのインターフェイスを通じて登録できます。

リーリー

4.マルチプレクサクロック

このタイプのクロックは、.get_parent/.set_parent/.recalc_rate コールバックを実装し、次の 2 つのインターフェイスを通じて登録できるため、複数の親を選択できます。 リーリー

5. 固定要素クロック

このタイプのクロックには固定係数 (つまり、乗算器と除算器) があります。クロックの周波数は、親クロックの周波数を mul で乗算し、div で除算したものです。主に、固定周波数の一部のクロックに使用されます。除算係数。親クロックの周波数を変更できるため、固定係数クロックの周波数も変更できるため、.recalc_rate/.set_rate/.round_rate などのコールバックも提供されています。次のインターフェイスを通じて登録できます:

リーリー

6.複合クロック

名前が示すように、マルチプレクサ、ディバイダ、ゲート、その他のクロックを組み合わせたもので、次のインターフェイスを通じて登録できます。 リーリー

これらの登録された関数は、最終的に関数

clk_register

を通じて Common Clock Framework に登録され、struct clk ポインターを返します。次のように:###

次に、返された struct clk ポインターを配列に保存し、of_clk_add_provider

インターフェイスを呼び出して共通クロック フレームワークに通知します。

Clock Consumer

获取 clock

即通过 clock 名称获取 struct clk 指针的过程,由 clk_get、devm_clk_get、clk_get_sys、of_clk_get、of_clk_get_by_name、of_clk_get_from_provider 等接口负责实现,这里以 clk_get 为例,分析其实现过程:

struct clk *clk_get(struct device *dev, const char *con_id)
{
 const char *dev_id = dev ? dev_name(dev) : NULL;
 struct clk *clk;

 if (dev) {
  //通过扫描所有“clock-names”中的值,和传入的name比较,如果相同,获得它的index(即“clock-names”中的

第几个),调用of_clk_get,取得clock指针。
  clk = __of_clk_get_by_name(dev->of_node, dev_id, con_id);
  if (!IS_ERR(clk) || PTR_ERR(clk) == -EPROBE_DEFER)
   return clk;
 }

 return clk_get_sys(dev_id, con_id);
}
struct clk *of_clk_get(struct device_node *np, int index)
{
        struct of_phandle_args clkspec;
        struct clk *clk;
        int rc;
 
        if (index return ERR_PTR(-EINVAL);
 
        rc = of_parse_phandle_with_args(np, "clocks", "#clock-cells", index,
                                        &clkspec);
        if (rc)
                return ERR_PTR(rc);
       //获取clock指针
        clk = of_clk_get_from_provider(&clkspec);
        of_node_put(clkspec.np);
        return clk;
}

of_clk_get_from_provider 通过便利 of_clk_providers 链表,并调用每一个 provider 的 get 回调函数,获取 clock 指针。如下:

struct clk *of_clk_get_from_provider(struct of_phandle_args *clkspec)
{
        struct of_clk_provider *provider;
        struct clk *clk = ERR_PTR(-ENOENT);
 
        /* Check if we have such a provider in our array */
        mutex_lock(&of_clk_lock);
        list_for_each_entry(provider, &of_clk_providers, link) {
                if (provider->node == clkspec->np)
                        clk = provider->get(clkspec, provider->data);
                if (!IS_ERR(clk))
                        break;
        }
        mutex_unlock(&of_clk_lock);
 
        return clk;
}

至此,ConsumerProvider 里讲的 of_clk_add_provider 对应起来了。

操作 clock

//启动clock前的准备工作/停止clock后的善后工作。可能会睡眠。
int clk_prepare(struct clk *clk)
void clk_unprepare(struct clk *clk)
 
//启动/停止clock。不会睡眠。
static inline int clk_enable(struct clk *clk)
static inline void clk_disable(struct clk *clk)

//clock频率的获取和设置
static inline unsigned long clk_get_rate(struct 
clk *clk)
static inline int clk_set_rate(struct clk *clk, unsigned long rate)
static inline long clk_round_rate(struct clk *clk, unsigned long rate)

//获取/选择clock的parent clock
static inline int clk_set_parent(struct clk *clk, struct clk *parent)
static inline struct clk *clk_get_parent(struct clk *clk)
 
//将clk_prepare和clk_enable组合起来,一起调用。将clk_disable和clk_unprepare组合起来,一起调用
static inline int clk_prepare_enable(struct clk *clk)
static inline void clk_disable_unprepare(struct clk *clk)

总结

一文搞懂 | Linux 时钟子系统

以上が1 つの記事で理解 | Linux クロック サブシステムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は良许Linux教程网で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Linuxで倫理的ハッキングを習得するための必須ツールとフレームワークLinuxで倫理的ハッキングを習得するための必須ツールとフレームワークApr 11, 2025 am 09:11 AM

はじめに:Linuxベースの倫理的ハッキングでデジタルフロンティアを保護します ますます相互に接続されている世界では、サイバーセキュリティが最重要です。 倫理的なハッキングと浸透テストは、脆弱性を積極的に特定し、緩和するために不可欠です

Linuxの基本を学ぶ方法は?Linuxの基本を学ぶ方法は?Apr 10, 2025 am 09:32 AM

基本的なLinux学習の方法は次のとおりです。1。ファイルシステムとコマンドラインインターフェイス、2。LS、CD、MKDIR、3。ファイルの作成と編集などのファイル操作を学習するマスター基本コマンド、4。

Linuxの最も使用は何ですか?Linuxの最も使用は何ですか?Apr 09, 2025 am 12:02 AM

Linuxは、サーバー、組み込みシステム、デスクトップ環境で広く使用されています。 1)サーバーフィールドでは、Linuxは、その安定性とセキュリティにより、Webサイト、データベース、アプリケーションをホストするための理想的な選択肢となっています。 2)埋め込みシステムでは、Linuxは高いカスタマイズと効率で人気があります。 3)デスクトップ環境では、Linuxはさまざまなユーザーのニーズを満たすために、さまざまなデスクトップ環境を提供します。

Linuxの欠点は何ですか?Linuxの欠点は何ですか?Apr 08, 2025 am 12:01 AM

Linuxの欠点には、ユーザーエクスペリエンス、ソフトウェア互換性、ハードウェアサポート、学習曲線が含まれます。 1.ユーザーエクスペリエンスは、WindowsやMacOほどフレンドリーではなく、コマンドラインインターフェイスに依存しています。 2。ソフトウェアの互換性は他のシステムほど良くなく、多くの商用ソフトウェアのネイティブバージョンがありません。 3.ハードウェアサポートはWindowsほど包括的ではなく、ドライバーは手動でコンパイルされる場合があります。 4.学習曲線は急で、コマンドラインの操作をマスターするには時間と忍耐が必要です。

Linuxは学ぶのが難しいですか?Linuxは学ぶのが難しいですか?Apr 07, 2025 am 12:01 AM

linuxisnothardtolearn、butthedifficultydependsonyourbackgroundandgoals.forthosewithosexperience、特にcommand-llinefamparsition、linuxisaneasyytransition.beginnersmayteeper relearningcurvebutcanagewithpersources.linux'sopen-sourcenature

Linuxの5つの基本コンポーネントは何ですか?Linuxの5つの基本コンポーネントは何ですか?Apr 06, 2025 am 12:05 AM

Linuxの5つの基本コンポーネントは次のとおりです。1。カーネル、ハードウェアリソースの管理。 2。機能とサービスを提供するシステムライブラリ。 3.シェル、ユーザーがシステムと対話するインターフェイス。 4.ファイルシステム、データの保存と整理。 5。アプリケーション、システムリソースを使用して機能を実装します。

Ubuntu Home Automation:オープンソースツールを使用してスマートリビングスペースを構築するUbuntu Home Automation:オープンソースツールを使用してスマートリビングスペースを構築するApr 05, 2025 am 09:19 AM

スマートホームで新しい章を開く:Ubuntuに基づくオープンソースホームオートメーションシステム Smart Home Technologyは、私たちが生きている空間との対話方法に革命をもたらし、利便性、安全性、エネルギー効率を日常生活にもたらしました。ライトや電化製品のリモートコントロールから、セキュリティカメラや自動気候制御の監視に至るまで、スマートホームテクノロジーはますます人気が高まっています。 ただし、多くのビジネススマートホームシステムには、高コスト、プライバシーの問題、互換性が限られているという制限があります。幸いなことに、オープンソースソフトウェアソリューションは、Ubuntuの力を組み合わせて代替手段を提供します。これにより、ユーザーはカスタマイズ可能で費用対効果が高く、安全なスマートホームエコシステムを作成できます。 このガイドでは、Ubuntuとオープンソースツールを使用してホームオートメーションシステムをセットアップする方法について説明します。

Linux vs. Windows:2025年の違いは何ですか?Linux vs. Windows:2025年の違いは何ですか?Apr 05, 2025 am 09:05 AM

Linux vs. Windows:2025比較 MacosまたはWindowsからの切り替えを考えていますか? Linuxが答えかもしれません。 MACOSユーザーは(MacOSのUNIXコアのため)比較的スムーズな移行を見つけるでしょうが、Windowsユーザーは適応する必要があります。このガイドヒグ

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター