デバイスレジスタアクセス

メモリマップされたデバイスレジスタ(I/O)に対して、指定した幅でアクセスするための ヘルパー関数です。ビット単位のセット/クリアやビットフィールドの読み書き、 非キャッシュ領域に対するメモリ操作も提供します。

注釈

これらの関数で渡すアドレスは、I/Oリソースマネージャ 等で 割り付けられた仮想アドレスを使用してください。

API

これらのAPIを使用するには、solid_io.h をインクルードしてください。

#include "solid_io.h"

SOLID_IO_IN8 / IN16 / IN32 / IN64

uint8_t SOLID_IO_IN8(SOLID_ADDRESS addr)
uint16_t SOLID_IO_IN16(SOLID_ADDRESS addr)
uint32_t SOLID_IO_IN32(SOLID_ADDRESS addr)
uint64_t SOLID_IO_IN64(SOLID_ADDRESS addr)

指定したアドレスのデバイスレジスタから、8/16/32/64bit幅で値を読み出します。

パラメータ:
  • addr -- 読み出すデバイスレジスタのアドレス

戻り値:

読み出した値

SOLID_IO_OUT8 / OUT16 / OUT32 / OUT64

void SOLID_IO_OUT8(SOLID_ADDRESS addr, uint8_t val)
void SOLID_IO_OUT16(SOLID_ADDRESS addr, uint16_t val)
void SOLID_IO_OUT32(SOLID_ADDRESS addr, uint32_t val)
void SOLID_IO_OUT64(SOLID_ADDRESS addr, uint64_t val)

指定したアドレスのデバイスレジスタに、8/16/32/64bit幅で値を書き込みます。

パラメータ:
  • addr -- 書き込むデバイスレジスタのアドレス

  • val -- 書き込む値

SOLID_IO_AND8 / AND16 / AND32 / AND64

void SOLID_IO_AND8(SOLID_ADDRESS addr, uint8_t bits)
void SOLID_IO_AND16(SOLID_ADDRESS addr, uint16_t bits)
void SOLID_IO_AND32(SOLID_ADDRESS addr, uint32_t bits)
void SOLID_IO_AND64(SOLID_ADDRESS addr, uint64_t bits)

指定したアドレスのデバイスレジスタの値と bits のビットANDを取り、書き戻します。

パラメータ:
  • addr -- 対象デバイスレジスタのアドレス

  • bits -- ANDするビットマスク

SOLID_IO_OR8 / OR16 / OR32 / OR64

void SOLID_IO_OR8(SOLID_ADDRESS addr, uint8_t bits)
void SOLID_IO_OR16(SOLID_ADDRESS addr, uint16_t bits)
void SOLID_IO_OR32(SOLID_ADDRESS addr, uint32_t bits)
void SOLID_IO_OR64(SOLID_ADDRESS addr, uint64_t bits)

指定したアドレスのデバイスレジスタの値と bits のビットORを取り、書き戻します。

パラメータ:
  • addr -- 対象デバイスレジスタのアドレス

  • bits -- ORするビットマスク

SOLID_IO_CLR8 / CLR16 / CLR32 / CLR64

void SOLID_IO_CLR8(SOLID_ADDRESS addr, uint8_t bits)
void SOLID_IO_CLR16(SOLID_ADDRESS addr, uint16_t bits)
void SOLID_IO_CLR32(SOLID_ADDRESS addr, uint32_t bits)
void SOLID_IO_CLR64(SOLID_ADDRESS addr, uint64_t bits)

指定したアドレスのデバイスレジスタについて、bits で指定したビットをクリア(0に)します。

パラメータ:
  • addr -- 対象デバイスレジスタのアドレス

  • bits -- クリアするビットマスク

SOLID_IO_GETPART32

uint32_t SOLID_IO_GETPART32(SOLID_ADDRESS addr, int offset, int width)

32bitデバイスレジスタから、指定したビットフィールドを読み出します。

パラメータ:
  • addr -- 対象デバイスレジスタのアドレス

  • offset -- フィールドの開始ビット位置

  • width -- フィールドのビット幅

戻り値:

読み出したフィールド値(右詰め)

SOLID_IO_SETPART32

void SOLID_IO_SETPART32(SOLID_ADDRESS addr, uint32_t val, int offset, int width)

32bitデバイスレジスタの指定したビットフィールドのみを書き換えます。

パラメータ:
  • addr -- 対象デバイスレジスタのアドレス

  • val -- 設定する値(右詰め)

  • offset -- フィールドの開始ビット位置

  • width -- フィールドのビット幅

memset_uncached

void *memset_uncached(void *m, int c, size_t n)

非キャッシュ領域に対して memset() 相当の処理を行います。

パラメータ:
  • m -- 書き込む領域の先頭アドレス

  • c -- 設定する値

  • n -- 書き込むサイズ(byte)

戻り値:

m

memcpy_to_uncached

void *memcpy_to_uncached(void *dst, const void *src, size_t len)

非キャッシュ領域への memcpy() 相当の処理を行います。

パラメータ:
  • dst -- コピー先(非キャッシュ領域)の先頭アドレス

  • src -- コピー元の先頭アドレス

  • len -- コピーするサイズ(byte)

戻り値:

dst

memcpy_from_uncached

void *memcpy_from_uncached(void *dst, const void *src, size_t len)

非キャッシュ領域からの memcpy() 相当の処理を行います。

パラメータ:
  • dst -- コピー先の先頭アドレス

  • src -- コピー元(非キャッシュ領域)の先頭アドレス

  • len -- コピーするサイズ(byte)

戻り値:

dst