arm-linux 字符设备IO控制

本文介绍了Linux驱动开发中如何使用ioremap将I/O内存资源映射到核心虚地址,并通过writel和readl函数进行读写操作。示例代码展示了在IMX6U平台上启用GPIO1时钟和切换LED状态的过程。
摘要由CSDN通过智能技术生成

使用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);
    }    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值