• arm-linux 字符设备IO控制


    使用ioremap(cookie,size)创建驱动

    ioremap宏定义在asm/io.h内

    eg:IMX6U_CCM_CCGR1 = ioremap(CCM_CCGR1_BASE, 4);

    使用iounmap注销驱动

    二、 ioremap() 相关函数解析

    在将I/O内存资源的物理地址映射成核心虚地址后,理论上讲我们就可以象读写RAM那样直接读写I/O内存资源了。为了保证驱动程序的跨平台的可移植性,我们应该使用Linux中特定的函数来访问I/O内存资源,而不应该通过指向核心虚地址的指针来访问

    读写I/O的函数如下所示:

    a -- writel()

    writel()往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节)。

    原型:void writel (unsigned char data , unsigned int addr )

    b -- readl()

    readl() 从内存映射的 I/O 空间上读数据,readl 从 I/O 读取 32 位数据 ( 4 字节 )。
    原型:unsigned char readl (unsigned int addr )

    eg:

    /* 2、使能GPIO1时钟 */
        val = readl(IMX6U_CCM_CCGR1);
        val &= ~(3 << 26);    /* 清楚以前的设置 */
        val |= (3 << 26);    /* 设置新值 */
        writel(val, IMX6U_CCM_CCGR1);

    readl()和writel()可以相互配合实现led等的闪烁

    void led_switch(u8 sta)
    {
        u32 val = 0;
        if(sta == LEDON) {
            val = readl(GPIO1_DR);//读取GPIO1_DR寄存器的值
            val &= ~(1 << 3);     //将寄存器值的将1左移3位的值取反然后和val相与然后赋值给val
            writel(val, GPIO1_DR);//将val写道GPIO1_DR寄存器中
        }else if(sta == LEDOFF) {
            val = readl(GPIO1_DR);
            val|= (1 << 3);    
            writel(val, GPIO1_DR);
        }    
    }

     

  • 相关阅读:
    学习如何使用最强大的 JavaScript 函数
    【JavaWeb】练习三
    PyTorch的张量拼接和变换
    Idea 常用快捷键
    ChatGPT 上线 Canva 插件,可生成图片和视频内容
    C++学习笔记(二)
    JS的基本内容
    【GitHub免密拉取代码】
    数据结构 - 顺序表
    【算法基础】基础算法(一)--(快速排序、归并排序、二分)
  • 原文地址:https://blog.csdn.net/L1153413073/article/details/125426908