搜索
12
返回列表

1

主题

11

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2016-12-13 10:33:44


你好,试了一下,没有实现。请问,任何一个GPIO都能用来发脉冲吗?如果都可以拿来发脉动的话,请问完整的驱动注册的流程是什么?我按着数据手册里,先在/driver/char/kconfig/里仿照LED的写,接着在源码中打开menuconfig配置,在.config里能看到宏定义,接着按照驱动实验手册的设备注册和驱动注册这两章进行配置。可是我的那些IO口好像还是不能用啊。我就想想问一个完整的驱动注册的流程。好迷糊啊,能不能帮我缕缕思路?谢谢~~~~~
回复 点赞

使用道具 举报

48

主题

604

帖子

1923

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1923
发表于 2016-12-14 09:38:37
可以仿照led的来呀~
高低电平的规律的变化就是脉冲波了
回复 点赞

使用道具 举报

1

主题

11

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2016-12-16 17:00:25
本帖最后由 zz咚咚 于 2016-12-16 17:03 编辑

我配置蜂鸣器那个口了,然后下到板子里不能实现,提示找不到设备,能不能帮我看一下我哪里错了?下面是我的驱动代码(道长给的)#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/backlight.h>
#include <linux/err.h>
#include <linux/pwm.h>
#include <linux/slab.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>

//定义设备的名字为 pwm
#define DEVICE_NAME                                "pwm"

#define PWM_IOCTL_SET_FREQ                1
#define PWM_IOCTL_STOP                        0

#define NS_IN_1HZ                                (1000000000UL)

//蜂鸣器PWM_ID  0
#define BUZZER_PWM_ID                        0
//蜂鸣器GPIO配置
#define BUZZER_PMW_GPIO                        EXYNOS4_GPD0(0)

//定义一个结构体指针
static struct pwm_device *pwm4buzzer;
//定义一个结构体信号量指针,因为信号量与锁的机制差不多
//Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。
//Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。
static struct semaphore lock;

//设置频率
static void pwm_set_freq(unsigned long freq) {
//PWM的占空比的配置
        //printk("pwm_set_freq start");
        int period_ns = NS_IN_1HZ / freq;

        pwm_config(pwm4buzzer, period_ns / 2, period_ns);
        pwm_enable(pwm4buzzer);
        //配置相应的GPIO,将蜂鸣器IO配置成PWM输出模式
        s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_SFN(2));
}
//stop方法函数,来源于operations结构体
static  void pwm_stop(void) {
        //printk("pwm_stop start");
        s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_OUTPUT);

        pwm_config(pwm4buzzer, 0, NS_IN_1HZ / 100);
        pwm_disable(pwm4buzzer);
}

//open方法函数,来源于operations结构体,主要打开pwm的操作
static int iTop4412_pwm_open(struct inode *inode, struct file *file) {
        //printk("iTop4412_pwm_open start");
        if (!down_trylock(&lock)) //尝试加锁,如果失败返回0
                return 0;
        else
                return -EBUSY;
}

//close方法函数,来源于operations结构体,主要是关闭pwm操作
static int iTop4412_pwm_close(struct inode *inode, struct file *file) {
        //printk("iTop4412_pwm_close start");
        up(&lock);
        return 0;
}
//控制io口方法函数,来源于operations结构体,其实就是上层系统调用传入一条命令,//驱动识别命令,然后执行相应过程。
static long iTop4412_pwm_ioctl(struct file *filep, unsigned int cmd,
                unsigned long arg)
{
        //printk("iTop4412_pwm_ioctl start");
        switch (cmd) {
                case PWM_IOCTL_SET_FREQ:
                        if (arg == 0)
                                return -EINVAL;
                        pwm_set_freq(arg);
                        break;

                case PWM_IOCTL_STOP:
                default:
                        pwm_stop();
                        break;
        }

        return 0;
}

//这就是我们要看的结构体了,其实这个结构体的定义在另一个.h当中,看看它的初始//化方式,跟我们上面那个程序的分析基本上是一样的。对应的函数名(也就是函数的//首地址)赋值给对应的结构体成员,实现了整个结构体的初始化,这样的方法类似于//C++和JAVA等高级语言的操作。
static  struct file_operations iTop4412_pwm_ops = {
        .owner                        = THIS_MODULE,                          //表示本模块拥有
        .open                        = iTop4412_pwm_open,                //表示调用open函数
        .release                = iTop4412_pwm_close,         //…
        .unlocked_ioctl        = iTop4412_pwm_ioctl,
};

//杂类设备的注册
static struct miscdevice iTop4412_misc_dev = {
        .minor = MISC_DYNAMIC_MINOR,
        .name = DEVICE_NAME,
        .fops = &iTop4412_pwm_ops,
};
//pwm设备初始化,设备在被insmod插入模块到内核的过程中会调用这个函数
static int __init iTop4412_pwm_dev_init(void) {
        //printk("iTop4412_pwm_dev_init start");
        int ret;
        gpio_free(BUZZER_PMW_GPIO);
        
        ret = gpio_request(BUZZER_PMW_GPIO, DEVICE_NAME);
        if (ret) {
                printk("request GPIO %d for pwm failed\n", BUZZER_PMW_GPIO);
                return ret;
        }

        gpio_set_value(BUZZER_PMW_GPIO, 0);
        s3c_gpio_cfgpin(BUZZER_PMW_GPIO, S3C_GPIO_OUTPUT);

        pwm4buzzer = pwm_request(BUZZER_PWM_ID, DEVICE_NAME);
        if (IS_ERR(pwm4buzzer)) {
                printk("request pwm %d for %s failed\n", BUZZER_PWM_ID, DEVICE_NAME);
                return -ENODEV;
        }

        pwm_stop();

        sema_init(&lock, 1);
        ret = misc_register(&iTop4412_misc_dev);

        printk(DEVICE_NAME "\tinitialized\n");

        return ret;
}
//设备在被卸载rmmod的过程中会调用这个函数
static void __exit iTop4412_pwm_dev_exit(void) {
        //printk("iTop4412_pwm_exit start");
        pwm_stop();

        misc_deregister(&iTop4412_misc_dev);
        gpio_free(BUZZER_PMW_GPIO);
}

//模块初始化
module_init(iTop4412_pwm_dev_init);
//销毁模块
module_exit(iTop4412_pwm_dev_exit);
//声明GPL协议
MODULE_LICENSE("GPL");
//作者:yangyuanxin
MODULE_AUTHOR("Yangyuanxin");
//描述:三星PWM设备
MODULE_DESCRIPTION("Exynos4 PWM Driver");


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 点赞

使用道具 举报

48

主题

604

帖子

1923

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1923
发表于 2016-12-19 14:19:36
你申请pwm错误呀
回复 点赞

使用道具 举报

1

主题

11

帖子

64

积分

注册会员

Rank: 2

积分
64
 楼主| 发表于 2016-12-19 22:27:35

怎么个错误法?能否指出来啊?
回复 点赞

使用道具 举报

0

主题

2

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2019-1-16 09:19:00
zz咚咚 发表于 2016-12-16 17:00
我配置蜂鸣器那个口了,然后下到板子里不能实现,提示找不到设备,能不能帮我看一下我哪里错了?下面是我 ...

请问你解决了吗,遇到同样的问题了
回复 点赞

使用道具 举报

12
返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录或注册

官方客服

QQ:2551456065

官方QQ群

195631883

扫一扫关注迅为公众号

群号652692981

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