免责声明:我在Texas Instruments Forum上交叉发布此问题,但我在那里没有得到任何回复五天。我是嵌入式编程的新手,所以请指出您是否需要其他信息,或者我的方法是荒谬的。
动机
我有一个DM3730 processor from Texas Instruments的嵌入式设备(与Beagleboard -xm相同)处理器通过其显示子系统(DSS)连接到LCD显示器。显示器看起来很暗,必须进行伽玛校正。幸运的是,DSS有一个Palette / gamma查找表。不幸的是,我无法让它工作。
我发现了什么
我在德州仪器论坛上找到了similar question可比较的处理器,TI员工给出了以下解释(强调我的):
我认为目前的Linux内核对颜色索引图形没有任何支持,但从应用程序级别到直接注册配置相当容易。
[...]
接下来,声明一个包含256个无符号整数的数组,并用每个颜色索引条目所需的RGB值填充它。
将DISPC_GFX_TABLE_BA设置为先前配置的阵列的物理地址(注1,这需要物理地址而不是虚拟地址,因此您可能需要将其映射回来。注2,这需要要是一个32位对齐的地址,所以根据数组的创建方式,可能需要创建一个稍大的char数组并填充数组,使得起始位于32位边界上)
[...]
他后来引用mem_util转换地址,我可以用它直接从应用程序级别(用户空间)写入寄存器,但我无法弄清楚如何“映射回”虚拟地址到物理地址。
系统信息
~# uname -a
Linux dm37x-evm 2.6.32.1 #1 Fri Dec 2 11:19:53 EST 2011 armv7l unknown
我的问题
答案 0 :(得分:1)
有一个CMEM驱动程序,用于将物理内存映射到用户空间内存。它也可以进行虚拟到物理翻译。
所以,有了这个驱动程序,你可以:
答案 1 :(得分:1)
对您的问题的一个非常具体的答案是使用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并在内核中完成整个事情。