免责声明:我在德州仪器论坛上交叉发表这个问题,但是我没有得到任何答复五天。 我对embedded式编程相当陌生,所以请指出,如果您需要更多的信息,或者我的方法是无意义的。
动机
我有一个带有德州仪器公司的DM3730处理器的embedded式设备(您可以在Beagleboard-xm上find相同的结果)处理器通过显示子系统(DSS)连接到LCD显示器。 显示器看起来很暗,必须进行伽马校正。 幸运的是,DSS有一个Palette / gamma查找表。 不幸的是,我无法得到它的工作。
我发现了什么
我在德州仪器(TI)论坛上find了一个类似的问题,提出了一个类似的处理器,TI员工给出了下面的解释(重点是我的):
我不认为目前的Linux内核支持彩色索引graphics,但通过直接寄存器configuration从应用程序级别启用相当容易。
[…]
接下来,声明一个包含256个无符号整数的数组,并用每个颜色索引条目所需的RGB值填充它。
将DISPC_GFX_TABLE_BA设置为之前configuration的arrays的物理地址(注1, 这需要物理地址而不是虚拟地址,因此您可能需要将其映射回注意2,这需要是一个32位alignment的地址,如何创build数组可能需要创build一个稍大的char数组,并填充数组,使得起始位于32位边界上)
[…]
他后来引用mem_util来转换地址,我可以使用它直接从应用程序级别(用户空间)写入寄存器,但我无法弄清楚如何将虚拟地址映射回物理地址。
系统信息
~# uname -a Linux dm37x-evm 2.6.32.1 #1 Fri Dec 2 11:19:53 EST 2011 armv7l unknown
我的问题
你的问题的一个非常具体的答案是使用CMEM,其目的是从引导时间保留的内存分配连续的内存块。
在下面的示例代码中,我通过编解码器引擎使用cmem。 ptr是你在应用程序中用来访问缓冲区的东西,而physptr是你在寄存器中写的东西。
ptr = Memory_contigAlloc(len, Memory_DEFAULTALIGNMENT); if(ptr == NULL) { debug_printf("Buffer allocation failed : buf size = %d\n", len); return -1; } physptr = (void *)Memory_getBufferPhysicalAddress(ptr, len, 0);
“正确的”方法实际上不是使用memutil,而是在内核中完成整个事情。
有一个CMEM驱动程序,用于将物理内存映射到用户空间内存。 它也可以做虚拟到物理的翻译。
所以,有了这个驱动程序,你可以: