6255|10

88

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

寄存器读写问题 [复制链接]

在写驱动的时候,映射好地址后,在操作寄存器过程中,有两种方法,不知道是不是驱动里都可以用呢?
1、通过SETREG32或CLRREG32等来读/写寄存器
如:SETREG32(®,  (1<<2);

2、直接读/写寄存器的值
如:® |= (1<<2);

置REG寄存器第2位为1上边两个例子
不知道是不是都可以用?或者什么时候得用SETREG32或CLRREG32等来读/写寄存器?
什么时候可以直接读取寄存器的值
以上寄存器都已经映射好后的寄存器。。

最新回复

可不可以用试一下就知道了  详情 回复 发表于 2008-11-8 11:28
点赞 关注

回复
举报

82

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
一般都不这样用,而是映射到虚拟地址,然后直接对相应的地址赋值。
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
5.0下只有在FullKernelMode下可以直接使用AddressTable映射出来的虚拟地址,不然就必须经过VirtualCopy or MapIoSpace吧进行映射,才能使用,不然会出Data Abort.
不知道LZ指的映射好是什么样的映射?
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用楼主 andylao62 的帖子:
在写驱动的时候,映射好地址后,在操作寄存器过程中,有两种方法,不知道是不是驱动里都可以用呢?
1、通过SETREG32或CLRREG32等来读/写寄存器
如:SETREG32(®,  (1 < <2);

2、直接读/写寄存器的值
如:® |= (1 < <2);

置REG寄存器第2位为1上边两个例子
不知道是不是都可以用?或者什么时候得用SETREG32或CLRREG32等来读/写寄存器?
什么时候可以直接读取寄存器的值
以上寄存器都已经映射好后的寄存器…


------------楼主你的是标准5.0BSP,楼主说法有误。因为SETREG32或CLRREG32根本不是读写寄存器,而是设置寄存器,控制寄存器的功能。要读写寄存器要经过一番映射。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

5
 
------------楼主你的是标准5.0BSP,楼主说法有误。因为SETREG32或CLRREG32根本不是读写寄存器,而是设置寄存器,控制寄存器的功能。要读写寄存器要经过一番映射。这个是正解,不是在读取数据,而是在操作和读取状态.你可以看一下你置那个位,会有什么样的效果.SET与CLEAN如果您熟悉单位机的话,应该很清楚这一般来说是置片选位或者控件位的操作.
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
不好意思,我没把影射部分写出来
PHYSICAL_ADDRESS phyAddr = {BSP_BASE_REG_PA_PBC_BASE, 0};
        // Map PBC registers to virtual address space
        pPBC = (PCSP_PBC_REGS) MmMapIoSpace(phyAddr, sizeof(CSP_PBC_REGS), FALSE);
  OUTREG16(&pPBC->BCTRL2_CLEAR, (1 << PBC_BCTRL2_IRDA_EN_LSH));
这个是真正的驱动代码
我上边只是把他简写而已

而在COMMON下边又有个函数clkpwr_get_base_clock_rate(),他就是用
2、直接读/写寄存器的值
if ((pClkPwr->clkpwr_pwr_ctrl & CLKPWR_SELECT_RUN_MODE) != 0)
而不需要INREG(pClkPwr->clkpwr_pwr_ctrl )这个方式
我现在想问的就是,是不是,我在写驱动的时候,可以直接用if ((pClkPwr->clkpwr_pwr_ctrl & CLKPWR_SELECT_RUN_MODE) != 0),或者可以调用函数clkpwr_get_base_clock_rate()这个函数呢?
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(中级)

7
 
引用 4 楼 BEYONDMA 的回复:
------------楼主你的是标准5.0BSP,楼主说法有误。因为SETREG32或CLRREG32根本不是读写寄存器,而是设置寄存器,控制寄存器的功能。要读写寄存器要经过一番映射。这个是正解,不是在读取数据,而是在操作和读取状态.你可以看一下你置那个位,会有什么样的效果.SET与CLEAN如果您熟悉单位机的话,应该很清楚这一般来说是置片选位或者控件位的操作.

不好意思啊,我把SETREG32或CLRREG32这两个函数说错了。不过我只是随便拿来做例子而已,不知道我的表达是否能让你们都明白了呢?
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

8
 
忘记说明,我的是WINCE6.0的
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 andylao62 的回复:
忘记说明,我的是WINCE6.0的


把ARM啊,内存啊,flash,BSP版本详细信息说明白哦,因为不同德 BSp差距很大。楼主,其实你不用问,因为每个驱动都有个流程,你看代码自然知道。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

10
 
根据分析大家的答复,似乎是在说我下边的两种方法都可以用
1、通过SETREG32等来设置寄存器
如:SETREG32(®,  (1 < <2);

2、直接设置寄存器的值
如:® |= (1 < <2);

置REG寄存器第2位为1上边两个例子
影射部分就没列出来
 
 
 

回复

48

帖子

0

TA的资源

禁止发言

11
 
可不可以用试一下就知道了
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表