linux驱动(点灯篇)

这篇博客介绍了在Linux内核中如何使用ioremap()函数将物理地址映射为虚拟地址,以确保安全性和内存利用率。通过定义并映射GPIO相关物理地址,如CCM_CCGR1、SW_MUX_GPIO1_IO03等,然后进行初始化设置,包括读写操作来控制GPIO的状态和方向,以实现LED灯的控制。
摘要由CSDN通过智能技术生成

寄存器

在linux中,内核不会直接操作物理地址,而是使用虚拟地址,这就需要使用一个内置函数,进行从物理地址到虚拟地址的映射:
优点:1,安全,应用层访问的是虚拟内存,避免真实硬件地址泄露
2.随时释放,提高利用率
ioremap()为转化为虚拟内存的函数,第一个参数是基地址,第二个是大小。

首先定义物理与虚拟地址:

//定义物理地址
#define CCM_CCGR1_BASE (0X020C406C)
#define SW_MUX_GPIO1_IO03_BASE (0X020E0068)
#define SW_PAD_GPIO1_IO03_BASE (0X020E02F4)
#define GPIO1_DR_BASE 		   (0X0209C000)
#define GPIO1_GDIR_BASE		   (0X0209C004)

//映射后的虚拟指针
static void __iomem *IMX6U_CCM_CCGR1;
static void __iomem *SW_MUX_GPIO1_IO03;
static void __iomem *SW_PAD_GPIO1_IO03;
static void __iomem *GPIO1_DR;
static void __iomem *GPIO1_GDIR;

初始化地址映射并写入:


    //初始化LED灯 地址映射
   IMX6U_CCM_CCGR1=ioremap(CCM_CCGR1_BASE,4);//CCM--->时钟相关
   SW_MUX_GPIO1_IO03=ioremap(SW_MUX_GPIO1_IO03_BASE,4);//-->MUX,表示复用
   SW_PAD_GPIO1_IO03=ioremap(SW_PAD_GPIO1_IO03_BASE,4);//---->pad表示电气属性
   GPIO1_DR=ioremap(GPIO1_DR_BASE,4);//dr输出高低电平
   GPIO1_GDIR=ioremap(GPIO1_GDIR_BASE,4);//方向,输入or输出。

    //初始化
    temp=readl(IMX6U_CCM_CCGR1);
    temp &=~(3 << 26);//清楚配置
    temp |=3 << 26;
    writel(temp,IMX6U_CCM_CCGR1);
    writel(0x5,SW_MUX_GPIO1_IO03);//复用
    writel(0x10B0,SW_PAD_GPIO1_IO03);

    temp=readl(GPIO1_GDIR);
    temp |=1 << 3;//设置电气属性,设置为输出
    writel(temp,GPIO1_GDIR);

    temp=readl(GPIO1_DR);
    if(temp==0){
         temp &=~(1 << 3);//设置电气属性,设置为输出
         writel(temp,GPIO1_DR);
    }
   

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Rangers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值