2

免责声明:我有点在德州仪器论坛上交叉发布这个问题,但我已经五天没有得到任何回复。我对嵌入式编程很陌生,所以请指出您是否需要更多信息或者我的方法是否荒谬。

动机

我有一个带有德州仪器 ( Texas Instruments) 的 DM3730 处理器的嵌入式设备(与 Beagleboard -xm 上的处理器相同)该处理器通过其显示子系统 (DSS) 连接到 LCD 显示器。显示屏看起来很暗,必须进行伽马校正。幸运的是,DSS 有一个 Palette/gamma 查找表。不幸的是,我无法让它工作。

我发现了什么

我在德州仪器论坛上发现了类似处理器的类似问题,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

我的问题

  • 如何将虚拟地址映射回物理地址?
  • 这可以在用户空间中完成吗?(我设想我提供一个用户可以调整伽玛曲线的界面)
  • 一般来说,这是正确的方法吗?我应该把它移到内核空间吗(我不愿意这样做,因为我对 Linux 内核没有很多经验)
  • 任何好的资源或例子!
4

2 回答 2

1

有一个CMEM驱动程序,用于将物理内存映射到用户空间内存。它也可以进行虚拟到物理的转换。

因此,使用此驱动程序,您可以:

  1. 分配对齐的缓冲区
  2. 获取用户空间地址
  3. 从您的程序中填充缓冲区
  4. 获取缓冲区的物理地址
于 2012-04-18T13:43:47.557 回答
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 并在内核中完成整个事情。

于 2012-04-18T13:54:00.303 回答