硬件:jetson orin nx 8GB开发套件;自定义载板
软件:Jetson36.4.4
我们设计了一个自定义载板,使用LT6911C实现HDMI转MIPI以适配MIPI显示屏,其中GPIO7驱动着屏幕背光。
为了显示开机LOGO,我们修改了UEFI并且在GPIO7为普通GPIO(GPIO3_PG.06)时Drive 1正常显示开机LOGO。
但是当配置为PWM(GP_PWM7)时 Drive 1背光引脚一直处于低电平,直到进入系统。
已做的工作:
- 修改pinmux,GPIO7配置为GP_PWM7 Drive 1。这一点已验证因为进入系统后可以正常调节PWM。
- 修改edk2-nvidia源码,我尝试修改TegraPwmDxe.c
/** @file
TegraPwmDxe Controller Driver - MODIFIED FOR BACKLIGHT (Compiler Fix)
SPDX-FileCopyrightText: Copyright (c) 2020-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <PiDxe.h>
#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Library/IoLib.h>
#include <Library/DeviceDiscoveryDriverLib.h>
#include <Library/MemoryAllocationLib.h>
// ############# 关键修正: 重新包含 libfdt.h #############
#include <libfdt.h>
NVIDIA_COMPATIBILITY_MAPPING gDeviceCompatibilityMap[] = {
{ "nvidia,tegra194-pwm", &gNVIDIANonDiscoverablePwmDeviceGuid },
{ NULL, NULL }
};
NVIDIA_DEVICE_DISCOVERY_CONFIG gDeviceDiscoverDriverConfig = {
.DriverName = L"NVIDIA PWM driver (Backlight Final)",
.AutoEnableClocks = TRUE,
.AutoResetModule = TRUE,
.SkipEdkiiNondiscoverableInstall = FALSE
};
// --- 正确的寄存器值计算 (根据Orin TRM DP-10508-002_v1.2) ---
#define PWM_CLOCK_FREQ 19200000
// 目标频率: ~20kHz
// PFM = (19200000 / (256 * 20000)) - 1 = 2.75. 取整数 3.
#define PWM_BACKLIGHT_PFM 3
// 目标占空比: 100% (使用最大安全值 255/256)
#define PWM_BACKLIGHT_DUTY_VALUE 255
// 构造最终的寄存器值: [31] ENB=1, [23:16] PWM_0=255, [12:0] PFM_0=3
#define PWM_BACKLIGHT_CONFIG_VALUE ((1UL << 31) | (PWM_BACKLIGHT_DUTY_VALUE << 16) | PWM_BACKLIGHT_PFM)
/**
Callback that will be invoked at various phases of the driver initialization
**/
EFI_STATUS
DeviceDiscoveryNotify (
IN NVIDIA_DEVICE_DISCOVERY_PHASES Phase,
IN EFI_HANDLE DriverHandle,
IN EFI_HANDLE ControllerHandle,
IN CONST NVIDIA_DEVICE_TREE_NODE_PROTOCOL *DeviceTreeNode OPTIONAL
)
{
EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS BaseAddress;
UINTN RegionSize;
CONST CHAR8 *NodeName;
switch (Phase) {
case DeviceDiscoveryDriverBindingSupported:
return EFI_SUCCESS;
case DeviceDiscoveryDriverBindingStart:
BaseAddress = 0;
RegionSize = 0;
Status = DeviceDiscoveryGetMmioRegion (ControllerHandle, 0, &BaseAddress, &RegionSize);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to get PWM region: %r\n", __FUNCTION__, Status));
return Status;
}
NodeName = fdt_get_name(DeviceTreeNode->DeviceTreeBase, DeviceTreeNode->NodeOffset, NULL);
// Orin NX上的PWM7基地址为 0x032e0000。我们通过地址来判断。
if (BaseAddress == 0x032e0000) {
DEBUG ((DEBUG_INFO, "Found Backlight PWM Controller (%a) at 0x%p. Applying settings.\n", NodeName, BaseAddress));
// 写入我们根据TRM精确计算出的配置值
MmioWrite32 (BaseAddress, PWM_BACKLIGHT_CONFIG_VALUE);
DEBUG ((DEBUG_INFO, "Backlight PWM configured with value 0x%08X.\n", PWM_BACKLIGHT_CONFIG_VALUE));
} else {
DEBUG ((DEBUG_INFO, "Skipping non-backlight PWM controller (%a) at 0x%p.\n", NodeName, BaseAddress));
}
return EFI_SUCCESS;
default:
return EFI_SUCCESS;
}
}
我尝试在其中获取PWM7控制器的寄存器,并且按照TRM修改。
现象:背光引脚一直处于低电平,直到进入系统(由于我修改的设备树,进入系统后PWM7会被驱动)
我的问题:
1.为什么PWM下 Drive 1仍然不能使GPIO7默认输出高电平,但是GPIO下Drive 1可以?
2.有什么办法可以在进入系统前(UEFI阶段或早于显示LOGO前)使GPIO7输出高电平或者输出一个默认的PWM波形以便正常展示LOGO?
期待您的回复。
