at91sam9x5 linux 4.1.0下使能蜂鸣器驱动

测试环境:  CPU: AT91SAM9X35      Linux: Atmel提供的linux-at91-linux4sam_5.3 (Linux-4.1.0)

转载请注明: 凌云物网智科嵌入式实验室: http://iot-yun.com/     郭文学<[email protected]>

最新的atmel代码使用了Device Tree替换了以前的platform虚拟总线架构,该文章介绍了最新的Linux内核如何添加使能PWM控制蜂鸣器的全过程。目录结构:

1, DTS修改

2, Make menuconfig选项

3, 应用程序

4,测试

1, DTS修改

Linux内核里关于pwm-beeper驱动的DTS说明文档:

[[email protected] linux-at91-linux4sam_5.3]$ cat Documentation/devicetree/bindings/input/pwm-beeper.txt
* PWM beeper device tree bindings

Registers a PWM device as beeper.

Required properties:
- compatible: should be "pwm-beeper"
- pwms: phandle to the physical PWM device

在Linux内核的dts文件中,只有mini6410的dts文件中使用了pwm-beeper驱动,所以我们需要参考他来修改:

[[email protected] linux-at91-linux4sam_5.3]$ vim  arch/arm/boot/dts/s3c6410-mini6410.dts
    buzzer {
        compatible = "pwm-beeper";
        pwms = <&pwm 0 1000000 0>;
        pinctrl-names = "default";
        pinctrl-0 = <&pwm0_out>;
    };

修改at91sam9x35ek的DTS文件,添加pwm-beeper设备

[[email protected] linux-at91-linux4sam_5.3]$ vim  arch/arm/boot/dts/at91sam9x35ek.dts 

    ahb {
        apb {
            macb0: [email protected] {
                phy-mode = "rmii";
                status = "okay";
            };

            pwm0: [email protected] {
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_pwm0_pwm2_0>;
                status = "okay";
            };

    ...............

    buzzer {
        compatible = "pwm-beeper";
        pwms = <&pwm0 2 1000000 0>;
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_pwm0_pwm2_0>;
        status = "okay";
    };
   ...............

2, 内核make menuconfig

Linux内核自带PWM的beeper驱动drivers/input/misc/pwm-beeper.c,我们需要在make menuconfig中选中并使能它。

Device Drivers  --->
     Input device support  --->
           [*]   Miscellaneous devices  --->
                <*>   PWM beeper support
                 

内核编译启动后,我们可以看到新的蜂鸣器设备:

~ >: cat /proc/bus/input/
devices   handlers
~ >: cat /proc/bus/input/devices
I: Bus=0019 Vendor=001f Product=0001 Version=0100
N: Name="pwm-beeper"
P: Phys=pwm/input0
S: Sysfs=/devices/soc0/buzzer/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=40001
B: SND=6

~ >: ls /sys/class/input/event0/
dev        device     power      subsystem  uevent
~ >: ls /dev/input/event0
/dev/input/event0

3, 编写蜂鸣器测试应用程序

/*********************************************************************************
 *      Copyright:  (C) 2016 Guo Wenxue<[email protected]>
 *                  All rights reserved.
 *
 *       Filename:  test_buzzer.c
 *    Description:  This file
 *
 *        Version:  1.0.0(08/06/2016)
 *         Author:  Guo Wenxue <[email protected]>
 *      ChangeLog:  1, Release initial version on "08/06/2016 03:16:54 PM"
 *
 ********************************************************************************/

#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <fcntl.h>
#include <linux/input.h>
#include <errno.h>
#include <string.h>

#define DEV_BUZZER        "/dev/input/event0"
#define BUZZER_FREQ       2700  /* 2.7KHz */

int main(int argc, char **argv)
{
    int                   fd = -1;
    int                   version ;
    int                   rv;
    struct input_event    event;
    int                   freq = BUZZER_FREQ;

    if( argc != 2 )
    {
        printf("Usage: %s [freq<2700/0>]\n", argv[0]);
        return -1;
    }

    freq = atoi(argv[1]);

    if( (fd=open(DEV_BUZZER, O_RDWR)) < 0)
    {
        printf("open buzzer ‘%s‘ failure: %s\n", DEV_BUZZER, strerror(errno));
        return -2;
    }

    event.type = EV_SND;
    event.code = SND_TONE;
    event.value = freq;

    write(fd, &event, sizeof(struct input_event));

    close(fd);
    return 0;
}

4, 编译和测试

PC端编译:

[[email protected] utils]$ /opt/buildroot-2012.08/arm926t/usr/bin/arm-linux-gcc test_buzzer.c -o test_buzzer
[[email protected] utils]$ file test_buzzer
test_buzzer: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

ARM端下载测试

~ >: tftp -gr test_buzzer 192.168.2.18
test_buzzer          100% |*******************************|  5712   0:00:00 ETA
~ >: chmod a+x test_buzzer 

~ >: ./test_buzzer
Usage: ./test_buzzer [freq<2700/0>]
~ >: ./test_buzzer 2700       蜂鸣器的工作频率是2.7KHz,开启蜂鸣器
~ >: ./test_buzzer 0             传参数0则关闭蜂鸣器
时间: 2024-10-09 19:49:35

at91sam9x5 linux 4.1.0下使能蜂鸣器驱动的相关文章

Linux(CentOS 7.0)下使用yum安装配置和使用svn.

Linux(CentOS 7.0)下使用yum安装配置和使用svn. 转载就标明原地址:  http://blog.csdn.net/u010587274/article/details/51015291 个人微信公众号:tanzi_888 (潭子技术圈) 一  安装说明 系统环境:CentOS-7.0安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件 笔者用户:root 二 检查已安装版本 #检查是否安装了低版本的SVN[[email prot

at91 linux 4.1.0下dts驱动编程模型

下面的这个驱动文件at91_keyled.c在Atmel提供的linux-at91-linux4sam_5.3下实现了按键控制LED的亮灭过程,通过这个简单的驱动描述了基于DTS的驱动开发模型以及Linux内核里的GPIO相关的操作函数. 1 /********************************************************************************* 2 * Copyright: (C) 2016 Guo Wenxue<[email pro

Linux(CentOS 7.0)下Oracle11g R2安装CentOS7.0安装Oracle11gR2

// 注释 # root用户 $oracle用户 1. 关闭安全措施 # chkconfig iptables off // 永久关闭防火墙 # serviceiptables stop // 暂时关闭防火墙,重启系统后会自动打开 # sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config // 关闭Selinux 2. 验证硬件 2.1 内存: 要求:内存最小1G,推荐2G或者更高. 查看命令:# grep

Adobe/Flash Media Server 5.0 linux 64位系统下的安装

一.下载 Adobe/Flash MS5.0下载地址: http://fs1.d-h.st/download/00036/VOt/adobemediaserver_5_ls1_linux64.tar.gz # ./wget http://fs1.d-h.st/download/00036/VOt/adobemediaserver_5_ls1_linux64.tar.gz 二.安装 # ./tar -xvf adobemediaserver_5_ls1_linux64.tar.gz # ./cd

Linux(RHEL7.0)下安装nginx-1.10.2

查看当前系统版本是否支持 当前,nginx发布包支持以下Linux操作系统版本: RHEL/CentOS: Version Supported Platforms 5.x x86_64, i386 6.x x86_64, i386 7.x x86_64, ppc64le Debian: Version Codename Supported Platforms 7.x wheezy x86_64, i386 8.x jessie x86_64, i386 Ubuntu: Version Coden

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了

Linux下的网络设备驱动(一)

转载自: http://my.csdn.net/weiqing1981127 一.网络设备驱动基础 1.       以太网基础理论 以太网是局域网的一种,它使用载波监听多路访问及冲突检测技术(CSMA/CD),并以10M/S的速率运行在多种类型的电缆上,常用的网卡芯片有DM9000.DM9161.CS8900芯片. 以太网的拓扑结构有总线型和星型,以太网的工作模式有半双工和全双工.目前双绞线是以太网最普通的传输介质,它多用于从主机到集线器或交换机的连接,光纤主要用于交换机间的级联和交换机到路由

【CNMP系列】CentOS7.0下安装Nginx服务

话步前言,CNMP之路,系统起步:http://www.cnblogs.com/riverdubu/p/6425028.html 这回我来讲解下CentOS7.0下如何安装和配置Nginx服务 Nginx的历史不在此赘述,轻量,快是它的特性.只是因为现在的模块没有达到apache的模块数量级,未来有超越apache的势头. 首先,我们要安装个必要的软件(上节提到过,可能有人并未安装) #yum install wget 因为Nginx以来与gcc的编译环境,所以,在mini centos中需要安

linux中BASH_SOURCE[0]

在C/C++中,__FUNCTION__常量记录当前函数的名称.有时候,在日志输出的时候包含这些信息是非常有用的.而在Bash中,同样有这样一个常量FUNCNAME,但是有一点区别是,它是一个数组而非字符串,其中数组的第一个元素为当前函数的名称.可能初看有点难以理解,为什么FUNCNAME要是一个数组呢?看看下面的例子,你就明白了. 1 #!/bin/bash 2 3 function test_func() 4 { 5 echo "Current $FUNCNAME, \$FUNCNAME =