Dalam pengembangan kernel bare metal pada Raspberry Pi (chipset Broadcom BCM2835), setiap pin GPIO memiliki kemampuan multiplexing. Artinya, satu pin fisik tidak hanya berfungsi sebagai saklar listrik sederhana (Nyala/Mati), tetapi dapat dialihfungsikan menjadi jalur komunikasi khusus seperti I2C, SPI, UART, atau PWM.
Pengaturan fungsi ini dikendalikan oleh register GPFSELn (GPIO Function Select). Karena setiap pin memiliki 8 kemungkinan mode operasi, arsitektur ini mengalokasikan 3 bit untuk setiap pin guna menampung kode konfigurasi tersebut ($2^3 = 8$ kombinasi).
Berikut adalah tabel lengkap kode biner yang digunakan untuk mengatur mode operasi pada register GPFSEL.
Tabel Kode Fungsi GPIO (FSEL)
| Kode Biner (3-bit) | Nilai Desimal | Mode Operasi | Deskripsi Teknis |
| 000 | 0 | Input | Mode Default. Pin dalam keadaan High Impedance (Hi-Z). Digunakan untuk membaca sensor atau mendeteksi tegangan. |
| 001 | 1 | Output | Mode Aktif. Pin dikendalikan sepenuhnya oleh register GPSET dan GPCLR. Digunakan untuk menyalakan LED, relay, atau mengirim sinyal logika. |
| 100 | 4 | Alternate Function 0 | Fungsi alternatif prioritas pertama (Contoh: UART TX/RX pada GPIO 14/15, I2C pada GPIO 2/3). |
| 101 | 5 | Alternate Function 1 | Fungsi alternatif kedua (Contoh: Jalur SPI pada beberapa pin). |
| 110 | 6 | Alternate Function 2 | Fungsi alternatif ketiga (Sering digunakan untuk fungsi legacy atau periferal sekunder). |
| 111 | 7 | Alternate Function 3 | Fungsi alternatif keempat. |
| 011 | 3 | Alternate Function 4 | Fungsi alternatif kelima. |
| 010 | 2 | Alternate Function 5 | Fungsi alternatif keenam (Contoh: PWM pada GPIO 18 biasanya menggunakan Alt 5). |
Catatan Penting: Urutan nilai desimal untuk Alternate Functions tidak berurut secara linear (0, 1, 2, 3…). Perhatikan bahwa Alt 4 bernilai
011(3) dan Alt 5 bernilai010(2). Kesalahan dalam menentukan kode biner ini dapat menyebabkan pin terhubung ke periferal yang salah.
Analisis Implementasi: Kasus GPIO 16
Untuk memahami penerapan tabel di atas, mari kita bedah kasus konfigurasi GPIO 16 menjadi mode Output.
- Lokasi Register:GPIO 16 diatur oleh register GPFSEL1 (yang menangani GPIO 10 s.d. 19).
- Lokasi Bit (Kavling):Di dalam GPFSEL1, GPIO 16 menempati bit ke-18, 19, dan 20.
- Bit 20 (MSB)
- Bit 19
- Bit 18 (LSB)
- Target Mode:Berdasarkan tabel, mode Output memiliki kode biner 001.
Maka, kita harus memetakan kode 001 ke dalam posisi bit tersebut:
| Bit Register | 20 | 19 | 18 |
| Nilai Target | 0 | 0 | 1 |
Inilah alasan matematis di balik instruksi bahasa C yang kita gunakan:
// Membersihkan konfigurasi lama (Reset ke 000)
*GPFSEL1 &= ~(7 << 18);
// Mengisi dengan konfigurasi Output (Set ke 001)
*GPFSEL1 |= (1 << 18);
Operasi (1 << 18) secara spesifik mengirimkan angka 1 (dari kode 001) tepat ke posisi Bit 18, sehingga register mengenali permintaan mode Output untuk GPIO 16. Jika kita ingin menggunakan Alternate Function 0 (Kode 100), maka operasinya akan berubah menjadi (4 << 18) atau (1 << 20).
