• Linux I/O 映射(ioremap)和writel/readl


    在裸奔代码中,如果要控制gpio,直接控制gpio寄存器地址即可;

    在linux系统中,所有操作的地址都是虚拟地址,都是由linux内核去管理,所以需要将物理地址转换成内核可识别的虚拟地址。


    1、ioremap 和 iounmap

    // 功能:将物理地址映射为虚拟地址

    // 参数1:需要映射的物理地址

    // 参数2:需要映射的地址长度

    // 返回值:映射后的虚拟地址(例:void*reg_base = ioremap(0x12345678, 4);)

    void *ioremap(cookie, size);


    // 功能:取消映射

    // 参数:需要取消的虚拟地址

    void iounmap(cookie);


    2、虚拟地址操作

    // 功能:将虚拟地址中的值读出来

    // 参数:需要读取的虚拟地址

    __raw_readl(addr);        等同于      readl(addr);


    // 功能:将数据写入虚拟地址

    // 参数1:数据

    // 参数2:需要写入的虚拟地址

    __raw_writel(data, addr);        等同于      writel(data, addr);


    // 从虚拟地址读取4个字节数据

    unsigned int readl(unsigned int addr);

    // 往虚拟地址写入4个字节数据

    void writel(unsigned int data, unsigned int addr);


    // 从虚拟地址读取2个字节数据

    unsigned short readw(unsigned int addr);

    // 往虚拟地址写入2个字节数据

    void writew(unsigned short data, unsigned int addr);


    // 从虚拟地址读取1个字节数据

    unsigned char readb(unsigned int addr);

    // 往虚拟地址写入1个字节数据

    void writeb(unsigned char data, unsigned int addr);


    void led_on(void)
    {
    	void *reg_base;
    	unsigned int temp; 
    	reg_base = ioremap(0x12345678, 4);
    
    	temp = __raw_readl(reg_base); 
    	temp &= ~(0xff<<12);
    	temp |= (0x11<<12);
    
    	__raw_writel(temp, reg_base);
    }


  • 相关阅读:
    谁是你随时可以说话的人
    我们在帝都这么拼,为的是什么?
    CVE-2016-4758: UXSS in Safari's showModalDialog
    JSON-SCHEMA
    JS城市data
    linux(centos )mongodb install
    python pip install
    基于chrome内核的UXSS
    Trying to hack Redis via HTTP requests
    Apache Solr 访问权限控制
  • 原文地址:https://www.cnblogs.com/lialong1st/p/7756675.html
Copyright © 2020-2023  润新知