fl2440蜂鸣器测试程序和strcmp()及struct input_event 还有perror()浅析

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情


前面移植了内核自带的蜂鸣器驱动,现在有时间写一个最简单的测试程序,功能是打开蜂鸣器,或者关闭蜂鸣器。


  1 /*********************************************************************************
  2  *      Copyright:  (C) 2017 fanmaolin<fanmaolinn@gmail.com>
  3  *                  All rights reserved.
  4  *
  5  *       Filename:  test.c
  6  *    Description:  This file 
  7  *                 
  8  *        Version:  1.0.0(04/23/2017)
  9  *         Author:  fanmaolin <fanmaolinn@gmail.com>
 10  *      ChangeLog:  1, Release initial version on "04/23/2017 09:36:39 AM"
 11  *                 
 12  ********************************************************************************/
 13 
 14 #include<stdint.h>
 15 #include<string.h>
 16 #include<fcntl.h>
 17 #include<unistd.h>
 18 #include<stdio.h>
 19 #include<linux/input.h>
 20 #include<unistd.h>
 21 
 22 
 23 int main(int argc, char *argv[])
 24 {
 25     int fd;
 26     
 27     struct input_event event;
 28 
 29 
 30 
 31 if ((fd = open("/dev/event1", O_RDWR)) < 0) {			//打开dev/event1,设置为读写模式
 32 
 33     perror("beep test");						//如果文件打开失败,打印出错信息
 34 
 + testpwm.c                                                                                                                        
 35     return 1;
 36 
 37 }
 38 
 39 
 40 
 41     event.type = EV_SND;			//事件类型设置为支持声音
 42     event.code = SND_TONE;			//设置事件代码为SND_TONE
 43 
 44     if(!strcmp (argv[1],"1"))		//strcmp()函数用来比较两个字符串
 45     {
 46         {
 47             event.value = 2000;   //打开蜂鸣器  
 48             write(fd, &event, sizeof(struct input_event));
 49         }
 50     }
 51 
 52     else if(!strcmp (argv[1],"0"))
 53     {
 54 
 55             event.value = 0;//关闭蜂鸣器
 56             write(fd, &event, sizeof(struct input_event));
 57     }
 58 
 59    close(fd);		//释放占用资源
 60 
 61        return 0;
 62 
 63 }


[fanmaolin@centos6 ~]$ /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc test.c

把生成的a.out文件传到开发板上进行测试




OK


下面展开分析函数和程序

我的蜂鸣器测试程序使用了struct input_even结构体,在写按键驱动时也用到了这个,这里展开仔细讲一下

[fanmaolin@Centeros linux-3.0]$ vim include/linux/input.h    

linux/input.h中有定义,这个文件还定义了标准按键的编码等

struct input_event {

struct timeval time; //按键时间

__u16 type; //类型,在下面有定义

__u16 code; //要模拟成什么按键

__s32 value;//是按下还是释放

};


事件类型中可以看到支持声音

/*

* Event types

*/

#define EV_SYN 0x00

#define EV_KEY 0x01 //按键

#define EV_REL 0x02 //相对坐标(轨迹球)

#define EV_ABS 0x03 //绝对坐标

#define EV_MSC 0x04 //其他

#define EV_SW 0x05

#define EV_LED 0x11 //LED

#define EV_SND 0x12//声音

#define EV_REP 0x14//repeat

#define EV_FF 0x15 

#define EV_PWR 0x16

#define EV_FF_STATUS 0x17

#define EV_MAX 0x1f

#define EV_CNT (EV_MAX+1)



在头文件中追踪SND后发现event.code可以为两种模式

SND_BELL或SND_TONE



如果为SND_BELL,不管input_event.value为多少,最终的value只能为1000或0,即不能改变蜂鸣器的频率。1000表示蜂鸣器打开,0表示蜂鸣器关闭。
如果为SND_TONE,则可以通过改变input_event.value的值来调整蜂鸣器的频率,从而发出各种不同的音调。

至于为什么要使用struct input_even结构体有些时候我们要模拟按键来达到控制设备的目的,具体 方法就是操作/dev/input/eventx文件,向它写入个input_event结构体就可以模拟按键的输入了,查看/dev/input/eventX是什么类型的事件, cat /proc/bus/input/devices,比如我的测试程序中event.value=2000时蜂鸣器响,等于0时蜂鸣器关闭,就是相当于按键的event.value=1时按键按下,等于0时按键抬起,这就是一个模拟按键的典型例子,不同的是type,code,value不同。

http://blog.csdn.net/bingqingsuimeng/article/details/8178122(struct input_even结构体参考


strcmp()函数

int strcmp(const char *s1, const char *s2);

比较两个字符串

设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
44     if(!strcmp (argv[1],"1"))	
 52     else if(!strcmp (argv[1],"0"))
我们在这里,利用int main(int argc, char *argv[])

argc是命令行总的参数个数 , argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数命令行后面跟的用户输入的参数,char   *argv[]是一个字符数组,其大小是int   argc,主要用于命令行参数   argv[]   参数,数组里每个元素代表一个参数;   

 比如我们在执行这个程序时输入./a.out会导致段错误,因为没有给argv数组赋值,正确的是./a.out x ,这里的"x"会和“1”、“0”做比较,从而判断是否打开蜂鸣器。



perror()函数

  perror("beep test");	

#include <stdio.h>
void perror(const char *s);
perror ( )用 来 将 上 一 个 函 数 发 生 错 误 的 原 因 输 出 到 标 准 设备 (stderr) 。参数 s 所指的字符串会先打印出,后面再加上错误原因字符串。


问题总结:

一、

./a.out: line 1: syntax error: unexpected "("

要交叉编译 /opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc test1.c
生成的a.out才能在开发板上执行,这也是交叉编译器的作用。

二、
>: ./a.out
Segmentation fault

段错误,我没有给arg[]赋值,使他变成了野指针。在执行时应该./a.out 1 打开  或者 ./a.out 0 关闭,给它赋值“1”或“0”。上面也有分析。
详细解释:http://blog.chinaunix.net/uid-23069658-id-3959636.html

三、
我执行了./a.out 1 但是蜂鸣器并没有响,加了printf后,发现文件已经打开,但为什么蜂鸣器不能正常工作。

我们在启动开发板进入内核时,会有哔的一声,说明蜂鸣器驱动没有问题,后来发现是我们的测试程序打开错误的文件,之前看是event0但是后来移植了按键驱动后按键驱动变成了event0,蜂鸣器变为event1,所以应该open(event1...),用cat proc/bus/input/devices查看
这是之前的:

移植按键驱动后:


蜂鸣器的测试程序是模拟按键的,所以这里有kbd event1,但是我们要知道蜂鸣器是event1就可以了,所以应该是open("/dev/event1",O_RDWR),以后要特别注意这个问题。

参考:

strcmp():http://baike.baidu.com/link?url=1PJKyqgobTbIYt8fbVku1Loxdz4GEyqYjGAyAMpzNTJ61xT6Rvi_6DvGRVlD53tjnMfyZjvKFN-a9t3uHBT61_

perror():http://blog.csdn.net/ypist/article/details/7886209

struct input event :http://blog.sina.com.cn/s/blog_602f87700101dno6.html

     http://blog.csdn.net/bingqingsuimeng/article/details/8178122

基于S3C2440的Linux-3.6.6移植——PWM蜂鸣器驱动 Linux带有基于PWM蜂鸣器的通用驱动程序——Pwm-beeper.c(位于drivers/input/misc目录下),它是属于输入子系统的。因此要移植该驱动,只需要在自己的开发板程序文件中添加PWM蜂鸣器的平台设备及相关属性即可。   在arch/arm/mach-s3c24xx目录下的mach-zhaocj2440.c文件中的适当位置添加如下内容: /* beeper */ sta 阅读详情

相关推荐

Vivado与Robei 软件的结合,进行点灯蜂鸣器实验。

掌握Vivado与Robei 软件的结合,进行点灯蜂鸣器实验。• 使用 Robei 仿真模拟设计; • 使用提供的 Xilinx 设计约束(XDC)文件来约束引脚位置; • 合成并实现设计; • Vivado生成比特流; • 使用生成的比特流配置 FPGA 验证功能; • 使用 Zynq 开发板对项目进行验证;1.模型设计 (1)新建一个模型命名为 light,类型为 module,同时具备 1 输入 1 输出。每个引脚的属性名称参照下图 (2)**添加代码。**点击模型下方的 Code 添加代码。

qq_43695961的博客 839

蜂鸣器测试程序下载

蜂鸣器测试程序,应该还算不错吧,rar 文件直接解压就可以了

蜂鸣器标准测试demo

此demo是标准的linux pwm-beep引用app,调用的是驱动pwm-beep驱动提供的标准输入设备接口

【TINY4412】LINUX移植笔记:(18)设备树BEEP驱动

【TINY4412】LINUX移植笔记:(18)设备树 BEEP驱动 宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64 目标板[底板]: Tiny4412SDK - 1506 目标板[核心板]: Tiny4412 - 1412 LINUX内核: 4.12.0 交叉编译器: arm-none-linux-

大水猫 1466

linux蜂鸣器驱动指令,Linux 设备驱动简析—PC蜂鸣器驱动

/**By Neil Chiao ()*欢迎到“新星湾()”指导*/在X86平台的主板上一般都有一个蜂鸣器,有人可能认为这么简单的东西,根本不需要驱动吧?但是其实Linux内核中专门有一个这样的驱动pcspkr.c。(注意:本文分析的代码来自linux-2.6.28)1、从用户空间代码开始先看下面这个小程序,此程序的作用是让PC蜂鸣器叫,它open了/dev/tty10这个设备,难道PC蜂鸣器设备...

weixin_42125770的博客 889

Linux 通过uinput机制实现蜂鸣器驱动

通过uinput机制模拟了input设备,实现了蜂鸣器的控制。 系统内核:2.6.21 发布版本fedora7 1. 主要流程如下: 2. 详细代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/stat.h> #include &l...

MJZ0508 682

linux c蜂鸣器驱动程序,Linux 设备驱动简析—PC蜂鸣器驱动

/**By Neil Chiao ()*欢迎到“新星湾()”指导*/在X86平台的主板上一般都有一个蜂鸣器,有人可能认为这么简单的东西,根本不需要驱动吧?但是其实Linux内核中专门有一个这样的驱动pcspkr.c。(注意:本文分析的代码来自linux-2.6.28)1、从用户空间代码开始先看下面这个小程序,此程序的作用是让PC蜂鸣器叫,它open了/dev/tty10这个设备,难道PC蜂鸣器设备...

weixin_39593469的博客 295

input_event结构体详解

关键结构体input_event信息: struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value; }; type: 设备类型。可以设置为: #define EV_SYN          0x00    表示设备支持所有的事件 #define EV_KEY         

liwei405499的专栏 1万+

Linux下struct input_event结构体详解

linux 下 struct input_event结构体详解

weixin_47752005的博客 7781

关于蜂鸣器,看这篇足够了

压电蜂鸣器使用压电陶瓷制作,利用了压电陶瓷的压电效应,压电陶瓷的原理简单来说就是,给它加电它会动,给它加压力,它会产生电。电磁式蜂鸣器内部有线圈,在通断时会产生反向电动势,这个反向电动势会有几十伏电压,而压电式蜂鸣器内部没有线圈,不会有此问题。再来说一下,二极管选择,续流二极管不一定非要选择肖特基二极管,普通的二极管也能胜任,比如笔者使用的这一款VC1N4148WSB,反向恢复时间也非常快,满足设计要求。续流二极管一般用在无源电磁式蜂鸣器上面,压电陶瓷类型内部没有线圈,不会产生高压,无需增加续流二极管。

李肖遥的专栏 4712

嵌入式 LINUX 驱动开发 day03 学习USB 烧录扩展盘 的镜像,启动网络传输控制开发板的命令 , 使用网络传输在LINUX QT 运行代码传给开发板。

嵌入式 LINUX 驱动开发 day03 学习USB 烧录扩展盘 的镜像,启动网络传输控制开发板的命令 , 使用网络传输在LINUX QT 运行代码传给开发板。

she666666的博客 944

linux PWM蜂鸣器移植以及驱动程序分析【转】

本文转载自:https://blog.csdn.net/lxllinux/article/details/80885331 一、关于PWM: PWM(Pulse Width Modulation)——脉宽调制,它是利用微控制器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用于测量、通信、功率控制与变换等许多领域。 通过S3C2440底板原理图可知蜂鸣...

zzb2760715357的博客 572

linux下基于S3C2440的PWM蜂鸣器移植以及驱动程序分析

========================================================================== 主机操作系统:Centos 6.7  交叉编译器环境:arm-linux-gcc-4.5.4 (可通过命令/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc -v查询) 开发板平台: f

qicheng777的博客 1612

linux中mice mouseevent设备

参考:读取/dev/input/mice可以得到所有鼠标的信息,只要有鼠标读它就行,因为所有的鼠标的消息都会发给它一份,而且mice是全局唯一且固定的,所以即使没有插入鼠标设备,mice也是存在测试1:拔掉所有鼠标,用键盘输入ls /dev/input发现mice还在,而mouse(i)没了测试2:插上两个鼠标hexdump /dev/input/mouse0后移动这个设备对应的鼠标,桌面光标移动...

博客 8515

linux模拟按键时间,Linux模拟按键输入

在Linux应用层,可以往/dev/input/event...写入数据来模拟按键输入,程序如下:#include #include #include #include #include #include #include /*struct input_event {struct timeval time;__u16 type;__u16 code;__s32 value;};#define EV...

weixin_39984578的博客 160

struct input_event

struct input_event结构体是linux输入子系统的向应用层传递的接口。操作/dev/input/event1文件,写入个input_event结构体就可以模拟按键的输入。 #inlcude <linux/input.h> struct input_event { struct timeval time;//按键时间 __u16 ty...

zhangna的博客 943

测试方案_蜂鸣器测试方案介绍

蜂鸣器测试方案介绍图1主机+测试架1、 概述蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。根据蜂鸣器发声原理我们可分为有源蜂鸣器无源蜂鸣器,在日常使用时都需要对其工作性能进行测试。2、方案依据的标准:AWA6128B 型蜂鸣器测试仪执行《SJ/T 10382-199...

weixin_30653101的博客 2408

linux蜂鸣器测试程序

必要的头文件#include //必要的头文件 #include //POSIX终端控制定义 #include #include #define PWM_IOCTL_SET_FREQ 1 #define PWM_IOCTL_STOP 0 #define ESC_KEY 0x1b //定义ESC_KEY 为ESC按键的键值

iefswang的专栏 5043

srm32f4按键蜂鸣器_STM32f4---蜂鸣器实验代码

beep.c文件下代码:#include "beep.h"//初始化PF8为输出口//BEEP IO初始化void BEEP_Init(void){GPIO_InitTypeDefGPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟//初始化蜂鸣器对应引脚GPIOF8GPI...

weixin_39953845的博客 891
上一篇: fl2440移植RTC驱动及hwclock命令使用
下一篇: fl2440内核自带按键驱动移植及hexdump命令
fml1997
博客等级 码龄10年 30粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值