与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类似