linux蜂鸣器驱动

与ledgpio类似之间的区别就是设备树的GPIO引脚不同

——————————————————————————————————————

1、在设备树中添加pinctrl和gpio子系统的设备节点

在&iomuxc 中添加pinctrl信息

pincrtl_beep: beepgrp{
            fsl,pins = <
            /*beep的外设电气属性 加 寄存器地址 SNVS_TAMPER1 GPIO5V IO01*/
            /*MX6UL_PAD_SNVS_TAMPER1__GPIO5_IO01    0x0020 0x02AC 0x0000 0x5 0x0在imx6ul-pinfun*/
                MX6ULL_PAD_SNVS_TAMPER1__GPIO5_IO01    0x10b0
            >;
        };   

在根节点下添加

      beep{
        compatible = "alientek,beep";
        //pinctrl子系统 控制外设寄存器地址和电气属性
        pinctrl-names = "default";
        pinctrl-0 = <&pincrtl_beep>;
        beep-gpios = <&gpio5 1 GPIO_ACTIVE_LOW>;//beep低电平有效
        status = "okay";
    };    

添加完之后检查 引脚i是否被其他外设使用

——————————————————————————————————————

2、驱动程序

/*gpioled设备结构体*/
/*该设备需要的*/

#define STRUCT_DEVICE_NAME beep
struct beep_dev
{
    dev_t devid; /*设备号 32位*/
    int major ;/*主设备号 高12位*/
    int minor ;/*次设备号 低20位*/
    /*cdev表示字符设备 结构体初始化就是初始化结构体变量*/
    struct cdev cdev ;//包含了操作函数集 和 设备号 包含头文件 #include <linux/cdev.h>
    struct class *class; /*类*/
    struct device *device; /*设备*/
    struct device_node *nd; //节点
    int num ;//GPIO子系统需要的编号
};

struct beep_dev STRUCT_DEVICE_NAME;

————————————————

/*入口 -注册字符设备*/中注册设备号 /cdev 具体的字符设备操作集合 向内核添加字符设备 自动创建设备节点 不变

    /*1-找到节点  dts文件中的节点信息 gpioled*/
    // beep{
    //     compatible = "alientek,beep";
    //     //pinctrl子系统 控制外设寄存器地址和电气属性
    //     pinctrl-names = "default";
    //     pinctrl-0 = <&pincrtl_beep>;
    //     beep-gpios = <&gpio5 1 GPIO_ACTIVE_HIGH>;//beep高电平有效
    //     status = "okay";
    // };
    /*全路径是  backlight---使用全路径查找*/
    STRUCT_DEVICE_NAME.nd = of_find_node_by_path("/beep");
    if(STRUCT_DEVICE_NAME.nd == NULL)//是否成功
    {
        ret = -EINVAL ; 
        goto failed_findnd;
    }

   /*2-获取编号属性*/ 

    /*获取beep对应的gpio led-gpios 获取 GPIO 编号*/  
    //gpio 的节点 获取GPIO信息的属性名  指定要获取哪个 GPIO的编号,如果只有一个 GPIO 信息的话此参数为 0
    //正值,获取到的 GPIO 编号;负值,失败。

    STRUCT_DEVICE_NAME.num = of_get_named_gpio(STRUCT_DEVICE_NAME.nd,"beep-gpios", 0);
    if( STRUCT_DEVICE_NAME.num < 0 )
    {
        printk("cant't find beep-gpios \r\n");
        ret = -EINVAL;
        goto failed_named;
    }

    printk("beep gpio num =%d \r\n" ,ret );

    /*3 获取编号后要使用 在使用一个 GPIO 之前要先申请*/
    //gpio_request 函数用于申请一个 GPIO 管脚
    //0,申请成功;其他值,申请失败
    //GPIO 的标号 给 gpio 设置个名字 
    //如果不申请就无法检测这个IO有没有被使用

    ret = gpio_request(STRUCT_DEVICE_NAME.num, "beepgpio");
    if(ret)
    {
        printk("falied to request the beep gpio \r\n");
        ret = -EINVAL;
        goto failed_request;
    }

    /*4————————申请成功后需要使用IO 子系统的API函数 beep是输出设备*/
    /*设置为输出*/
    //gpio:要设置为输入的 GPIO 标号 value:GPIO 默认输出值。
    //:0,设置成功;负值,设置失败

    ret = gpio_direction_output(STRUCT_DEVICE_NAME.num,0 );
    if(ret)
    {
        printk("falied to set the led gpio output \r\n");
        ret = -EINVAL;
        goto failed_output;
    }

    /*5——————设置输出后就可以控制beep输出高低电平了*/
    //输出低电平 beep叫
   // gpio:要设置的 GPIO 标号 value:要设置的值。
    gpio_set_value(STRUCT_DEVICE_NAME.num, 1);

——————————————————————————

操作函数中使用应用程序写入蜂鸣器 与led类似

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值