我是原始博客/代码作者,这就是我的意思:
为了回答您的主要观点,pinconf[0x2168/4] 指的是地址 0x48002168。pinconf 数组从地址 0x48000000 开始。它被定义为 ulong [1],在 ARM 处理器上为 4 个字节。我知道我想访问地址 pinconf+0x2168。要将地址 0x2168 转换为 pinconf 中的索引,我需要除以 4。
从头开始浏览代码:
volatile ulong *pinconf;
pinconf 被定义为一个 ulong (32bit int) 指针。它被定义为 volatile,这意味着我们代码之外的某些东西可能会改变它的值。它告诉编译器,每次我们使用该值时,我们都需要从内存中读取它,这会阻止编译器进行可能会搞砸的巧妙优化。
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
这会将 pinconf 设置为指向地址 0x48000000。通常,您可以执行以下操作:
pinconf = (ulong*) 0x48000000;
使 pinconf 指向一个地址,但这不起作用。0x48000000 是一个受保护的地址,它只能被内核访问。mmap 魔法为您提供了一种从用户空间访问地址的方法。
pinconf[0x2168/4] = 0x001C001C;
我们已经讨论过这个,但这是向地址写入一个值:0x48000000+0x2168。值 0x48002168 来自 OMAP3 数据表,用于与 GPIO 系统进行内存映射 IO。我们除以 4 将地址 0x2168 转换为 pinconf 中的索引。
[1] 老实说,我可能应该使用 uint32_t。