当前位置: 技术问答>linux和unix
谁能解释一下下面这段读写寄存器的含义
来源: 互联网 发布时间:2016-12-25
本文导语: (下面的代码都是运行于ARM平台的) 看如下定义的EDRV_REGB_WRITE,为何写寄存器要先将寄存器写到EdrvInstance_l.m_pIoAddr地址处,然后再将值写到EdrvInstance_l.m_pIoAddr+4处? #define EDRV_REGB_WRITE(bReg_p, bVal_p) do { ...
(下面的代码都是运行于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;
}
请高手帮忙解释一下,谢了!
看如下定义的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;
}
请高手帮忙解释一下,谢了!
|
这个要去看datasheet
有些硬件的读写是有一些特殊步骤的。
单独从代码来看,我感觉是这样:
这个硬件有很多寄存器,但是都没有独立的读写地址。
读写的时候要先指定要访问的寄存器(把寄存器号写入m_pIoAddr)
然后从一个统一的地址读/写 (m_pIoAddr + 4)
有些硬件的读写是有一些特殊步骤的。
单独从代码来看,我感觉是这样:
这个硬件有很多寄存器,但是都没有独立的读写地址。
读写的时候要先指定要访问的寄存器(把寄存器号写入m_pIoAddr)
然后从一个统一的地址读/写 (m_pIoAddr + 4)
|
楼上正解, 你首先要告诉硬件你打算读那个寄存器, 然后再去读。
当然,不是所有的硬件都是这样,这取决于硬件的特性,还得看硬件手册。
当然,不是所有的硬件都是这样,这取决于硬件的特性,还得看硬件手册。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。