【Linux驱动:动态申请内存映射及操作io寄存器】

操作流程

首先举个例子,比如我需要操作GPJ0CON(对应物理地址0xE0200240)和GPJ0DAT(对应物理地址0xE0200244)这两个寄存器,应该如何操作?下面我们开始介绍操作流程:

1.在芯片的datasheet中找到对应的地址说明

在这里插入图片描述
在这里插入图片描述
2.定义相关的物理地址宏和操作变量

//定义寄存器物理地址宏(通过查阅芯片手册得知)
#define GPJ0CON_PA		 0xE0200240
#define GPJ0DAT_PA		 0xE0200244

//法一:单独定义寄存器操作地址
static volatile unsigned int * pGPJ0CON;
static volatile unsigned int * pGPJ0DAT;

//法二:使用结构体定义寄存器操作地址
typedef struct GPJ0_REG
{
	volatile unsigned int * pGPJ0CON;
	volatile unsigned int * pGPJ0DAT;
}gpj0_reg_t;

static gpj0_reg_t gpj0_register;

3.使用request_mem_region()进行内存地址申请

// 使用动态映射的方式来操作寄存器
```c
request_mem_region(GPJ0CON_PA, 4, "GPJ0CON")request_mem_region(GPJ0DAT_PA, 4, "GPJ0CON")

4.使用ioremap()建立地址映射

//法一
pGPJ0CON = ioremap(GPJ0CON_PA, 4);
pGPJ0DAT = ioremap(GPJ0DAT_PA, 4);

//法二
gpj0_register.pGPJ0CON = ioremap(GPJ0CON_PA, 4);
gpj0_register.pGPJ0DAT = ioremap(GPJ0DAT_PA, 4);

5.直接操作或者使用writel()类接口进行寄存器操作
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值