查看: 4729|回复: 3

[求助] IMX6S LINUX3.0.35 PWM驱动问题

[复制链接]

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
9
最后登录
2016-12-1
发表于 2016-11-30 17:21:52 | 显示全部楼层 |阅读模式
使用LINUX3.0.35的内核,并配置了内核PWM的支持,自己写了PWM1~4路的驱动程序并编译成了驱动模块(模块初始化时就会输出波形),通过手动方式加载到开发板中,但从各引脚上测量不到有波形输出。
求一个可行的参考案例。

这个是我当前的驱动代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <asm/gpio.h>
#include <linux/pwm.h>
#include <linux/clk.h>



#define PWM1_ON          0x00010001
#define PWM1_OFF         0x00010002
#define PWM1_DUTY        0x00010003
#define PWM2_ON          0x00020001
#define PWM2_OFF         0x00020002
#define PWM2_DUTY        0x00020003
#define PWM3_ON          0x00030001
#define PWM3_OFF         0x00030002
#define PWM3_DUTY        0x00030003
#define PWM4_ON          0x00040001
#define PWM4_OFF         0x00040002
#define PWM4_DUTY        0x00040003
#define PWM_PERIOD        0x00050000

unsigned int nPWMPeriod=10000000; //PWM周期

struct pwm_device *pwm_dev_1=NULL;
struct pwm_device *pwm_dev_2=NULL;
struct pwm_device *pwm_dev_3=NULL;
struct pwm_device *pwm_dev_4=NULL;

static long pwm_ioctl(struct file *file, unsigned int cmd, unsigned long arg);


static struct file_operations pwm_fops =
{
    .owner = THIS_MODULE,
    .unlocked_ioctl = pwm_ioctl
};

static struct miscdevice pwm_misc =
{
    .minor = MISC_DYNAMIC_MINOR,
    .name = "mypwm",             //dev/mypwm
    .fops = &pwm_fops
};

static long pwm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
        int ret=-1;

        switch (cmd)
        {
        case PWM1_ON:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_1, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_1 ioctl fail\r\n");
                        return ret;
                }
                pwm_enable(pwm_dev_1);
               
                break;
        case PWM1_OFF:
                ret = pwm_config(pwm_dev_1, 0, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_1 ioctl fail\r\n");
                        return ret;
                }
                pwm_disable(pwm_dev_1);
               
                break;
        case PWM1_DUTY:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_1, arg, nPWMPeriod);
                if(ret < ret)
                {
                        printk("pwm_dev_1 ioctl config err\r\n");
                        return 0;
                }
               
                break;
        case PWM2_ON:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_2, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_2 ioctl fail\r\n");
                        return ret;
                }
                pwm_enable(pwm_dev_2);
               
                break;
        case PWM2_OFF:
                ret = pwm_config(pwm_dev_2, 0, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_2 ioctl fail\r\n");
                        return ret;
                }
                pwm_disable(pwm_dev_2);
               
                break;
        case PWM2_DUTY:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_2, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_2 ioctl config err\r\n");
                        return ret;
                }               
               
                break;
        case PWM3_ON:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_3, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_3 ioctl fail\r\n");
                        return ret;
                }
                pwm_enable(pwm_dev_3);
               
                break;
        case PWM3_OFF:
                ret = pwm_config(pwm_dev_3, 0, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_3 ioctl fail\r\n");
                        return ret;
                }
                pwm_disable(pwm_dev_3);
               
                break;
        case PWM3_DUTY:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_3, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_3 ioctl config err\r\n");
                        return ret;
                }
               
                break;
#if 1
        case PWM4_ON:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_4, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_4 ioctl fail\r\n");
                        return ret;
                }
                pwm_enable(pwm_dev_4);
               
                break;
        case PWM4_OFF:
                ret = pwm_config(pwm_dev_4, 0, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_4 ioctl fail\r\n");
                        return ret;
                }
                pwm_disable(pwm_dev_4);
               
                break;
        case PWM4_DUTY:
                arg =  (arg>2000000 ? 2000000 : arg);
                ret = pwm_config(pwm_dev_4, arg, nPWMPeriod);
                if(ret < 0)
                {
                        printk("pwm_dev_4 ioctl config err\r\n");
                        return ret;
                }
               
                break;
        case PWM_PERIOD:
                arg =  (arg<2200000 ? 2200000 : arg);
                nPWMPeriod = (unsigned int)arg;
               
                break;
#endif
        default:
                return ret;
        }

        return ret;
}


static int pwm_init(void)
{
    int ret=-1;
       
    printk("regisger pwm_misc device\r\n");
    pwm_dev_1 = pwm_request(0, "pwm_1");
    if(pwm_dev_1==ERR_PTR(-EBUSY) || pwm_dev_1==ERR_PTR(-ENOENT))
        {
        printk("pwm_dev_1 register fail\r\n");
                return (int)pwm_dev_1;
    }

        pwm_dev_2 = pwm_request(1, "pwm_2");
        if(pwm_dev_2==ERR_PTR(-EBUSY) || pwm_dev_2==ERR_PTR(-ENOENT))
        {
                printk("pwn_dev_2 register fail\r\n");
                return (int)pwm_dev_2;
        }
       
        pwm_dev_3 = pwm_request(2, "pwm_3");
        if(pwm_dev_3==ERR_PTR(-EBUSY) || pwm_dev_3==ERR_PTR(-ENOENT))
        {
                printk("pwn_dev_3 register fail\r\n");
                return (int)pwm_dev_3;
        }
       
        pwm_dev_4 = pwm_request(3, "pwm_4");
        if(pwm_dev_4==ERR_PTR(-EBUSY) || pwm_dev_4==ERR_PTR(-ENOENT))
        {
                printk("pwn_dev_4 register fail\r\n");
                return 0;
        }

    printk("pwconfig\r\n");
        ret = pwm_config(pwm_dev_1, 1000000, nPWMPeriod);
        if(ret < 0)
        {
                printk("pwm_config_1 init fail\r\n");
                return ret;
        }
    printk("pwconfig1\r\n");
       
        ret = pwm_config(pwm_dev_2, 1000000, nPWMPeriod);
        if(ret < 0)
        {
                printk("pwm_config_2 init fail\r\n");
                return ret;
        }
    printk("pwconfig2\r\n");
       
        ret = pwm_config(pwm_dev_3, 1000000, nPWMPeriod);
        if(ret < 0)
        {
                printk("pwm_config_3 init fail\r\n");
                return ret;
        }
    printk("pwconfig3\r\n");
       
        ret = pwm_config(pwm_dev_4, 1000000, nPWMPeriod);
        if(ret < 0)
        {
                printk("pwm_config_4 init fail\r\n");
                return ret;
        }
    printk("pwconfig4\r\n");

        ret = pwm_enable(pwm_dev_1);
        if(ret == 0)
        {
                printk("pwm_enable_dev_1 init success\r\n");
        }
        else if(ret < 0 )
        {
                printk("pwm_enable_dev_1 init fail\r\n");
                return ret;
        }
       
        ret = pwm_enable(pwm_dev_2);
        if(ret == 0)
        {
                printk("pwm_enable_dev_2 init success\r\n");
        }
        else if(ret < 0 )
        {
                printk("pwm_enable_dev_2 init fail\r\n");
                return ret;
        }

        ret = pwm_enable(pwm_dev_3);
        if(ret == 0)
        {
                printk("pwm_enable_dev_3 init success\r\n");
        }
        else if(ret < 0 )
        {
                printk("pwm_enable_dev_3 init fail\r\n");
                return ret;
        }

        ret = pwm_enable(pwm_dev_4);
        if(ret == 0)
        {
                printk("pwm_enable_dev_4 init success\r\n");
        }
        else if(ret < 0 )
        {
                printk("pwm_enable_dev_4 init fail\r\n");
                return ret;
        }
       
    ret = misc_register(&pwm_misc);

        return ret;
}

static void pwm_exit(void)
{
    printk("unregister pwm_misc device\r\n");
    misc_deregister(&pwm_misc);

        pwm_config(pwm_dev_1,0,10000000);
        pwm_disable(pwm_dev_1);
        pwm_free(pwm_dev_1);
       
        pwm_config(pwm_dev_2,0,10000000);
        pwm_disable(pwm_dev_2);
        pwm_free(pwm_dev_2);
       
        pwm_config(pwm_dev_3,0,10000000);
        pwm_disable(pwm_dev_3);
        pwm_free(pwm_dev_3);
       
        pwm_config(pwm_dev_4,0,10000000);
        pwm_disable(pwm_dev_4);
        pwm_free(pwm_dev_4);
}

module_init(pwm_init);
module_exit(pwm_exit);
MODULE_LICENSE("GPL");


我知道答案 目前已有3人回答
回复

使用道具 举报

该用户从未签到

20

主题

809

帖子

1

超级版主

Rank: 8Rank: 8

积分
1566
最后登录
2023-1-17
发表于 2016-12-1 16:45:27 | 显示全部楼层
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
9
最后登录
2016-12-1
 楼主| 发表于 2016-12-1 19:14:01 | 显示全部楼层
多谢推荐文章对以后用3.14的核有用。现在已经驱好了,引脚功能配置改错地方了。
回复 支持 反对

使用道具 举报

该用户从未签到

20

主题

809

帖子

1

超级版主

Rank: 8Rank: 8

积分
1566
最后登录
2023-1-17
发表于 2016-12-6 13:44:04 | 显示全部楼层
zhanghong 发表于 2016-12-1 19:14
多谢推荐文章对以后用3.14的核有用。现在已经驱好了,引脚功能配置改错地方了。 ...

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 12:20 , Processed in 0.090212 second(s), 24 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表