【求助】【请教linux驱动】【pwm子系统】【设备树devm_of_pwm_get】【卡死】

shiguojie19892 2021-05-13 06:43:02
请教:设备树设置了一个PWM引脚时,工作正常,但是设置两个PWM引脚,linux加载驱动就死机了,不明觉厉。设备树根目录和iomuxc:

fs_pwm {
compatible = "fs_pwm";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_fspwm>;
pwm_power {
pwm-names = "pwm_power";
pwms = <&pwm1 0 50000>;
};
pwm_motor {
pwm-names = "pwm_motor";
pwms = <&pwm2 0 50000>;
};

};


pinctrl_fspwm:fspwmgrp {
fsl,pins = <
MX6UL_PAD_LCD_DATA00__PWM1_OUT 0x1b0b0 /*/pwm1&motor pwm*/
MX6UL_PAD_LCD_DATA01__PWM2_OUT 0x1b0b0 /*/pwm1&motor pwm*/
>;

读取节点:

struct pwm_device *pwm_power_dev = NULL; //定义pwm设备结构体
struct pwm_device *pwm_motor_dev = NULL;
/*精简版 prob函数*/
static int pwm_power_probe_new(struct platform_device *pdev)
{
int ret = 0;
struct device_node * child;
struct device_node * child2;
struct device *dev = &pdev->dev;
printk("match success \n");

child = of_get_next_child(dev->of_node, NULL);
printk("\"%s\"'s child: \"%s\"\n", dev->of_node->full_name, child->full_name);
printk("%s %s line %d\r\n"__FILE__, __FUNCTION__, __LINE__);
if(NULL == child)
{
printk("of_get_next_child error\r\n");
}
if (child)
{
pwm_power_dev = devm_of_pwm_get(dev, child, NULL);
if (IS_ERR(pwm_power_dev))
{
printk(KERN_ERR" pwm_power_dev,get pwm error!!\n");
return -1;
}

//pwm_motor_dev = devm_of_pwm_get(dev, chile, )
}
else
{
printk(KERN_ERR" pwm_power_dev of_get_next_child error!!\n");
return -1;
}

child2 = of_get_next_child(dev->of_node, child);

printk("\"%s\"'s child2: \"%s\"\n", dev->of_node->full_name, child2->full_name);
printk("\"%s\"'s child2: \"%s\"\n", dev->of_node->full_name, child2->full_name);
printk("\"%s\"'s child2: \"%s\"\n", dev->of_node->full_name, child2->full_name);
printk("%s %s line %d\r\n"__FILE__, __FUNCTION__, __LINE__);
if(NULL == child2)
{
printk("of_get_next_child2 error\r\n");
}
if (child2)
{
if (IS_ERR(child2))
{
printk(KERN_ERR" of_get_next_child,child2 error!!\n");
return -1;
}

printk("\"%s\"'s devm_of_pwm_get: \"%s\"\n", dev->of_node->full_name, child2->full_name);
pwm_motor_dev = devm_of_pwm_get(dev, child2, NULL);//****这句代码死机,不再往下运行

if (IS_ERR(pwm_motor_dev))
{
printk(KERN_ERR" pwm_power_dev,get pwm error!!\n");
return -1;
}
}
else
{
printk(KERN_ERR" pwm_power_dev of_get_next_child error!!\n");
return -1;
}

printk("set pwm_power...\r\n");

/*配置频率100KHz 占空比80%*/
ret = pwm_config(pwm_power_dev, 1000, 5000);
printk("ret:%d\r\n", ret);
/*反相 频率100KHz 占空比20%*/
ret = pwm_set_polarity(pwm_power_dev, PWM_POLARITY_INVERSED);
printk("ret:%d\r\n", ret);
ret = pwm_enable(pwm_power_dev);
printk("ret:%d\r\n", ret);

printk("set pwm_motor...\r\n");
/*配置频率100KHz 占空比80%*/
ret = pwm_config(pwm_motor_dev, 1000, 5000);
printk("ret:%d\r\n", ret);
/*反相 频率100KHz 占空比20%*/
ret = pwm_set_polarity(pwm_motor_dev, PWM_POLARITY_NORMAL);
printk("ret:%d\r\n", ret);
ret = pwm_enable(pwm_motor_dev);
printk("ret:%d\r\n", ret);

return ret;
}
...全文
748 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yoveldf 2021-05-18
  • 打赏
  • 举报
回复
引用 6 楼 shiguojie19892 的回复:
引用 4 楼 yoveldf 的回复:
pwm_enable跟进去加打印信息看看 看到哪步错了,pwm的这种加法我也不太确定
没有启动pwm2时钟,导致卡死
建议你去看下pwm2 以及pinctrl_fspwm这两个具体是怎么定义的,如果解决不了,那就把pwm2参考pwm方式独立出来定义,这样应该就不会存在问题啦
shiguojie19892 2021-05-17
  • 打赏
  • 举报
回复
引用 4 楼 yoveldf 的回复:
pwm_enable跟进去加打印信息看看 看到哪步错了,pwm的这种加法我也不太确定
没有启动pwm2时钟,导致卡死
shiguojie19892 2021-05-14
  • 打赏
  • 举报
回复
好的,谢谢你!
yoveldf 2021-05-14
  • 打赏
  • 举报
回复
打印信息呢?报啥错误
yoveldf 2021-05-14
  • 打赏
  • 举报
回复
pwm_enable跟进去加打印信息看看 看到哪步错了,pwm的这种加法我也不太确定
shiguojie19892 2021-05-14
  • 打赏
  • 举报
回复
引用 1 楼 yoveldf 的回复:
打印信息呢?报啥错误
这次运行到使能pwm_motor_dev处就卡死了。
shiguojie19892 2021-05-14
  • 打赏
  • 举报
回复
没有报错,只是运行到上面代码54行,打印了54行的消息后,控制台就卡死不动了,不能输出、不能输入,同时pwm只是启动了第一个(频率、占空比也是对的 200Khz,80%占空比),下面的pwm没有启动。

21,619

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧