linux下ioremap的使用


一、头文件

#include <asm/io.h>

二、ioremap函数

/*
 * I/O memory mapping functions.
 */
extern void __iomem *__ioremap(phys_addr_t phys_addr, size_t size, pgprot_t prot);
extern void __iounmap(volatile void __iomem *addr);
extern void __iomem *ioremap_cache(phys_addr_t phys_addr, size_t size);

#define ioremap(addr, size)            __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define ioremap_nocache(addr, size)    __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define ioremap_wc(addr, size)         __ioremap((addr), (size), __pgprot(PROT_NORMAL_NC))
#define ioremap_wt(addr, size)         __ioremap((addr), (size), __pgprot(PROT_DEVICE_nGnRE))
#define iounmap                        __iounmap

1、函数功能:将I/O内存资源的物理地址映射到核心虚地址空间(3GB-4GB)中。

2、addr:要映射的起始的IO地址

     size:要映射的空间的大小

三、应用示例

#include <asm/io.h>


#define SYS_WRITEL(Addr, Value) ((*(volatile unsigned int *)(Addr)) = (Value))
#define SYS_READ(Addr)          (*((volatile int *)(Addr)))


static void  *g_reg_iocfg_base = NULL;


static inline void reg_write32(unsigned long value, unsigned long mask, unsigned long addr)
{
    unsigned long t;

    t = SYS_READ((const volatile void *)(uintptr_t)addr);
    t &= ~mask;
    t |= value & mask;
    SYS_WRITEL((volatile void *)(uintptr_t)addr, t);
}

static void i2c0_pin_mux(void)
{
    /* SDA SCL */
    SYS_WRITEL(g_reg_iocfg_base + 0x0014, 0x1501);
    SYS_WRITEL(g_reg_iocfg_base + 0x0018, 0x1501);
}

static int sysconfig_init(void)
{
    g_reg_iocfg_base = (void*)ioremap(0x170F0000, 0x10000);
    if (g_reg_iocfg_base == NULL) {
        return 1;
    }

    return 0;
}

static void sysconfig_exit(void)
{
    if (g_reg_iocfg_base != NULL) {
        iounmap(g_reg_iocfg_base);
        g_reg_iocfg_base = NULL;
    }
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM