Kompilasi oleh : Reza Ervani bin Asmanu
Pendahuluan
Dalam manajemen Input/Output pada arsitektur BCM2835, mekanisme untuk menyalakan (Set) dan mematikan (Clear) sinyal GPIO dipisahkan ke dalam register yang berbeda. Setelah memahami lokasi register GPSET0 pada offset 0x1C, langkah krusial berikutnya adalah memetakan lokasi register komplementernya, yaitu GPCLR0.
Dalam definisi kode driver, register GPCLR0 dipetakan pada offset 0x28. Secara sekilas, terdapat jarak yang cukup jauh (12 byte) dari register GPSET0. Artikel ini akan menguraikan peta memori yang menjembatani jarak antara 0x1C dan 0x28 tersebut.
1. Kontinuitas Register SET (Offset 0x20)
Seperti halnya register GPFSEL, register kontrol output (GPSET) juga mengalami segmentasi karena keterbatasan arsitektur 32-bit. Satu register tidak dapat menampung instruksi untuk total 54 jalur GPIO.
Oleh karena itu, tepat setelah blok memori GPSET0 (Bank 0), terdapat blok memori untuk Bank 1:
- GPSET0 (Offset
0x1C): Mengendalikan output GPIO 0 – 31. - GPSET1 (Offset
0x20): Mengendalikan output GPIO 32 – 53.
Secara matematis:
0x1C (Base GPSET0) + 0x04 (32-bit offset) = 0x20.
2. Blok Memori Cadangan (Reserved Space di 0x24)
Setelah register GPSET1, arsitektur Broadcom kembali menyisipkan satu blok memori kosong (gap). Alamat offset 0x24 berstatus Reserved.
Blok ini tidak memiliki fungsi kontrol yang didokumentasikan untuk pengguna umum. Pointer memori harus melewati alamat ini untuk mencapai blok fungsional berikutnya.
Secara matematis:
0x20 (Base GPSET1) + 0x04 (32-bit offset) = 0x24.
3. Lokasi GPCLR0 (Offset 0x28)
Setelah melewati blok Reserved, kita mencapai area memori yang didedikasikan untuk fungsi Output Clear (Mematikan Sinyal/Logika Low). Sama seperti fungsi SET, fungsi CLEAR juga dibagi menjadi dua bank.
Register pertama, GPCLR0, yang mengendalikan GPIO 0 hingga 31, berada tepat setelah blok Reserved.
Secara matematis:
0x24 (Reserved) + 0x04 (32-bit offset) = 0x28.
Rangkuman Peta Memori
Untuk memberikan visualisasi yang jelas mengenai tata letak register kontrol output, berikut adalah tabel urutannya:
| Urutan | Nama Register | Offset (Hex) | Deskripsi Fungsi |
| 8 | GPSET0 | 0x1C | Menyalakan (Set High) GPIO 0 – 31 |
| 9 | GPSET1 | 0x20 | Menyalakan (Set High) GPIO 32 – 53 |
| 10 | (Reserved) | 0x24 | JEDA MEMORI (KOSONG) |
| 11 | GPCLR0 | 0x28 | Mematikan (Set Low) GPIO 0 – 31 |
| 12 | GPCLR1 | 0x2C | Mematikan (Set Low) GPIO 32 – 53 |
Signifikansi Akurasi Pengalamatan
Pemahaman terhadap urutan ini memvalidasi definisi pointer dalam kode C berikut:
volatile uint32_t* const GPCLR0 = (volatile uint32_t*)(GPIO_BASE + 0x28);
Angka 0x28 adalah hasil kalkulasi presisi yang memperhitungkan keberadaan register tetangga (GPSET1) dan celah memori (Reserved).
Kesalahan dalam menentukan offset ini memiliki risiko teknis yang tinggi. Sebagai contoh, jika seorang pengembang berasumsi bahwa GPCLR0 berada tepat setelah GPSET0 (di 0x20), maka instruksi untuk “mematikan GPIO 16” (menulis bit ke register 0x20) justru akan diterjemahkan oleh sistem sebagai instruksi untuk “menyalakan GPIO 48” (karena 0x20 adalah GPSET1).
Dalam pemrograman bare metal, akurasi alamat memori adalah fondasi utama kestabilan sistem.
