动态映射之结构体方式操作寄存器

动态映射之结构体方式操作寄存器

仿效真实驱动中,用结构体封装的方式来进行单次多个寄存器的地址映射。即代替文章《随笔–Linux字符设备驱动开发基础》中动态映射操作LED一节的基础动态映射方式

#include <linux/io.h>
#include <linux/ioport.h>
......
typedef struct GPJ0REG
{
    volatile unsigned int gpj0con;
    volatile unsigned int gpj0dat; 
}gpj0_reg_t;

//#define GPJ0CON_PA    0xe0200240
//#define GPJ0DAT_PA    0xe0200244
#define GPJ0_REGBASE    0xe0200240

//unsigned int *pGPJ0CON;       //指针类型才能接受ioremap返回的地址
//unsigned int *pGPJ0DAT;
gpj0_reg_t *pGPJ0REG;     

...
// 模块安装函数
static int __init chrdev_init(void)
{
        //注册字符设备驱动
    ...
#if 0
    // 使用动态映射的方式来操作寄存器
    if (!request_mem_region(GPJ0CON_PA, 4, "GPJ0CON"))
        return -EINVAL;
    if (!request_mem_region(GPJ0DAT_PA, 4, "GPJ0DAT"))
        return -EINVAL;
    pGPJ0CON = ioremap(GPJ0CON_PA, 4);
    pGPJ0DAT = ioremap(GPJ0DAT_PA, 4);

    *pGPJ0CON = 0x11111111;
    *pGPJ0DAT = ((0<<3) | (0<<4) | (0<<5));    // 亮
#endif
    // 2步完成映射
    if (!request_mem_region(GPJ0_REGBASE, sizeof(gpj0_reg_t), "GPJ0REG"))
        return -EINVAL;
    pGPJ0REG = ioremap(GPJ0_REGBASE, sizeof(gpj0_reg_t));
    // 映射之后用指向结构体的指针来进行操作
    // 指针使用->结构体内元素 的方式来操作各个寄存器
    pGPJ0REG->gpj0con = 0x11111111;
    pGPJ0REG->gpj0dat = ((0<<3) | (0<<4) | (0<<5));    // 亮
        ...
}
// 模块卸载函数
static void __exit chrdev_exit(void)
{
        ...
    // 解除映射
#if 0
    iounmap(pGPJ0CON);
    iounmap(pGPJ0DAT);
    release_mem_region(GPJ0CON_PA, 4);
    release_mem_region(GPJ0DAT_PA, 4);
#endif
    iounmap(pGPJ0REG);
    release_mem_region(GPJ0_REGBASE, sizeof(gpj0_reg_t));
        ...
        //注销字符设备驱动
        ...
}

动态映射结构体方式操作寄存器:在结构体中添加相应成员就可以,不用像之前的那么麻烦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值