我正在尝试在此指令http://41j.com/blog/2011/09/beagleboard-gpio-input-driverless/
上学习处理器的扩展头配置我有一个我无法理解的部分
volatile ulong *pinconf;
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
pinconf[0x2168/4] = 0x001C001C;
任何人都可以解释pinconf
数组的工作原理吗?它存储了什么价值?
编辑:我真的无法理解pinconf[0x2168/4]
的意思。它是十六进制数组,它指的是什么值?
答案 0 :(得分:2)
pinconf是一个内存映射文件/设备。查看链接代码,fd是新打开的/ dev / mem的描述符。因此,无论你写入pinconf数组,实际上都是直接写入/ dev / mem,无论你在数组中使用什么偏移量。我假设这是代码与GPIO硬件“交谈”的方式。如果没有GPIO设备的存储器映射,很难知道正在写入的地址会发生什么。
查看/ dev/mem是什么。
阅读有关内存映射i / o的信息,这就是它的作用(有点),请参阅:http://www.kernel.org/doc/htmldocs/uio-howto.html#userspace_driver
答案 1 :(得分:2)
基于你问题的标题,我认为你对访问数组的十六进制表示法感到困惑。
hex只是写数字的另一种方式,不要让它给你太多。我可以写:
int a = 0xA;
或
int a = 10;
他们的意思相同。所以在这种情况下:
pinconf[0x2168/4] = 0x001C001C;
只是:
pinconf[8552/4] = 1835036;
后者实际上更令人困惑,因为pinconf存储的地址通常使用4(或8)个字节以十六进制写入,因此00
继续执行其余的数字(1C001C
)< / p>
答案 2 :(得分:2)
我是原创博客/代码作者,这就是我的意思:
要回答您的要点,pinconf [0x2168 / 4]指的是地址0x48002168。 pinconf阵列从地址0x48000000开始。它被定义为ulong [1],在ARM处理器上是4个字节。我知道我想访问地址pinconf + 0x2168。要将地址0x2168转换为pinconf中的索引,我需要除以4.
从头开始遍历代码:
volatile ulong *pinconf;
pinconf被定义为ulong(32位int)指针。它被定义为volatile,这意味着我们的代码之外的东西可能会改变它的价值。它告诉编译器每次我们使用该值时我们都需要从内存中读取它,这会阻止编译器进行巧妙的优化,这可能会搞砸了。
pinconf = (ulong*) mmap(NULL, 0x10000, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x48000000);
这会将pinconf设置为指向地址0x48000000。通常你可以这样做:
pinconf = (ulong*) 0x48000000;
使pinconf指向一个地址,但这不起作用。 0x48000000是受保护的地址,只能由内核访问。 mmap magic为您提供了一种从用户空间访问地址的方法。
pinconf[0x2168/4] = 0x001C001C;
我们已经介绍了这个,但是这是写一个值到地址:0x48000000 + 0x2168。值0x48002168来自OMAP3数据表,用于与GPIO系统进行内存映射IO。我们除以4将地址0x2168转换为pinconf中的索引。
[1]我应该使用uint32_t来说实话。
答案 3 :(得分:1)
pinconf数组存储ulong(unsigned long)。
使用volatile ulong *pinconf;
定义指向ulong的指针。它指向数组的第一个元素。它是易变的,意味着它可能被外部“事件”改变而不会被缓存。它可以在C中使用任何数组。
在这种情况下,它被映射到具有文件描述符fd。
的文件/设备