Nios® V プロセッサー・ソフトウェア開発者ハンドブック

ID 743810
日付 7/08/2024
Public
ドキュメント目次

8.6. ハードウェアへのアクセス

ソフトウェアは、デバイスへのメモリー・マップド・インターフェイスを抽象化する定義済みマクロを使用してハードウェアにアクセスします。このセクションでは、各デバイスのハードウェア・インターフェイスを定義するマクロについて説明します。

すべてのコンポーネントは、デバイスのハードウェアとソフトウェアを定義するディレクトリーを提供します。たとえば、 Quartus® Prime ソフトウェアで提供される各コンポーネントは、<Intel Quartus Prime installation>/ip/altera/ ディレクトリー内に独自のディレクトリーを持っています。多くのコンポーネントは、ハードウェア・インターフェイスを定義するヘッダーファイルを提供します。ヘッダーファイルの名前は <component name>_regs.h で、特定のコンポーネントの inc サブディレクトリーに含まれています。たとえば、インテルが提供する JTAG UART コンポーネントは、ファイルの <Intel Quartus Primeinstallation>/ip/altera/sopc_builder_ip/altera_avalon_jtag_uart/inc/altera_avalon_jtag_uart_regs.h でハードウェア・インターフェイスを定義します。

_regs.h ヘッダーファイルは、コンポーネントの次のアクセスマクロを定義します。

  • 操作をサポートするコンポーネント内の各レジスターに対して、読み取りマクロまたは書き込みマクロのいずれかまたは両方を提供するレジスター・アクセス・マクロです。マクロは次のとおりです。
    • IORD_ <component name>_<register name> (<component base address>)
    • IOWR_ <component name>_<register name> (<component base address>, <data>)

      例えば、altera_avalon_jtag_uart_regs.h は次のマクロを定義します。

    • IORD_ALTERA_AVALON_JTAG_UART_DATA()
    • IOWR_ALTERA_AVALON_JTAG_UART_DATA()
    • IORD_ALTERA_AVALON_JTAG_UART_CONTROL()
    • IOWR_ALTERA_AVALON_JTAG_UART_CONTROL()
  • コンポーネント内の各レジスターの物理アドレスを返すレジスター・アドレス・マクロです。返されるアドレスレジスターは、コンポーネントのベースアドレス + 指定されたレジスターオフセット値です。これらのマクロの名前は、IOADDR_<component name>_<register name> (<component base address>) です。

    例えば、altera_avalon_jtag_uart_regs.h は、次のマクロを定義します。

    • IOADDR_ALTERA_AVALON_JTAG_UART_DATA()
    • IOADDR_ALTERA_AVALON_JTAG_UART_CONTROL()

      これらのマクロは、データソースまたは宛先の特定のアドレスを必要とする関数へのパラメーターとしてのみ使用してください。たとえば、コンポーネント内の特定のソースレジスターからデータストリームを読み取るルーチンでは、パラメーターとしてレジスターの物理アドレスが必要になる場合があります。

  • レジスター内の個々のビットフィールドへのアクセスを提供するビット・フィールド・マスクとオフセットです。これらのマクロには次の名前が付いています。
    • <component name>_<register name>_<name of field>_MSK — フィールドのビットマスクです。
    • <component name>_<register name>_<name of field>_OFST — フィールドの開始のビットオフセットです。

      たとえば、ALTERA_AVALON_UART_STATUS_PE_MSKALTERA_AVALON_UART_STATUS_PE_OFST は、ステータスレジスターの pe フィールドにアクセスします。

_regs.h ファイルで定義されたマクロのみを使用して、デバイスのレジスターにアクセスします。レジスターアクセス関数を使用して、デバイスの読み取りまたは書き込み時にプロセッサーがデータキャッシュ (存在する場合) をバイパスするようにします。ハードコードされた定数は使用しないでください。このような定数を使用すると、ソフトウェアが基盤となるハードウェアの変更の影響を受けやすくなります。

まったく新しいハードウェア・デバイス用のドライバーを記述する場合は、_regs.h ヘッダーファイルを準備する必要があります。

_regs.h ファイルの完全な例の詳細については、<Intel Quartus Prime installation>/ip/sopc_builder_ip/altera_avalon_jtag_uart/inc などのインテルが提供するコンポーネントのコンポーネント・ディレクトリーを参照してください。