{"id":39875935,"url":"https://github.com/ikwzm/fclkcfg","last_synced_at":"2026-01-18T14:24:41.897Z","repository":{"id":146257606,"uuid":"55664763","full_name":"ikwzm/fclkcfg","owner":"ikwzm","description":"FPGA Clock Configuration Device Driver for Linux","archived":false,"fork":false,"pushed_at":"2025-12-04T03:50:09.000Z","size":598,"stargazers_count":31,"open_issues_count":1,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-12-22T20:06:09.204Z","etag":null,"topics":["clock","fpga","fpga-soc-linux","linux-drivers"],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ikwzm.png","metadata":{"files":{"readme":"Readme.jp.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-04-07T04:56:47.000Z","updated_at":"2025-12-04T03:49:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"f99bf534-bdaf-4a00-8f3c-afa0f565e593","html_url":"https://github.com/ikwzm/fclkcfg","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/ikwzm/fclkcfg","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwzm%2Ffclkcfg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwzm%2Ffclkcfg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwzm%2Ffclkcfg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwzm%2Ffclkcfg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ikwzm","download_url":"https://codeload.github.com/ikwzm/fclkcfg/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ikwzm%2Ffclkcfg/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28537549,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T13:04:05.990Z","status":"ssl_error","status_checked_at":"2026-01-18T13:01:44.092Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clock","fpga","fpga-soc-linux","linux-drivers"],"created_at":"2026-01-18T14:24:41.777Z","updated_at":"2026-01-18T14:24:41.882Z","avatar_url":"https://github.com/ikwzm.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"FPGA Clock Configuration Device Driver\n======================================\n\n# はじめに\n\n\n\n## fclkcfg とは\n\n\nfclkcfg は FPGA Clock Configuration Device Driver で、ユーザー空間から Zynq/Zynq UltraScale+ の PL(Plogrammable Logic) のクロックの周波数を変更および出力を制御するデバイスドライバです。\n\n\n## 構成\n\n\nfclkcfg はLinux Kernel が本来持っている clk ドライバを、ユーザー空間から制御できるようにします。\n\n\n![Fig.1 fclkcfg の位置づけ](./fclkcfg1.jpg \"Fig.1 fclkcfg の位置づけ\")\n\nFig.1 fclkcfg の位置づけ\n\n\u003cbr /\u003e\n\n\n## 対応プラットフォーム\n\n\n\n\n*  OS: Linux Kernel Version 4.4.4 以降\n*  CPU: ARM(Zynq-7000), ARM64(Zynq UltraScale+)\n\n現在(2016年4月8日)、Altera-SoC で動作確認中ですがまだ動いていません。\n\n\n# インストール\n\n\n\n## ビルド\n\n\nMakefile を用意しています。環境にあわせて適当に修正してください。\n\n\n## インストール\n\n\ninsmod で fclkcfg のカーネルドライバをロードします。その際 Device Tree の設定に従いデバイスドライバができます。Device Tree に関しては後述します。\n\n\n```console\nzynq# insmod fclkcfg.ko\n[  102.044387] fclkcfg amba:fclk0: driver installed.\n[  102.049016] fclkcfg amba:fclk0: device name   : fclk0\n[  102.053949] fclkcfg amba:fclk0: clock  name   : fclk0\n[  102.058748] fclkcfg amba:fclk0: clock  rate   : 100000000\n[  102.058748] fclkcfg amba:fclk0: clock  enable : 1\n\n```\n\n\n\n## アンインストール\n\n\nアンインストールするには rmmod を使います。\n\n\n```console\nzynq# rmmod fclkcfg\n[  261.514039] fclkcfg amba:fclk0: driver unloaded\n```\n\n## Debian Package によるインストール\n\n詳しくは以下の URL を参照してください。\n\n*  https://github.com/ikwzm/fclkcfg-kmod-dpkg\n\n# デバイスツリー\n\n\nfclkcfg はデバイスツリーでクロックの設定をします。具体的には次のようなデバイスツリーを用意します。\n\n\n```devicetree:devicetree.dts\n\t\tfclk0 {\n\t\t\tcompatible    = \"ikwzm,fclkcfg\";\n\t\t\tdevice-name   = \"fpga-clk0\";\n\t\t\tclocks        = \u003c\u0026clkc 15\u003e, \u003c\u0026clkc 2\u003e;\n\t\t\tinsert-rate   = \"100000000\";\n\t\t\tinsert-enable = \u003c1\u003e;\n\t\t\tremove-rate   = \"1000000\";\n\t\t\tremove-enable = \u003c0\u003e;\n\t\t};\n\n```\n\n\n\n\n以下にデバイスツリーのプロパティの説明をします。\n\n\n## compatible プロパティ\n\n\ncompatible プロパティはカーネルモジュールの中から対応するデバイスドライバを探すためのキーワードを示します。fclkcfg では \"ikwzm,fclkcfg-0.10.a\" または \"ikwzm,fclkcfg\" を指定します。compatible プロパティは必須です。(v1.6.0より前は \"ikwzm、fclkcfg-0.10.a\" のみ使えました。 v1.6.0以降では \"ikwzm、fclkcfg\" も使えます。)\n\n\n\n\n## device-name プロパティ\n\n\ndevice-name プロパティはデバイス名を文字列で指定します。device-name プロパティはオプションです。device-name プロパティが省略された場合は、devicetree のノード名(例では fclk0)がデバイス名になります。\n\n\n## clocks プロパティ\n\n\nclocks プロパティの第一引数で制御する PL のクロックを指定します。\n\nclocks プロパティの第二引数以降で PL の リソースのクロックを指定します。\n\nclocks プロパティは必須です。ただし第一引数は必須ですが第二引数以降はオプションです。\n\nclocks プロパティで指定するクロックは、\u003cクロックのハンドル クロックのインデックス\u003e で指定します。例えば Zynq の場合、次のようにデバイスツリーでクロックが指定されています。\n\n\n```devicetree:zynq-7000.dtsi\n/dts-v1/;\n\t\t:\n\t      (中略)\n\t\t:\n\t\tslcr: slcr@f8000000 {\n\t\t\t#address-cells = \u003c1\u003e;\n\t\t\t#size-cells = \u003c1\u003e;\n\t\t\tcompatible = \"xlnx,zynq-slcr\", \"syscon\", \"simple-bus\";\n\t\t\treg = \u003c0xF8000000 0x1000\u003e;\n\t\t\tranges;\n\t\t\tclkc: clkc@100 {\n\t\t\t\t#clock-cells = \u003c1\u003e;\n\t\t\t\tcompatible = \"xlnx,ps7-clkc\";\n\t\t\t\tfclk-enable = \u003c0\u003e;\n\t\t\t\tclock-output-names = \"armpll\", \"ddrpll\", \"iopll\", \"cpu_6or4x\",\n\t\t\t\t\t\t\"cpu_3or2x\", \"cpu_2x\", \"cpu_1x\", \"ddr2x\", \"ddr3x\",\n\t\t\t\t\t\t\"dci\", \"lqspi\", \"smc\", \"pcap\", \"gem0\", \"gem1\",\n\t\t\t\t\t\t\"fclk0\", \"fclk1\", \"fclk2\", \"fclk3\", \"can0\", \"can1\",\n\t\t\t\t\t\t\"sdio0\", \"sdio1\", \"uart0\", \"uart1\", \"spi0\", \"spi1\",\n\t\t\t\t\t\t\"dma\", \"usb0_aper\", \"usb1_aper\", \"gem0_aper\",\n\t\t\t\t\t\t\"gem1_aper\", \"sdio0_aper\", \"sdio1_aper\",\n\t\t\t\t\t\t\"spi0_aper\", \"spi1_aper\", \"can0_aper\", \"can1_aper\",\n\t\t\t\t\t\t\"i2c0_aper\", \"i2c1_aper\", \"uart0_aper\", \"uart1_aper\",\n\t\t\t\t\t\t\"gpio_aper\", \"lqspi_aper\", \"smc_aper\", \"swdt\",\n\t\t\t\t\t\t\"dbg_trc\", \"dbg_apb\";\n\t\t\t\treg = \u003c0x100 0x100\u003e;\n\t\t\t};\n\t\t:\n\t      (中略)\n\t\t:\n\n```\n\n\n\n\nこのデバイスツリーではクロックの設定は slcr(System Level Control Register) の clkc で行うことを示しています。\n\n\n\nclocks = \u003c\u0026clkc 15\u003e; と記述することにより、  clkc が管理しているクロックの15番目のクロック(これが PL Clock 0を指す)を制御することを指定します。\n\n\n\nclocks の第二引数以降で PL の リソースのクロックを指定しています。PL のクロックは、リソースのクロックを分周することにより必要な周波数のクロックを出力しています。clocks の第二引数以降で、PL のリソースのクロックを \"armpll\"、\"ddrpll\"、 \"iopll\" の何れかから選択することができます。\"armpll\" は \u003c\u0026clkc 0\u003e、\"ddrpll\" は \u003c\u0026clkc 1\u003e、\"iopll\" は \u003c\u0026clkc 2\u003e です。\n\nclocks = \u003c\u0026clkc 16\u003e, \u003c\u0026clkc 2\u003e; と記述することにより、clkc が管理している16番目のクロック(これが PL Clock 1を指す)を制御することを指定し、かつ clkc の管理している2番目のクロック(これが \"iopll\" を指す)をリソースクロックとして選択することを指定します。\n\n第二引数が省略された場合は、Linux Kernel の起動時に設定されていたリソースクロックが選択されます。\n\n\n\u0026clkc の代わりに phandle を使って指定することもできます。phandle は デバイスツリーを dtc (Device Tree Compiler) で dtb に変換するときに dtc によって割り当てられる整数値です。例えば dtc によって clkc の phandle が 5 に設定された場合、clocks = \u003c5 15\u003e  と指定する事で PL Clock 0 を制御することが出来ます。\n\n\n\nLinux を起動する時に読み込むデバイスツリーがシンボル情報を含んでいない場合があります。このようなデバイスツリーで起動した Linux の場合、デバイスツリーオーバーレイで使うデバイスツリーに \u0026clkc のようなシンボルは使えません。この場合は次のように clkc の phandle の値を明示的に指定する必要があります。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible  = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks      = \u003c5 15\u003e;\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n### Zynq で指定できる clocks プロパティ\n\nZynq の場合 clocks に指定できるプロパティは次の通りです。\n\nTable.1 Zynq のクロック\n\n| Clock Name  | Index  | Property Value   | Description |\n|-------------|--------|------------------|-------------|\n| armpll      | 0      | \u003c\u0026clkc 0\u003e        | ARMPLL 第二引数でのみ指定可 省略可 |\n| ddrpll      | 1      | \u003c\u0026clkc 1\u003e        | DDRPLL 第二引数でのみ指定可 省略可 |\n| iopll       | 2      | \u003c\u0026clkc 2\u003e        | IOPLL 第二引数でのみ指定可 省略可 |\n| fclk0       | 15     | \u003c\u0026clkc 15\u003e       | PL Clock 0 第一引数でのみ指定可 |\n| fclk1       | 16     | \u003c\u0026clkc 16\u003e       | PL Clock 1 第一引数でのみ指定可 |\n| fclk2       | 17     | \u003c\u0026clkc 17\u003e       | PL Clock 2 第一引数でのみ指定可 |\n| fclk3       | 18     | \u003c\u0026clkc 18\u003e       | PL Clock 3 第一引数でのみ指定可 |\n\n\n### ZynqMP で指定できる clocks プロパティ\n\nZynqMP の場合 clocks に指定できるプロパティは次の通りです。\n\nTable.2 ZynqMP のクロック (linux-xlnx v2018.2)\n\n| Clock Name  | Index  | Property Value   | Description |\n|-------------|--------|------------------|-------------|\n| iopll       | 0      | \u003c\u0026clkc 0\u003e        | IOPLL. 第二引数でのみ指定可 省略可 |\n| rpll        | 1      | \u003c\u0026clkc 1\u003e        | RPLL.  第二引数でのみ指定可 省略可 |\n| dpll_to_lpd | 8      | \u003c\u0026clkc 8\u003e        | DPLL.  第二引数でのみ指定可 省略可 |\n| pl0_ref     | 71     | \u003c\u0026clkc 71\u003e       | PL Clock 0. 第一引数でのみ指定可 |\n| pl1_ref     | 72     | \u003c\u0026clkc 72\u003e       | PL Clock 1. 第一引数でのみ指定可 |\n| pl2_ref     | 73     | \u003c\u0026clkc 73\u003e       | PL Clock 2. 第一引数でのみ指定可 |\n| pl3_ref     | 74     | \u003c\u0026clkc 74\u003e       | PL Clock 3. 第一引数でのみ指定可 |\n\n\nTable.3 ZynqMP のクロック (linux-xlnx v2019.1)\n\n| Clock Name  | Index  | Property Value   | Description |\n|-------------|--------|------------------|-------------|\n| iopll       | 0      | \u003c\u0026zynqmp_clk 0\u003e  | IOPLL. 第二引数でのみ指定可 省略可 |\n| rpll        | 1      | \u003c\u0026zynqmp_clk 1\u003e  | RPLL.  第二引数でのみ指定可 省略可 |\n| dpll_to_lpd | 8      | \u003c\u0026zynqmp_clk 8\u003e  | DPLL.  第二引数でのみ指定可 省略可 |\n| pl0_ref     | 71     | \u003c\u0026zynqmp_clk 71\u003e | PL Clock 0. 第一引数でのみ指定可 |\n| pl1_ref     | 72     | \u003c\u0026zynqmp_clk 72\u003e | PL Clock 1. 第一引数でのみ指定可 |\n| pl2_ref     | 73     | \u003c\u0026zynqmp_clk 73\u003e | PL Clock 2. 第一引数でのみ指定可 |\n| pl3_ref     | 74     | \u003c\u0026zynqmp_clk 74\u003e | PL Clock 3. 第一引数でのみ指定可 |\n\n\n## insert-rate プロパティ\n\n\ninsert-rate プロパティは、このデバイスがインストールされた時に設定する周波数を指定します。設定する周波数は、10進数の文字列で指定します。例えば次のようにデバイスツリーに記述することで、インストール時に周波数を 100MHz に設定します。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;/plugin/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible  = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks      = \u003c\u0026clkc 15\u003e;\n\t\t\t\tinsert-rate = \"100000000\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n\n\n\ninsert-rate プロパティはオプションです。insert-rate プロパティが指定されていない場合、デバイスのインストール時に周波数は変更されません。\n\n\n\n\n## insert-enable プロパティ\n\n\ninsert-enable プロパティは、このデバイスがインストールされた時にクロックを出力するかしないかを指定します。設定する値は、出力する時は\u003c1\u003eを、出力しない時は\u003c0\u003eを指定します。例えば次のようにデバイスツリーに記述することで、インストール時にクロックを出力するようにします。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;/plugin/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible    = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks        = \u003c\u0026clkc 15\u003e;\n\t\t\t\tinsert-enable = \u003c1\u003e;\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n\n\n\ninsert-enable プロパティはオプションです。insert-enable プロパティが指定されていない場合、デバイスのインストール時に出力の制御をしません。\n\n\n\n\n## insert-resource プロパティ\n\n\ninsert-resource プロパティは、このデバイスがインストールされた時に設定されるリソースクロックを指定します。insert-resource プロパティは clocks プロパティに第二引数以降がある場合にのみ効果があります。clocks プロパティが第一引数のみがある場合、リソースクロックは変更されません。\n\ninsert-resource プロパティは整数です。 clocks プロパティの2番目の引数のクロックを指定する時は \u003c0\u003e を、３番目の引数のクロックを指定する場合は \u003c1\u003e を、4番目の引数のクロックを指定する場合は \u003c2\u003e を指定します。\n\n\n\n例えば次のようにデバイスツリーに記述することで、インストール時にリソースクロックを \u003c\u0026clk 1\u003e に設定します。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;/plugin/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible    = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks        = \u003c\u0026clkc 15\u003e, \u003c\u0026clkc 0\u003e, \u003c\u0026clkc 1\u003e, \u003c\u0026clkc 2\u003e;\n\t\t\t\tinsert-resource = \u003c1\u003e;  // \u003c0\u003e: \u003c\u0026clkc 0\u003e, \u003c1\u003e: \u003c\u0026clkc 1\u003e, \u003c2\u003e: \u003c\u0026clkc 2\u003e,\n\t\t\t\tinsert-rate =  \"100000000\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n\n\n\ninsert-resouce プロパティはオプションで、デフォルトは \u003c0\u003e です。この場合、 clocksプロパティが2番目の引数を超える場合、2番目の引数で指定されたクロックがリソースクロックとして設定されます。\n\n\n## remove-rate プロパティ\n\n\nremove-rate プロパティは、このデバイスがリムーブされた時に設定する周波数を指定します。設定する周波数は、10進数の文字列で指定します。例えば次のようにデバイスツリーに記述することで、リムーブ時に周波数を 1MHz に設定します。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;/plugin/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible    = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks        = \u003c\u0026clkc 15\u003e;\n\t\t\t\tremove-rate   = \"1000000\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n\n\n\nremove-rate プロパティはオプションです。remove-rate プロパティが指定されていない場合、デバイスがリムーブされた時に周波数は変更されません。\n\n\n\n\n## remove-enable プロパティ\n\n\nremove-enable プロパティは、このデバイスがリムーブされた時にクロックを出力するかしないかを指定します。設定する値は、出力する時は\u003c1\u003eを、出力しない時は\u003c0\u003eを指定します。例えば次のようにデバイスツリーに記述することで、リムーブ時にクロックの出力を停止します。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;/plugin/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible    = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks        = \u003c\u0026clkc 15\u003e;\n\t\t\t\tremove-enable = \u003c0\u003e;\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n\n\n\nremove-enable プロパティはオプションです。remove-enable プロパティが指定されていない場合、デバイスのリムーブ時に出力の制御をしません。   \n\n\n\n## remove-resource プロパティ\n\n\nremove-resource プロパティは、このデバイスがリムーブされた時のリソースクロックを指定します。remove-resource プロパティは clocks プロパティに第二引数以降がある場合にのみ効果があります。clocks プロパティが第一引数のみがある場合、リソースクロックは変更されません。\n\nremove-resource プロパティは整数です。 clocks プロパティの2番目の引数のクロックを指定する時は \u003c0\u003e を、３番目の引数のクロックを指定する場合は \u003c1\u003e を、4番目の引数のクロックを指定する場合は \u003c2\u003e を指定します。\n\n\n\n例えば次のようにデバイスツリーに記述することで、のデバイスがリムーブされた時にリソースクロックを \u003c\u0026clk 1\u003e に設定します。\n\n\n```devicetree:fclk0-zynq-zybo.dts\n/dts-v1/;/plugin/;\n/ {\n\tfragment@0 {\n\t\ttarget-path = \"/amba\";\n\t\t__overlay__ {\n\t\t\tfclk0 {\n\t\t\t\tcompatible    = \"ikwzm,fclkcfg\";\n\t\t\t\tclocks        = \u003c\u0026clkc 15\u003e, \u003c\u0026clkc 0\u003e, \u003c\u0026clkc 1\u003e, \u003c\u0026clkc 2\u003e;\n\t\t\t\tremove-resource = \u003c1\u003e;  // \u003c0\u003e: \u003c\u0026clkc 0\u003e, \u003c1\u003e: \u003c\u0026clkc 1\u003e, \u003c2\u003e: \u003c\u0026clkc 2\u003e,\n\t\t\t\tremove-rate =  \"100000000\";\n\t\t\t};\n\t\t};\n\t};\n};\n\n```\n\n\n\n\nremove-resouce プロパティはオプションです。省略された場合、このデバイスがリムーブされてもリソースクロックは変更されません。\n\n\n# デバイスファイル\n\n\nfclkcfg をインストールしてデバイスツリーを追加すると、各デバイス毎に次のようなデバイスファイルが作成されます。\\\u003cdevice-name\\\u003e には、前節で説明したデバイス名が入ります。\n\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/enable\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/rate\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/round_rate\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/resource\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/resource_clks\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/remove_rate\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/remove_enable\n  *  /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/remove_resource\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/enable\n\n\nこのファイルに 1 を書くことで、クロックを出力するようにします。  このファイルに 0 を書くことで、クロックを出力しないようにします。このファイルを読むことで、現在クロックを出力しているか否かが判ります。 1 なら出力中を示します。\n\n\n```console\nzynq# echo 1 \u003e /sys/class/fclkcfg/fclk0/enable\nzynq# cat /sys/class/fclkcfg/fclk0/enable\n1\nzynq# echo 0 \u003e /sys/class/fclkcfg/fclk0/enable\nzynq# cat /sys/class/fclkcfg/fclk0/enable\n0\n\n```\n\n\n\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/rate\n\n\nこのファイルに周波数を書くことで、クロックの周波数を変更することができます。例えば次のようにすることで周波数を 100MHz に変更します。\n\n\n```console\nzynq# echo 100000000 \u003e /sys/class/fclkcfg/fclk0/rate\nzynq# cat /sys/class/fclkcfg/fclk0/rate\n100000000\n```\n\n\n\n\nただし、クロックによっては PLL の制限により希望した周波数に設定することが出来ない場合があります。例えば [「U-Boot から Zynq の PLクロックとリセット信号を制御する」](http://qiita.com/ikwzm/items/3253940484591da84777)でも例をあげましたが ZYBO では 133 MHz を設定することが出来ません。強引に設定しようとすると次の様に125MHzに設定されます。\n\n\n```console\nzynq# echo 133333333 \u003e /sys/class/fclkcfg/fclk0/rate\nzynq# cat /sys/class/fclkcfg/fclk0/rate\n125000000\n```\n\n\n\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/round_rate\n\n\n前節で説明した通り、クロックによっては PLL の制限により希望した周波数に設定することが出来ない場合があります。このファイルに周波数を書いて読むことにより、実際にどのような周波数になるかを知ることが出来ます。\n\n\n```console\nzynq# echo 133333333 \u003e /sys/class/fclkcfg/fclk0/round_rate\nzynq# cat /sys/class/fclkcfg/fclk0/round_rate\n133333333 =\u003e 125000000\nzynq# echo  75000000 \u003e /sys/class/fclkcfg/fclk0/round_rate\nzynq# cat /sys/class/fclkcfg/fclk0/round_rate\n75000000 =\u003e 71428572\n```\n\n\n\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/resource\n\n\nこのファイルはリソースクロックを変更するために使用します。次の例ではリソースクロックを1に変更しています。\n\n\n```console\nzynq# echo 1 \u003e /sys/class/fclkcfg/fclk0/resource\nzynq# cat /sys/class/fclkcfg/fclk0/resource\n1\n\n```\n\n\n\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/resource_clks\n\n\nこのファイルを読むことで、リソースクロックとして指定できるクロックの名前を得ることが出来ます。\n\n\n```console\nzynq# cat /sys/class/fclkcfg/fclk0/resource_clks\narmpll, ddrpll, iopll\n\n```\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/remove_rate\n\n\nこのファイルは、クロックデバイスがリムーブされた時に設定する周波数を指定します。\n\n\n```console\nzynq# echo 100000000 \u003e /sys/class/fclkcfg/fclk0/remove_rate\nzynq# cat /sys/class/fclkcfg/fclk0/remove_rate\n100000000\n```\n\n\nこのファイルに負の値を書き込んだ場合、クロックデバイスのリムーブ時に周波数を変更しません。\n\n\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/remove_enable\n\n\nこのファイルは、クロックデバイスがリムーブされた時にクロックを出力するか停止するかを指定します。\n\n１を書き込むとクロックデバイスのリムーブ時にクロックを出力します。\n\n０を書き込むとクロックデバイスのリムーブ時にクロックを出力しません。\n\n−1を書き込むとクロックデバイスのリムーブ時にクロックを制御しません。\n\n\n\n\n## /sys/class/fclkcfg/\\\u003cdevice-name\\\u003e/remove_resource\n\n\nこのファイルは、クロックデバイスがリムーブされた時のリソースクロックを指定します。このファイルは clocks プロパティに第二引数以降がある場合にのみ効果があります。clocks プロパティが第一引数のみがある場合、リソースクロックは変更されません。\n\n0以上の値を書き込むと、クロックデバイスのリムーブ時にリソースクロックを指定されたリソースクロックに変更します。\n\n負の値を書き込むと、クロックデバイスのリムーブ時にリソースクロックを変更しません。\n\n\n# クロックの周波数を安全に変更する\n\n\n\n## 危険な周波数変更の例(PLLの場合)\n\n\nPLL (Phase-Locked Loop) 周波数シンセサイザは、入力クロック信号に対して加減すべき周波数の倍率をデジタル的に設定することで正確な周波数の出力クロック信号を作ります。\n\nPLL はその出力クロック信号をフィードバックして入力クロック信号との位相差を調節することで所望の周波数のクロックを生成します。一般的に位相の調節には多少の時間を要し、その調整期間中、出力されるクロックの周波数は不安定になります。このクロックをそのまま出力してしまうと、そのクロックで動いている回路が誤動作する可能性があります。\n\n\n![Fig.2 ADPLL(All Digital Phase-Locked Loop)](./fclkcfg2.jpg \"Fig.2 ADPLL(All Digital Phase-Locked Loop)\")\n\nFig.2 ADPLL(All Digital Phase-Locked Loop)\n\n\u003cbr /\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## 危険な周波数変更の例(ZynqMPの場合)\n\n\nZynqMP の FPGA クロック生成回路は次のような構造になっています。二つの独立した Divider が連なっているのが特徴です。\n\n\n![Fig.3 ZynqMPのクロック生成回路の構造](./fclkcfg3.jpg \"Fig.3 ZynqMPのクロック生成回路の構造\")\n\nFig.3 ZynqMPのクロック生成回路の構造\n\n\u003cbr /\u003e\n\nしかしながら、個々の Divider を設定する時間にタイムラグが存在すると、意図しない周波数のクロックが出力される可能性があります。\n\n例えば Primary PLL に1500MHz、pl0_division0 に15、Pl0_division1 に 1 が設定されているとします。この場合、出力クロックの周波数は100MHz(=(1500MHz÷15)÷1) です。ここで周波数を250MHz に変更するとします。もし、次の図で示すように、pl0_division0 に１を設定してから pl0_division1 に 6 を設定したとしたら、pl0_divison0 の設定から pl1_division1 の設定までの間、1500MHz のクロックが出力されてしまいます。そして、そのクロックで動いている回路が誤動作する可能性があります。\n\n\n![Fig.4 ZynqMP で意図しない周波数のクロックが出力される例](./fclkcfg4.jpg \"Fig.4 ZynqMP で意図しない周波数のクロックが出力される例\")\n\nFig.4 ZynqMP で意図しない周波数のクロックが出力される例\n\n\u003cbr /\u003e\n\n\n## fclkcfg による安全な周波数変更\n\n\nfclkcfg は周波数を変更する際に、変更する前に一旦クロック出力を停止します。そして、周波数を変更した後にクロックを出力します。このように意図しない周波数のクロックが出力されないようすることで、そのクロックで動いている回路が誤動作するのを防いでいます。\n\n\n![Fig.5 fclkcfg による安全な周波数変更](./fclkcfg5.jpg \"Fig.5 fclkcfg による安全な周波数変更\")\n\nFig.5 fclkcfg による安全な周波数変更\n\n\u003cbr /\u003e\n\n\n# 参考\n\n\n* [FPGA Clock Configuration Device Driver(https://github.com/ikwzm/fclkcfg)](https://github.com/ikwzm/fclkcfg)\n* [fclkcfg kernel module debian package(https://github.com/ikwzm/fclkcfg-kmod-dpkg)](https://github.com/ikwzm/fclkcfg-kmod-dpkg)\n* [「FPGA+SoC+Linuxのブートシーケンス(ZYNQ+U-Boot-SPL編)」 @Qiita](http://qiita.com/ikwzm/items/efacec8d8e0744e17d45)\n* [「U-Boot から Zynq の PLクロックとリセット信号を制御する」 @Qiita](http://qiita.com/ikwzm/items/3253940484591da84777)\n* [「FPGA+SoC+LinuxでDevice Tree Overlayを試してみた」 @Qiita](http://qiita.com/ikwzm/items/ec514e955c16076327ce)   \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikwzm%2Ffclkcfg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fikwzm%2Ffclkcfg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fikwzm%2Ffclkcfg/lists"}