免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1829 | 回复: 3
打印 上一主题 下一主题

[驱动] 谁能解释一下下面这段读写寄存器的含义 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-18 22:05 |只看该作者 |倒序浏览
(下面的代码都是运行于ARM平台的)
看如下定义的EDRV_REGB_WRITE,为何写寄存器要先将寄存器写到EdrvInstance_l.m_pIoAddr地址处,然后再将值写到EdrvInstance_l.m_pIoAddr+4处?
#define EDRV_REGB_WRITE(bReg_p, bVal_p) do { \
  writeb(bReg_p, EdrvInstance_l.m_pIoAddr); \   
  writeb(bVal_p, EdrvInstance_l.m_pIoAddr + 4); \
  } while (0)

下面是定义EDRV_REGB_READ的代码,为何读寄存器值之前要这么写一下EdrvInstance_l.m_pIoAddr?
#define EDRV_REGB_READ(bReg) EdrvRegbRead(bReg)

static inline BYTE EdrvRegbRead(BYTE bReg_p)
{
BYTE bVal;

  writeb(bReg_p, EdrvInstance_l.m_pIoAddr); // 为何读之前要这么写一下?
  bVal = readb(EdrvInstance_l.m_pIoAddr + 4);
  return bVal;
}

请高手帮忙解释一下,谢了!

论坛徽章:
0
2 [报告]
发表于 2010-07-19 01:57 |只看该作者
这位朋友

你有没有用过那种命令和数据配合使用的情况

我猜想

写的时候,先写的是地址(也就是写命令),然后在地址加4的地方写(也就是写数据)

读的时候,先写的是地址(也就是伪写命令),然后在地址加4的地方读(也就是读数据)

说的不一定很确切,触类旁通吧,基本意思应该差不多了

论坛徽章:
0
3 [报告]
发表于 2010-07-19 12:40 |只看该作者
读寄存器值之前要这么写一下EdrvInstance_l.m_pIoAddr,是为了保证寄存器内植的正确性

论坛徽章:
0
4 [报告]
发表于 2010-07-19 13:17 |只看该作者
看datasheet 有的硬件就是这样设计的。
比如有的网卡的phy芯片的读写是通过先写命令字,才能读写数据。你的例子也差不多是如此。
还有eeprom也是如此。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP