Oleh: Reza Ervani bin Asmanu
Dalam pengembangan sistem operasi Bare Metal pada Raspberry Pi 1 (SoC BCM2835), pemahaman mendalam mengenai General Purpose Input/Output (GPIO) adalah fundamental. Berbeda dengan pemrograman tingkat tinggi yang menggunakan pustaka abstrak, pemrograman kernel menuntut kita untuk berinteraksi langsung dengan memori fisik.
Pada BCM2835, GPIO dikendalikan melalui serangkaian register 32-bit yang dipetakan pada Physical Base Address 0x20200000. Angka ini didapat dari Base Address Periferal 0x20000000 ditambah offset GPIO 0x200000.
Berikut adalah bedah anatomi register GPIO yang dikategorikan berdasarkan peran fungsionalnya.
1. Register Konfigurasi: GPFSELn (Function Select)
- Offset: 0x00 s.d. 0x14
- Peran: Manajer Peran
Register ini bertugas menentukan identitas dan fungsi yang diemban oleh sebuah jalur GPIO. Mengingat arsitektur BCM2835 mendukung multiplexing, satu GPIO tidak hanya bisa menjadi Input atau Output, tetapi juga bisa beralih fungsi menjadi jalur I2C, SPI, atau UART.
- Struktur Memori: 3-bit per GPIO.
- Kapasitas: Satu register 32-bit mengelola 10 GPIO (30 bit terpakai, 2 bit reserved).
- Contoh: GPFSEL0 mengatur GPIO 0-9, GPFSEL1 mengatur GPIO 10-19.
- Logika Nilai:
- 000 = Input (Default)
- 001 = Output
- 100 = Alternate Function 0 (misal: TX/RX untuk UART pada GPIO 14/15)
2. Register Eksekusi: GPSETn & GPCLRn (Output Control)
- Offset: 0x1C (SET) dan 0x28 (CLR) — untuk Bank 0 (GPIO 0-31)
- Peran: Saklar Aksi Atomik
Kelompok register ini tugasnya sangat sederhana: mengubah tegangan listrik pada GPIO yang sudah dikonfigurasi menjadi Output. Di sini, sistem tidak lagi peduli tentang “apa peran GPIO ini”, melainkan hanya peduli “apakah GPIO ini harus dinyalakan atau dimatikan”.
Pemisahan antara register Set (Nyalakan) dan Clear (Matikan) bertujuan untuk efisiensi dan keamanan concurrency. Kita bisa mengubah status satu GPIO tanpa perlu membaca status GPIO lainnya (menghindari operasi Read-Modify-Write yang lambat dan berisiko).
- Mekanisme:
- GPSETn: Menulis angka 1 pada bit ke-n akan membuat GPIO n menjadi HIGH (3.3V). Menulis 0 tidak berefek apa-apa.
- GPCLRn: Menulis angka 1 pada bit ke-n akan membuat GPIO n menjadi LOW (0V/Ground). Menulis 0 tidak berefek apa-apa.
3. Register Observasi: GPLEVn (Pin Level)
- Offset: 0x34
- Peran: Pengamat Real-time
Register ini berfungsi melaporkan status tegangan aktual yang ada di kaki GPIO saat ini juga. Sifatnya Read-Only. Ini sangat krusial ketika GPIO dikonfigurasi sebagai Input (misalnya membaca status tombol atau sensor). GPLEV tidak peduli apakah tegangan itu berasal dari internal CPU atau dari sirkuit luar, ia hanya melaporkan apa yang ia lihat.
- Logika:
- Bit bernilai 1: Terdeteksi tegangan tinggi (HIGH).
- Bit bernilai 0: Terdeteksi tegangan rendah (LOW).
4. Register Kejadian: GPEDS, GPREN, GPFEN (Event Detect)
- Offset: 0x40 (EDS), 0x4C (REN), 0x58 (FEN)
- Peran: Sistem Peringatan Dini (Trigger & Latch)
Berbeda dengan GPLEV yang hanya melihat kondisi “sekarang”, kelompok register ini bertugas menangkap “perubahan” atau peristiwa (event) untuk kebutuhan interrupt.
A. Pemicu (Trigger) – GPREN & GPFEN
- GPREN (Rising Edge): Memicu peringatan jika sinyal berubah dari 0 ke 1 (misal: tombol dilepas).
- GPFEN (Falling Edge): Memicu peringatan jika sinyal berubah dari 1 ke 0 (misal: tombol ditekan).
B. Pelapor (Status Latch) – GPEDS
- Setelah pemicu aktif, GPEDS akan mencatat kejadian tersebut dengan mengubah bit menjadi 1.
- Sifat Sticky: Sekali bit menjadi 1, ia akan tetap 1 meskipun sinyal input sudah kembali normal, sampai CPU secara manual membersihkannya.
- Cara Membersihkan: Menulis angka 1 pada bit yang menyala di GPEDS akan menghapus status kejadian tersebut (Write 1 to Clear).
5. Register Stabilitas: GPPUD & GPPUDCLK (Pull-up/Pull-down)
- Offset: 0x94 (PUD) dan 0x98 (Clock)
- Peran: Penstabil Sinyal & Penguncinya
Register ini mengaktifkan resistor internal untuk menarik sinyal ke tegangan positif (Pull-up) atau ke Ground (Pull-down) agar GPIO tidak floating (mengambang) saat tidak ada sinyal aktif.
Mekanisme pada BCM2835 unik karena memerlukan urutan waktu dan bantuan register “Clock” (GPPUDCLK) untuk menerapkannya:
- Tulis mode ke GPPUD (0=Off, 1=Pull-Down, 2=Pull-Up).
- Delay 150 siklus clock (memberi waktu sinyal kontrol stabil).
- Tulis ke GPPUDCLK0 (bitmask GPIO yang dituju) untuk “mengunci” sinyal tersebut ke pad fisik.
- Delay 150 siklus clock.
- Bersihkan GPPUD (tulis 0).
- Bersihkan GPPUDCLK0 (tulis 0).
Rangkuman Peta Memori (Valid BCM2835)
| Register | Offset | Fungsi (Analogi) | Akses |
| GPFSELn | 0x00 | Manajer Peran (Mode GPIO) | R/W |
| GPSETn | 0x1C | Saklar Nyala (Set Output High) | W |
| GPCLRn | 0x28 | Saklar Mati (Set Output Low) | W |
| GPLEVn | 0x34 | Pengamat (Baca Status GPIO) | R |
| GPEDSn | 0x40 | Pelapor (Status Kejadian) | R/W (Clear) |
| GPREN/FEN | 0x4C/58 | Pemicu (Deteksi Perubahan) | R/W |
| GPPUD | 0x94 | Penstabil (Pilih Jenis Resistor) | R/W |
| GPPUDCLK | 0x98 | Pengunci (Terapkan ke GPIO) | W |
Dokumentasi ini disusun sebagai bagian dari materi pembelajaran Bare Metal Programming di Reza Ervani Institute.
