私は元のブログ/コードの作成者です。ここに私が意味するものがあります:
あなたの要点に答えるために、pinconf[0x2168/4] はアドレス 0x48002168 を参照します。pinconf 配列は、アドレス 0x48000000 から始まります。ulong [1] として定義されており、ARM プロセッサでは 4 バイトです。アドレス pinconf+0x2168 にアクセスしたいことはわかっています。アドレス 0x2168 を pinconf のインデックスに変換するには、4 で割る必要があります。
最初からコードを見ていきます。
volatile ulong *pinconf;
pinconf は ulong (32 ビット int) ポインターとして定義されます。揮発性として定義されています。これは、コードの外部にある何かがその値を変更する可能性があることを意味します。その値を使用するたびにメモリから読み取る必要があることをコンパイラーに伝えます。これにより、コンパイラーは物事を台無しにする可能性のある巧妙な最適化を停止します。
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
これにより、pinconf がアドレス 0x48000000 を指すように設定されます。通常、次のようなことができます。
pinconf = (ulong*) 0x48000000;
pinconf がアドレスを指すようにしますが、これは機能しません。0x48000000 は保護されたアドレスで、カーネルからのみアクセスできます。mmap マジックは、ユーザー空間からアドレスにアクセスする方法を提供します。
pinconf[0x2168/4] = 0x001C001C;
これについては既に説明しましたが、これはアドレス 0x48000000+0x2168 に値を書き込んでいます。値 0x48002168 は OMAP3 データシートから取得され、GPIO システムでメモリ マップド IO を実行するために使用されます。4 で割り、アドレス 0x2168 を pinconf のインデックスに変換します。
[1] 正直に言うと、おそらく uint32_t を使用するべきでした。