NXP MCU 技术论坛
直播中

李丹

8年用户 1495经验值
私信 关注
[问答]

i.mx8m如何在u-boot SPL阶段启用pwm?

硬件:i.mx8m mini。
U-Boot 版本:2023.01 DFSG-2

我想让 pwm 点亮我的 spl.c 中的 LED,这样用户在接通板子电源后就可以立即看到灯亮了。
我没有找到将 IO 启用为 pwm 功能的接口,现在我只能将其设置为 gpio。但你知道 gpio 只有开/关,不能改变特定的亮度。
那么,是否可以在 spl 中包含 pwm?如果是,可以给我一些想法或代码示例吗?谢谢。
以下是我当前更改的补丁,并且 pin as gpio 可以输出为高电平:
---
主板/toradex/verdin-imx8mm/spl.c |20                    
1 个文件已更改,20 次插入 ()
差异 --git a/board/toradex/verdin-imx8mm/spl.c b/board/toradex/verdin-imx8mm/spl.c
索引 210665b..BA82269 100644
--- a/board/toradex/verdin-imx8mm/spl.c
b/板/toradex/verdin-imx8mm/spl.c
@@ -26,6  26,7@@
#include
#include
#include
+#include

declare_global_data_ptr;

@@ -137,8 138,27 @@ 虚空 board_init_f(ulong dummy)

power_init_board();

enable_status_light();
+
/* DDR 初始化 */
spl_dram_init();

board_init_r(NULL, 0);
}
+
+#define LED_PWM4 IMX_GPIO_NR(5,2)
+#define PWM_PAD_CTRL PAD_CTL_DSE6
+
static iomux_v3_cfg_t const pwm_pads[] = {
IMX8MM_PAD_SAI3_MCLK_GPIO5_IO2 |MUX_PAD_CTRL(PWM_PAD_CTRL)
+};
+
void enable_status_light(void)
+{
/* 激活 LED 控制器 OE */
imx_iomux_v3_setup_multiple_pads(pwm_pads, ARRAY_SIZE(pwm_pads));
+
LED 绿灯亮
gpio_request(LED_PWM4, “PWM4”);
gpio_direction_output(LED_PWM4,1);
+}

回帖(1)

dplion5

2025-3-26 17:59:41

在i.MX8M Mini的U-Boot SPL阶段启用PWM需要以下几个关键步骤:


1. 确认硬件配置


首先确认你的PWM引脚对应的控制器(如PWM1/PWM2)和通道号,并记录对应的IOMUX配置参数。例如PWM1的某个引脚可能需要以下配置:


/* 硬件复用模式 */
#define PWM_PAD_CTRL   (PAD_CTL_DSE6 | PAD_CTL_HYS | PAD_CTL_PUE)
#define PWM_MUX_MODE   0x0F  /* 具体值参考i.MX8MM手册 */

2. 配置设备树


确保设备树中已启用PWM控制器(可能需要拆分SPL专用设备树):


&pwm1 {
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_pwm1>;
    status = "okay";
};

3. 修改SPL代码


在你的verdin-imx8mm/spl.c中添加以下内容:


#include 
#include

static void enable_pwm_controller(void)
{
    /* 1. 配置IOMUX引脚复用为PWM功能 */
    imx8m_iomux_setup_pad(IMX8MM_PAD_GPIO1_IO01__PWM1_OUT | MUX_PAD_CTRL(PWM_PAD_CTRL));

    /* 2. 启用PWM时钟(以PWM1为例) */
    imx8m_ccgr_clock_enable(IMX8M_CCGR_PWM1);

    /* 3. 初始化PWM控制器 */
    struct udevice *pwm_dev;
    if (pwm_init(0, PWM1_PIN, &pwm_dev)) {  // 0表示PWM1通道号
        printf("PWM init failedn");
        return;
    }

    /* 4. 配置PWM参数 */
    pwm_config(pwm_dev, 500, 1000);  // 占空比50%(500/1000)
    pwm_enable(pwm_dev);
}

然后在board_init_f()中调用这个函数:


void board_init_f(ulong dummy)
{
    enable_pwm_controller();  // 添加在这里
    ...
}

4. 配置U-Boot编译选项


configs/verdin-imx8mm_defconfig中确保启用:


CONFIG_PWM=y
CONFIG_PWM_IMX=y
CONFIG_SPL_PWM=y
CONFIG_SPL_PWM_IMX=y

5. 关键注意事项



  • 时钟配置:i.MX8MM的PWM控制器需要来自CCM的时钟,确认使用的时钟根(如24MHz OSC)

  • SPL代码限制:SPL阶段可能无法使用完整驱动,建议参考drivers/pwm/pwm-imx.c移植必要函数

  • 引脚冲突:确保没有其他驱动(如GPIO)正在控制同一引脚


调试建议



  1. 使用示波器测量PWM引脚波形

  2. 在SPL中添加printf调试时钟使能状态

  3. 检查pwm_init返回值确认驱动加载状态


如果遇到时钟配置问题,可以尝试在enable_pwm_controller()中添加以下时钟初始化代码:


/* 设置PWM时钟根(示例值,需根据实际需求计算) */
clock_set_target_val(IMX8MM_PWM1_CLK_ROOT, CLK_ROOT_ON | CLK_ROOT_SOURCE_SEL(2));

最终效果应该是SPL阶段即可产生PWM波形,LED呈现呼吸灯效果而非简单的亮/灭。

举报

更多回帖

×
20
完善资料,
赚取积分