1

我的 NEC 微控制器有一个 8 位的定时器控制器寄存器 - 我需要在 ioremap 的第二个参数中传递 8 吗?

阅读规范后,我了解了它的以下属性。

Address    |Function Register Name   |Symbol   |R/W Manipulatable Bits   |Default Val

FFFFF590H  |TMP0 control register 0  |TP0CTL0  |R/W √ √                  |00H

所以,我认为Timer寄存器TP0CTL0映射到的物理地址是0xFFFFF590。

现在,我将这个寄存器重新映射如下。阅读更多描述后,我知道该寄存器的大小为 8 位。

规范说“TPnCTL0 寄存器是一个控制 TMPn 操作的 8 位寄存器。”

这是正确的吗?我使用基地址为 0xFFFFF590,这个寄存器的大小是 8 位。因此,我将大小设为 8 位。这是对的吗?ioremap_nocache 的第二个参数是位大小吗?我的以下 API 是否正确?我是否在函数中正确使用了参数 - ioremap_nocache。

无效 *tp0ctl0 = ioremap_nocache(0xFFFFF590, 8);

接下来,我正在执行以下操作 -

unsigned int val =  ioread8(tp0ctl0);
val = 2;
iowrite8(val, tp0ctl0);

请在这里纠正我。如果我根据我拥有的微控制器信息正确使用 API,请告诉我。

4

1 回答 1

2

给 ioremap_* 的大小是字节而不是位。这个函数的目的是将物理地址空间映射到内核虚拟地址,因此任何大于零且小于或等于系统页面大小的东西都是等价的。

鉴于您在上面提供的信息,ioremap_nocache(0xFFFFF590, 1)实际上是正确的。但是“1”与“8”的效果将是相同的,因为系统页面大小(毫无疑问)大于两者。

于 2014-05-15T11:01:19.100 回答