14.11.08

Akses Memori I/O

(bagian 6 dari 7 artikel - ke artikel utama)

Tidak seperti sistem embedded umumnya, mengakses memori I/O di linux tak dapat dilakukan secara langsung. Sebabnya karena Linux mempunyai tipe dan peta memori yang sangat beragam dan Linux dirancang untuk jalan di beragam prosesor. Untuk mengakses memori I/O secara portabel, harus digunakan fungsi ioremap() untuk meminta jatah akses dan fungsi iounmap() untuk melepas jatah akses.

ioremap() didefinisikan sebagai berikut:

void __iomem *ioremap(unsigned long offset, unsigned long size);

Saat memanggil fungsi dua parameter dipassing. Pertama adalah offset awal dari region memori yang akan diakses dan kedua adalah ukuran region dalam byte. Hasil pemanggilan fungsi tidak dapat digunakan sebagai lokasi memori untuk ditulis baca secara langsung. Hasil pemanggilan fungsi itu merupakan token yang harus dipassing ke berbagai fungsi untuk membaca dan menulis data.

Berikut ini adalah fungsi-fungsi yang digunakan untuk membaca dan menulis data menggunakan memori yang teladh dipetakan oleh ioremap():

unsigned char  readb(const volatile void __iomem *addr);  /* read 8 bits */
unsigned short readw(const volatile void __iomem *addr); /* read 16 bits */
unsigned int readl(const volatile void __iomem *addr); /* read 32 bits */
void writeb (unsigned char value, volatile void __iomem *addr); /* write 8 bits */
void writew (unsigned short value, volatile void __iomem *addr); /* write 16 bits */
void writel (unsigned int value, volatile void __iomem *addr); /* write 32 bits */

Setelah memori selesai diakses, fungsi iounmap() harus dipanggil agar yang lain dapat mengakses alamat memori I/O tersebut.

Tidak ada komentar: