2013-02-11 33 views
1

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

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); 

我的问题是,什么是除以4 0x2174的目的是什么?

我看到0x2174代表我想要配置的针(CONTROL_PADCONF_UART2_CTS[15:0]http://www.ti.com/lit/ug/spruf98x/spruf98x.pdf page778。我看到它是一个32位寄存器。但是我不能通过4点得到该寄存器的低16位的功能0x2174?用C

回答

3

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

2

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