OK335xS pwm buzzer Linux driver hacking

/****************************************************************************
 *                 OK335xS pwm buzzer Linux driver hacking
 * 声明:
 *   本文仅仅是为了知道如何使用pwm来控制buzzer,已达到控制不同声音的频率。
 *
 *                                  2015-10-7 雨 深圳 南山平山村 曾剑锋
 ***************************************************************************/

#include <linux/init.h>
#include <linux/export.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/types.h>
#include <linux/io.h>
#include <linux/pwm/pwm.h>
#include <linux/fs.h>  

#define DEBUG
#if defined(DEBUG)
#define DPRINTK(fmt,arg...) printk(fmt,##arg);
#else
#define DPRINTK(fmt,arg...)
#endif

#define BUZZER_FREQENCY 1
#define DEV_NAME    "buzzer"

/*pwm for this buzzer*/
struct pwm_device *pwm = NULL;

static int buzzer_open(struct inode *inode, struct file *filp)
{

    if(pwm != NULL)
        return -EBUSY;

    /**
     * 申请一个pwm设备
     */
    pwm = pwm_request("ecap.1", -1, "buzzer");
    if ( pwm == NULL ) {
        printk("buzzer open error.\n");
    }

    printk("buzzer open\n");
    return 0;
}

static int buzzer_release(struct inode *inode, struct file *filp)
{
    /**
     * 关闭、注销一个pwm设备
     */
    pwm_stop(pwm);
    pwm_release(pwm);
    pwm = NULL;

    printk("buzzer release\n");

    return 0;
}

static long buzzer_ioctl(struct file *filp,
                        unsigned int cmd, unsigned long arg)
{

    if(pwm == NULL)
        return -EINVAL;

    if(arg > 20000 || arg < 0)
        return -EINVAL;

    switch (cmd) {
    case BUZZER_FREQENCY:       // 设置频率
        if(arg==0)
            pwm_stop(pwm);
        else
        {
            pwm_set_period_ns(pwm, 1000000000/arg);
            pwm_set_duty_ns(pwm, 25000);
            pwm_start(pwm);
        }

        break;
    default:
        break;
    }

    return 0;
}

static struct file_operations buzzer_fops = {
    .owner   = THIS_MODULE,
    .unlocked_ioctl     = buzzer_ioctl,
    .open    = buzzer_open,
    .release = buzzer_release,
};

static struct miscdevice buzzer_miscdev =
{
     .minor    = MISC_DYNAMIC_MINOR,
     .name    = DEV_NAME,
     .fops    = &buzzer_fops,
};

static int __init buzzer_init(void)
{
    /**
     * 注册杂项设备
     */
    misc_register(&buzzer_miscdev);
    return 0;
}

static void __exit buzzer_exit(void)
{
   misc_deregister(&buzzer_miscdev);
}

module_init(buzzer_init);
module_exit(buzzer_exit);
时间: 2025-01-04 16:37:06

OK335xS pwm buzzer Linux driver hacking的相关文章

OK335xS pwm device register hacking

/************************************************************************* * OK335xS pwm device register hacking * 声明: * 本文是对OK335xS pwm设备注册进行代码跟踪,其中有些部分是由于本人自己 * 添加的,但都是经过测试. * * 2015-8-25 晴 深圳 南山平山村 曾剑锋 *********************************************

OK335xS davinci mdio driver hacking

/******************************************************************************* * OK335xS davinci mdio driver hacking * 说明: * 以前一直也想对网卡驱动的工作原理进行跟踪,这次正好有机会,先跟mdio接口部分 * 的代码. * * 2016-3-1 深圳 南山平山村 曾剑锋 **************************************************

I.MX6 Linux I2C device&amp; driver hacking

/******************************************************************************************* * I.MX6 Linux I2C device& driver hacking * 声明: * 1. 本文主要是对Linux I2C驱动进行代码跟踪,主要是为了能够对I2C驱动框架有个全面的了解: * 2. 本文源代码来自myzr_android4_2_2_1_1_0.tar.bz2: * 3. 如果你有兴趣,

OK335xS 网络连接打印信息 hacking

/*********************************************************************** * OK335xS 网络连接打印信息 hacking * 说明: * 当我们插入网线的时候,经常会看到对应的网卡已连接,当前属于10M. * 100M网卡工作状态等等信息,那么这些信息是如何被输出的,工作机制是什么, * 网卡的速度是由phy决定的还是由mac决定的,是不是在phy对应的中断里处理, * 等等,这些内容都需要去确认. * * 2016-

OK335xS GPMC nand device register hacking

/********************************************************************************* * OK335xS GPMC nand device register hacking * 说明: * 由于最近遇到No NAND device found这个内核错误,在网络上也没找到很好的 * 解决办法,于是只能自己去跟踪整个设备.驱动的注册流程,试着去理解整个系统 * 的运作流程. * * 2015-9-2 雨 深圳 南山平山

I.MX6 ar1020 SPI device driver hacking

/************************************************************************************ * I.MX6 ar1020 SPI device driver hacking * 声明: * 1. 本文主要是解读I.MX6中ar1020 SPI设备注册,以及驱动调用流程: * 2. 本文主要使用了vim+ctags进行代码跟踪,所以几乎都是函数原型之间的调用: * * 2015-9-5 晴 深圳 南山平山村 曾剑锋 *

ubuntu14.04 android develop environment setup for android and linux driver

//For android and linux driver// 1,install ubuntu14.04 usb boot, CD boot, vmware workstation install, etc take usb boot for an example, download Universal-USB-Installer-1.9.5.6.exe and ubuntu-14.04.2-desktop-amd64.iso at windows xp platform. i take m

TI AM335x Linux MUX hacking

/********************************************************************************************* * TI AM335x Linux MUX hacking * 声明: * 1. 本文主要是对TI的AM335x Linux驱动中的引脚复用配置代码进行跟踪: * 2. 参考书籍:AM335x ARM® Cortex™-A8 Microprocessors (MPUs) Technical Reference

Linux driver 板级文件跟踪一般方法

/*********************************************************************************** * Linux driver 板级文件跟踪一般方法 * 声明: * 1. 这是本人使用vim+ctags最常用的跟踪方法,也是唯一的方法: :) * 2. 本人已经在跟踪线上标注了跟踪序号,也就是先后循序: * 3. 就目前而言,这种方法貌似是通用的: * 4. 这个例子仅仅是简单的演示,并没有全部展开,如果想要进一步跟踪, *