1

我有一个 beagleboard-xm rev C 板。处理器的 TRM。我在网上看到了一些如何进行焊盘配置的示例。这是其中一个例子:

 int fd = open("/dev/mem", O_RDWR | O_SYNC);
if (fd < 0) {
  printf("Could not open memory\n");
  exit(1);
}

// Pad configuration
volatile ulong *pinconf;
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
if (pinconf == MAP_FAILED) {
  printf("Pinconf Mapping failed\n");
  close(fd);
  exit(1);
}
// configure expansion header
pinconf[0x2174/4] = 0x001A001A; //
close(fd);

我的问题是除以0x21744 的目的是什么?

我看到 0x2174 代表我想在http://www.ti.com/lit/ug/spruf98x/spruf98x.pdf page778上配置的引脚( CONTROL_PADCONF_UART2_CTS[15:0]) 。我看到它是一个 32 位寄存器。但是我无法在该寄存器的低 16 位 4 点处获得功能 0x2174?

4

2 回答 2

3

这是因为指针的类型是“ulong”,在这个平台上似乎是 4 个字节。假设 pinconf 的寄存器地址为 0x12174,您必须将偏移量除以 0x10000 除以 4 以获得 ulongs 数组的正确索引(以及正确的字节地址)。

于 2013-02-11T16:56:20.193 回答
2

C 中的地址算术以这样一种方式工作,即 的地址pinconf[n]pinconf加 n乘以sizeof(ulong)的地址。这就是为什么当sizeof(ulong)是 4 时,你将目标单词的原始偏移量除以 4 以获得单词在pinconf数组中的索引。

于 2013-02-11T16:55:21.387 回答