LinuxユーザースペースからHWレジスターへの読み取り(および書き込み)に苦労しています。目標は、いくつかのGPIOピンを構成し、このピンを設定して読み取ることができるようにすることです。
プロセッサ(Freescaleのimx27)の仕様によると、GPIOを制御するレジスタバンクの物理アドレスは0x10015000です。
私の仮定は、次のようなものを使用できるというものでした。
unsigned long *gpio;
fd = open("/dev/mem", O_RDWR);
gpio = (unsigned long *) mmap(0, getpagesize(), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x10015000);
これで、プロセッサのレジスタにデータを読み取って設定できるようになると期待していました。問題は、私がどの場所を読んだかは問題ではなく、常に0になることです。
たとえば、物理的な場所0x10015220のレジスタには、GPIOとして使用されているピンを示すレジスタが含まれています。これはデフォルトで0xFFFFFFFFになります。このレジスタを読むと、0とは異なるものが得られると期待していました。
printf("PTC_GIUS: 0x%08lX\n", gpio[0x220]);
与えるPTC_GIUS: 0x00000000
。
どこが間違っているのですか?