Linux3.5下的蜂鸣器驱动测试
2014-08-01 15:12
344 查看
因为是老大的一个小小任务的安排,要我测试我们公司的开发板EM4412(V2-4.2.2)的蜂鸣器,于是乎就到网上找资料,同时结合我们自己的开发板,终于搞定了。为此做一番记录,也是想跟朋友们分享。------每天进步一点点
参考资料:/article/9027287.html
1.编写PWM蜂鸣器驱动的测试程序。文件名:pwm_test.c.
2.在linux上交叉编译测试应用程序。
3.将生成的pwm_test复制到EM4412开发板的system目录下,然后进入开发板的system目录,给pwm_test权限。
4.运行pwm_test即可听到蜂鸣器的声音了。
同时,按“+”“—”修改蜂鸣器的频率,按ECS退出。
小小题外话:
为了感谢我的万师兄给我的另一种指令测试蜂鸣器,我也顺便记录下来。根据EM4412蜂鸣器的电路图,控制引脚为GPD0_0,需要给一个高电平就开启,低电平就关闭。同时结合控制寄存器和数据寄存器地址,在终端直接输入以下命令即可。
开启蜂鸣器:
关闭蜂鸣器:
参考资料:/article/9027287.html
1.编写PWM蜂鸣器驱动的测试程序。文件名:pwm_test.c.
#include <stdio.h> //必要的头文件--输入输出函数定义 #include <termios.h> //POSIX终端控制定义 #include <unistd.h> //Unix 标准函数定义 #include <stdlib.h> //标准函数库定义 #define PWM_IOCTL_SET_FREQ 1 #define PWM_IOCTL_STOP 0 #define ESC_KEY 0x1b //定义ESC_KEY 为ESC按键的键值 static int getch(void) // 从终端获得输入,并把输入转化为int返回 { struct termios oldt,newt; //终端结构体struct termios int ch; if (!isatty(STDIN_FILENO)) {//判断串口是否与标准输入相连,isatty(fd)判断fd是否是终端设备 fprintf(stderr, "this problem should be run at a terminal\n"); exit(1); } // save terminal setting if(tcgetattr(STDIN_FILENO, &oldt) < 0){ //(获取终端的设置参数)过去fd的终端属性,并把它放入oldt中断结构体中,以为后面恢复使用 perror("save the terminal setting"); exit(1); } // set terminal as need newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); //控制终端编辑功能参数ICANON 表示使用标准输入模式;参数ECH0表示进行回送,显示输入符号 if(tcsetattr(STDIN_FILENO,TCSANOW, &newt) < 0) { //保存新的终端参数,表示更改立即生效 perror("set terminal"); exit(1); } ch = getchar(); // 输入数据 // restore termial setting if(tcsetattr(STDIN_FILENO,TCSANOW,&oldt) < 0) { // 恢复原来的终端属性 perror("restore the termial setting"); exit(1); } return ch; } static int fd = -1; static void close_buzzer(void); //关闭蜂鸣器 static void open_buzzer(void) //打开蜂鸣器 { fd = open("/dev/pwm", 0); //打开蜂鸣器的设备文件 if (fd < 0) { //打开失败 perror("open pwm_buzzer device"); exit(1); //打开错误,则终止进程。退出参数为1 } // any function exit call will stop the buzzer atexit(close_buzzer); //退出回调close_buzzer } static void close_buzzer(void) //关闭蜂鸣器 { if (fd >= 0) { ioctl(fd, PWM_IOCTL_STOP); //停止蜂鸣器 close(fd); //关闭设备驱动程序文件 fd = -1; } } static void set_buzzer_freq(int freq) { // this IOCTL command is the key to set frequency int ret = ioctl(fd, PWM_IOCTL_SET_FREQ, freq); //设置蜂鸣器的频率 if(ret < 0) { //如果设置出错 perror("set the frequency of the buzzer"); exit(1); //退出,返回1。 } } static void stop_buzzer(void) { int ret = ioctl(fd, PWM_IOCTL_STOP); //关闭蜂鸣器 if(ret < 0) { //如果无法关闭蜂鸣器 perror("stop the buzzer"); exit(1); //退出,返回1。 } } int main(int argc, char **argv) { int freq = 1000 ; open_buzzer(); //打开蜂鸣器 //打印提示信息 printf( "\nBUZZER TEST ( PWM Control )\n" ); printf( "Press +/- to increase/reduce the frequency of the BUZZER\n" ) ; printf( "Press 'ESC' key to Exit this program\n\n" ); while( 1 ) { int key; set_buzzer_freq(freq); //设置蜂鸣器的频率 printf( "\tFreq = %d\n", freq ); key = getch(); //从键盘获取数据 switch(key) { //输入数据判断 case '+': if( freq < 20000 ) freq += 10; break; case '-': if( freq > 11 ) freq -= 10 ; break; case ESC_KEY: case EOF: stop_buzzer(); //停止蜂鸣器 exit(0); default: break; } } }
2.在linux上交叉编译测试应用程序。
#arm-linux-gcc -o pwm_test pwm_test.c -static
3.将生成的pwm_test复制到EM4412开发板的system目录下,然后进入开发板的system目录,给pwm_test权限。
#chmod 777 pwm_test
4.运行pwm_test即可听到蜂鸣器的声音了。
# ./pwm_test
同时,按“+”“—”修改蜂鸣器的频率,按ECS退出。
小小题外话:
为了感谢我的万师兄给我的另一种指令测试蜂鸣器,我也顺便记录下来。根据EM4412蜂鸣器的电路图,控制引脚为GPD0_0,需要给一个高电平就开启,低电平就关闭。同时结合控制寄存器和数据寄存器地址,在终端直接输入以下命令即可。
开启蜂鸣器:
# echo "114000A4=1" > /proc/regwatch
关闭蜂鸣器:
# echo "114000A4=0" > /proc/regwatch
相关文章推荐
- Linux3.5下的PWM蜂鸣器驱动测试 (2)
- Linux下简易蜂鸣器驱动代码及测试实例
- linux驱动开发之九鼎板载蜂鸣器驱动测试【转】
- 编译和安装linux内核2.6.24,并且写一个简单的内核驱动测试之
- linux下测试RTC驱动相关的命令date和hwclock常见用法简介
- linux下测试RTC驱动date和hwclock
- PWM在ARM Linux中的原理和蜂鸣器驱动实例开发
- Linux: 输入设备驱动测试程序
- linux蜂鸣器测试程序
- Linux驱动:LED驱动测试
- Linux驱动:内核延时测试
- 嵌入式Linux之我行——PWM在ARM Linux中的原理和蜂鸣器驱动实例开发
- Linux驱动:用户空间,内核空间内存交互测试
- Linux驱动:阻塞式读写测试
- linux驱动加载查看测试 步骤
- Linux下SPI驱动的移植和应用程序的测试
- Linux2.6内核TouchScreen驱动移植(已测试)
- 编译和安装linux内核2.6.x,一个简单的内核驱动测试
- linux-2.6.26下SPI1(4) S3C2440 spi驱动简单测试
- Linux驱动:信号量同步测试