在设备树中为framebuffer预分配内存的正确方法通常涉及以下几个步骤:
- 使用保留内存区域(reserved-memory):
在设备树中创建reserved-memory节点来定义需要预分配的内存区域。这是Linux内核推荐的内存预留方式。
/reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
framebuffer_region: framebuffer@3f000000 {
compatible = "shared-dma-pool"; // 或 "no-map" 如果需要物理连续内存
reg = <0x3f000000 0x600000>;
no-map; // 可选,防止内核使用该区域
};
};
- 将保留内存关联到framebuffer设备:
在framebuffer节点中通过memory-region属性引用上述保留区域。
mxcfb1: fb@0 {
compatible = "FSL,mxc_sdc_fb";
disp_dev = "ldb";
interface_pix_fmt = "RGB666";
default_bpp = <16>;
int_clk = <0>;
late_init = <0>;
status = "okay";
memory-region = <&framebuffer_region>; // 关键配置
};
注意事项:
- 地址对齐:确保预留的物理地址和大小符合SOC的显示控制器要求(通常需要对齐到页大小或特定边界)。
- 驱动支持:检查framebuffer驱动是否支持
memory-region属性(大多数现代驱动会自动处理)。
- 内存冲突:确保预留区域不与其他系统内存重叠,可以通过
/memreserve/指令或内核日志验证。
- CMA替代方案:如果使用CMA(连续内存分配器),可以通过内核参数预留内存:
cma=64M@0x3f000000
验证方法:
- 系统启动后检查
/proc/iomem确认内存区域保留成功。
- 通过
dmesg | grep -i framebuffer查看驱动初始化日志。
需要特别注意:
- 不要直接使用
reg属性定义framebuffer内存,因为该属性用于设备寄存器空间而非内存分配。
- i.MX系列SOC的显示子系统通常由IPU/DPU控制器管理内存,建议检查是否需要在显示控制器节点(如ldb或dcss)进行配置。
- 如果使用U-Boot,可能需要通过bootm命令预留内存区域。
对于i.MX6系列的具体实现,可参考内核文档:Documentation/devicetree/bindings/display/imx/fsl,mxc_sdc_fb.txt
在设备树中为framebuffer预分配内存的正确方法通常涉及以下几个步骤:
- 使用保留内存区域(reserved-memory):
在设备树中创建reserved-memory节点来定义需要预分配的内存区域。这是Linux内核推荐的内存预留方式。
/reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
framebuffer_region: framebuffer@3f000000 {
compatible = "shared-dma-pool"; // 或 "no-map" 如果需要物理连续内存
reg = <0x3f000000 0x600000>;
no-map; // 可选,防止内核使用该区域
};
};
- 将保留内存关联到framebuffer设备:
在framebuffer节点中通过memory-region属性引用上述保留区域。
mxcfb1: fb@0 {
compatible = "FSL,mxc_sdc_fb";
disp_dev = "ldb";
interface_pix_fmt = "RGB666";
default_bpp = <16>;
int_clk = <0>;
late_init = <0>;
status = "okay";
memory-region = <&framebuffer_region>; // 关键配置
};
注意事项:
- 地址对齐:确保预留的物理地址和大小符合SOC的显示控制器要求(通常需要对齐到页大小或特定边界)。
- 驱动支持:检查framebuffer驱动是否支持
memory-region属性(大多数现代驱动会自动处理)。
- 内存冲突:确保预留区域不与其他系统内存重叠,可以通过
/memreserve/指令或内核日志验证。
- CMA替代方案:如果使用CMA(连续内存分配器),可以通过内核参数预留内存:
cma=64M@0x3f000000
验证方法:
- 系统启动后检查
/proc/iomem确认内存区域保留成功。
- 通过
dmesg | grep -i framebuffer查看驱动初始化日志。
需要特别注意:
- 不要直接使用
reg属性定义framebuffer内存,因为该属性用于设备寄存器空间而非内存分配。
- i.MX系列SOC的显示子系统通常由IPU/DPU控制器管理内存,建议检查是否需要在显示控制器节点(如ldb或dcss)进行配置。
- 如果使用U-Boot,可能需要通过bootm命令预留内存区域。
对于i.MX6系列的具体实现,可参考内核文档:Documentation/devicetree/bindings/display/imx/fsl,mxc_sdc_fb.txt
举报