操作流程
首先举个例子,比如我需要操作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()类接口进行寄存器操作