实验步骤:
1、设计一个简易蜂鸣器驱动
beep_drv.c

2、编译驱动
Makefile
生成ko文件

3、查看驱动的信息
#modinfo beep_drv.ko
在ubuntu上

4、下载ko到试验箱

5、安装ko—蜂鸣器响
#insmod beep_drv.ko
#lsmod

如果ko安装有错,说申请不到GPIO
解决:
Device Drivers —>
Character devices —>
<> LED Support for FriendlyARM Mini210 GPIO LEDs
<
> Buzzer driver for FriendlyARM Mini210 development boards
输入“N”
改成:
Device Drivers —>
Character devices —>
< > LED Support for FriendlyARM Mini210 GPIO LEDs
< > Buzzer driver for FriendlyARM Mini210 development boards
重新编译内核—>烧写内核

6、卸载驱动—蜂鸣器
#rmmod beep_drv
#lsmod

=================================================================================
二、前面还没有验收的实验,完成。

三、分析LED灯驱动
gec210_led.c

四、在project添加蜂鸣器的应用程序(驱动程序待定)
beep.h

#define BEEP_ON 1
#define BEEP_OFF 0

beep.c
int beep_ctrl(char beep_state)
{
参考:编写一个控制蜂鸣器的应用程序

}

一、编写一个控制蜂鸣器的应用程序

int main(void)
{
int fd_beep;
//1.打开蜂鸣器
fd_beep = open("/dev/beep_drv", O_RDWR);
if(fd_beep == -1)
{
perror(“open beep”);
return -1;
}

//2.向蜂鸣器写入控制命令
char beep_flag = 1;//1--on,0--off
write(fd_beep, &beep_flag, 1); //要设计一个驱动程序,与应用程序匹配//3.关闭蜂鸣器
close(beep_fd);return 0;

}

====================================================================================
二、蜂鸣器的原理图

处理器的GPIO引脚GPD0_0用来控制蜂鸣器,该引脚输出高电平,蜂鸣器响,引脚输出低电平,蜂鸣器不响。
见原理图。

====================================================================================
三、驱动程序设计思路
应用程序使用write(fd_beep, &beep_flag, 1);向驱动程序写入了数据;在驱动程序中,应该有函数接收到这个数据,并利用这个数据来控制GPIO的输出状态。

====================================================================================
四、驱动程序的设计步骤
1、设计一个内核模块—kernel module
内核模块相当于是一个“盒子”,这个盒子里面装的是一个驱动程序。驱动程序本身也是Linux内核中独立的一个模块。每设计一个驱动程序,就需要先设计一个模块。
模块编译后会生成ko文件,模块可安装可卸载。
#insmod beep_drv.ko (insert module—安装模块,相当于安装驱动,驱动安装到Linux内核中)
#rmmod beep_drv(remove module—卸载模块,相当于卸载驱动)
注意:驱动的安装过程和卸载过程是一个反过程,驱动安装从内核申请资源,驱动卸载释放资源给内核。
module由三部分组成的,分别是:头文件、驱动的入口和出口函数、驱动的描述

例:
//驱动的头文件
#include <linux/init.h>
#include <linux/module.h>

//蜂鸣器驱动的安装函数
static int __init mini210_beep_init(void)
{
//蜂鸣器的安装过程

printk("mini210 beep driver init....\n");
return 0;

}

//蜂鸣器驱动的卸载函数
static void __exit mini210_beep_exit(void)
{
//蜂鸣器驱动的卸载过程

printk("mini210 beep driver exit....\n");

}

//模块的入口和出口
module_init(mini210_beep_init);//#insmod beep_drv.ko–>驱动的入口
module_exit(mini210_beep_exit);//#rmmod beep_drv–>驱动的出口

//模块的描述(驱动的描述)
MODULE_AUTHOR(“bobeyfeng@163.com”);
MODULE_DESCRIPTION(“S5PV210 BEEP Device Driver”);
MODULE_LICENSE(“GPL”);
MODULE_VERSION(“V1.0”);


2、申请和释放GPIO口(GPD0_0引脚)

#include <linux/gpio.h>
1)申请GPIO
static inline int gpio_request(unsigned gpio, const char *label)
函数说明:
unsigned gpio----每个GPIO都有一个IO口号
const char *label ----- 自定义的GPIO名字
返回值:
成功,返回0;失败,返回负数的错误码

2)释放GPIO
void gpio_free(unsigned gpio)
函数说明:
unsigned gpio----每个GPIO都有一个IO口号

3)蜂鸣器GPIO的IO号是多少?
GPIO口号是每个GPIO的标志,每个GPIO都有唯一的一个GPIO号,它相当于GPIO的ID。
内核源码/arch/arm/mach-s5pv210/inlucde/mach/gpio.h
/* S5PV210 GPIO number definitions */

#define S5PV210_GPA0(_nr) (S5PV210_GPIO_A0_START + (_nr))
#define S5PV210_GPA1(_nr) (S5PV210_GPIO_A1_START + (_nr))
#define S5PV210_GPB(_nr) (S5PV210_GPIO_B_START + (_nr))
#define S5PV210_GPC0(_nr) (S5PV210_GPIO_C0_START + (_nr))
#define S5PV210_GPC1(_nr) (S5PV210_GPIO_C1_START + (_nr))
#define S5PV210_GPD0(_nr) (S5PV210_GPIO_D0_START + (_nr))
#define S5PV210_GPD1(_nr) (S5PV210_GPIO_D1_START + (_nr))
#define S5PV210_GPE0(_nr) (S5PV210_GPIO_E0_START + (_nr))
#define S5PV210_GPE1(_nr) (S5PV210_GPIO_E1_START + (_nr))
#define S5PV210_GPF0(_nr) (S5PV210_GPIO_F0_START + (_nr))
#define S5PV210_GPF1(_nr) (S5PV210_GPIO_F1_START + (_nr))
#define S5PV210_GPF2(_nr) (S5PV210_GPIO_F2_START + (_nr))
#define S5PV210_GPF3(_nr) (S5PV210_GPIO_F3_START + (_nr))
#define S5PV210_GPG0(_nr) (S5PV210_GPIO_G0_START + (_nr))
#define S5PV210_GPG1(_nr) (S5PV210_GPIO_G1_START + (_nr))
#define S5PV210_GPG2(_nr) (S5PV210_GPIO_G2_START + (_nr))
#define S5PV210_GPG3(_nr) (S5PV210_GPIO_G3_START + (_nr))
#define S5PV210_GPH0(_nr) (S5PV210_GPIO_H0_START + (_nr))
#define S5PV210_GPH1(_nr) (S5PV210_GPIO_H1_START + (_nr))
#define S5PV210_GPH2(_nr) (S5PV210_GPIO_H2_START + (_nr))
#define S5PV210_GPH3(_nr) (S5PV210_GPIO_H3_START + (_nr))
#define S5PV210_GPI(_nr) (S5PV210_GPIO_I_START + (_nr))
#define S5PV210_GPJ0(_nr) (S5PV210_GPIO_J0_START + (_nr))
#define S5PV210_GPJ1(_nr) (S5PV210_GPIO_J1_START + (_nr))
#define S5PV210_GPJ2(_nr) (S5PV210_GPIO_J2_START + (_nr))
#define S5PV210_GPJ3(_nr) (S5PV210_GPIO_J3_START + (_nr))
#define S5PV210_GPJ4(_nr) (S5PV210_GPIO_J4_START + (_nr))
#define S5PV210_MP01(_nr) (S5PV210_GPIO_MP01_START + (_nr))
#define S5PV210_MP02(_nr) (S5PV210_GPIO_MP02_START + (_nr))
#define S5PV210_MP03(_nr) (S5PV210_GPIO_MP03_START + (_nr))
#define S5PV210_MP04(_nr) (S5PV210_GPIO_MP04_START + (_nr))
#define S5PV210_MP05(_nr) (S5PV210_GPIO_MP05_START + (_nr))
#define S5PV210_MP06(_nr) (S5PV210_GPIO_MP06_START + (_nr))
#define S5PV210_MP07(_nr) (S5PV210_GPIO_MP07_START + (_nr))
#define S5PV210_MP10(_nr) (S5PV210_GPIO_MP10_START + (_nr))
#define S5PV210_MP11(_nr) (S5PV210_GPIO_MP11_START + (_nr))
#define S5PV210_MP12(_nr) (S5PV210_GPIO_MP12_START + (_nr))
#define S5PV210_MP13(_nr) (S5PV210_GPIO_MP13_START + (_nr))
#define S5PV210_MP14(_nr) (S5PV210_GPIO_MP14_START + (_nr))
#define S5PV210_MP15(_nr) (S5PV210_GPIO_MP15_START + (_nr))
#define S5PV210_MP16(_nr) (S5PV210_GPIO_MP16_START + (_nr))
#define S5PV210_MP17(_nr) (S5PV210_GPIO_MP17_START + (_nr))
#define S5PV210_MP18(_nr) (S5PV210_GPIO_MP18_START + (_nr))
#define S5PV210_MP20(_nr) (S5PV210_GPIO_MP20_START + (_nr))
#define S5PV210_MP21(_nr) (S5PV210_GPIO_MP21_START + (_nr))
#define S5PV210_MP22(_nr) (S5PV210_GPIO_MP22_START + (_nr))
#define S5PV210_MP23(_nr) (S5PV210_GPIO_MP23_START + (_nr))
#define S5PV210_MP24(_nr) (S5PV210_GPIO_MP24_START + (_nr))
#define S5PV210_MP25(_nr) (S5PV210_GPIO_MP25_START + (_nr))
#define S5PV210_MP26(_nr) (S5PV210_GPIO_MP26_START + (_nr))
#define S5PV210_MP27(_nr) (S5PV210_GPIO_MP27_START + (_nr))
#define S5PV210_MP28(_nr) (S5PV210_GPIO_MP28_START + (_nr))
#define S5PV210_ETC0(_nr) (S5PV210_GPIO_ETC0_START + (_nr))
#define S5PV210_ETC1(_nr) (S5PV210_GPIO_ETC1_START + (_nr))
#define S5PV210_ETC2(_nr) (S5PV210_GPIO_ETC2_START + (_nr))
#define S5PV210_ETC4(_nr) (S5PV210_GPIO_ETC4_START + (_nr))

所以得到GPD0_0引脚的GPIO号是S5PV210_GPD0(0)


3、配置GPIO为输出还是输出
int gpio_direction_output(unsigned gpio, int value)

int gpio_direction_input(unsigned gpio)


4、设置GPIO输出值或者获取GPIO的输入值
int gpio_get_value(unsigned gpio)
void gpio_set_value(unsigned gpio, int value)

Linux高级应用(十)控制蜂鸣器的应用程序相关推荐

  1. arm蜂鸣器程序 linux_Linux 下控制蜂鸣器发声的程序

    /*=========================================== *<Linux声音设备编程实例> * 1. 对内部扬声器编程 * 内部扬声器是控制台的一部分,所 ...

  2. Linux系统编程二:字符设备控制之点亮LED灯、控制蜂鸣器

    目录 一.概述 二.文件IO 2.1 open和close 2.2 write和read 2.3 ioctrl 三.点亮LED 3.1 程序流程 3.2 代码实现 3.3 编译验证 四.控制蜂鸣器 五 ...

  3. linux pwm控制蜂鸣器 滴滴_第七章----pwm蜂鸣器

    Linux代码的重用: 在头文件中加载即可使用到原来所有的功能,还有动态方式就是一个驱动使用另一个驱动的资源. 对于像蜂鸣器这样的实验,它的内部文件有很多,所有要有很多的源代码以用于妥善管理. 有多个 ...

  4. Linux高级服务搭建

    集群 集群原理 集群:一组协同工作的服务器对外表现为一个整体 LBC:负载均衡集群,多台主机承担压力请求 HAC:高可用集群,尽可能的保障服务的不间断运行 HPC:高性能运算集群,提供单台服务器提供不 ...

  5. Linux高级命令和Shell编程

    1.Linux高级命令 该章节的所有操作都在/export/data/shell目录进行,请提前创建该目录. mkdir -p /export/data/shell/ 1.1.重定向命令 1.重定向& ...

  6. linux web高级编程,寒假学习 第16.17天 (linux 高级编程)

    寒假学习 第16.17天 (linux 高级编程) 笔记 总结 一.进程的基本控制(进程的同步) 1.进程的常见控制函数 pause   sleep/usleep atexit   on_exit i ...

  7. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]

    Linux高级程序设计(第2版)以Linux操作系统(内核为2.6版本)为开发平台.GCC 4.0/GDB 6.3为开发调试环境,详细介绍了Linux系统下编程环境及编程工具.文件管理(文件类型.AN ...

  8. linux中ftp的工作原理,Linux系统学习 十二、VSFTP服务—简介与原理

    1.简介与原理 互联网诞生之初就存在三大服务:WWW.FTP.邮件 FTP主要针对企业级,可以设置权限,对不同等级的资料针对不同权限人员显示. 但是像网盘这样的基本没有权限划分. 简介: FTP(Fi ...

  9. Linux 高级流量控制

    原文链接:https://www.ibm.com/developerworks/cn/linux/1412_xiehy_tc/index.html Linux 高级流量控制 本篇主要讲用 TC 对 L ...

最新文章

  1. 厦门大学江保详:缺陷检测的讲解!
  2. python基础知识点-Python入门基础知识点(基础语法介绍)
  3. PHP工程师面临的成长瓶颈
  4. 幅度和幅值有区别吗_克拉克 (Clark) 变换中等幅值 (2/3) 和等功率 (sqrt(2/3)) 变换的公式推导...
  5. MVC PartialView
  6. linux下如何启动vsftp服务,如何在Ubuntu 18.04上使用VSFTP快速设置FTP服务器
  7. Python实现二叉搜索树
  8. 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别
  9. 计算机二级java应用题怎么答,2015年计算机二级考试JAVA基本操作和简单应用题
  10. 《朝歌封神录》10.22正式上线链游玩家|山海异闻、奇幻仙侠
  11. 如何写出吸引人的广告文案(一)
  12. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
  13. Pandas数据分析实战(1)——探索Chipotle快餐数据
  14. tp对接抖音sdk_Thinkphp集成抖音SDK的实现方法
  15. Tomcat无法启动,报错java.lang.NoClassDefFoundError: or...
  16. html语言让动画停止,如何停止svg动画?
  17. 【MQ-2 可燃气体和烟雾传感器与 Arduino 配合使用】
  18. iPad pro能运行c语言吗,科技:与苹果iPad Pro的USB-C兼容或不兼容的配件你都知道吗?...
  19. Linux下载hfs文件,linux读写mac HFS+
  20. excel打不开_excel表格打不开怎么办?excel表格打不开的解决方法

热门文章

  1. 新款武侠游戏 请名人献声
  2. linux查询awk命令用法
  3. HA集群强制进行Active/Standby切换的命令
  4. 团队项目(2.4) -- 《基于瞳孔检测的注意力检测研究》文献综述
  5. 油猴脚本——极简化百度知道/经验
  6. Python离线翻译
  7. html设置字体为5号,以下HTML代码中,哪一个是将词语“Run Away Bride”显示为Verdana字体并且字号为5号的正确代码?...
  8. MySQL 一键卸载
  9. 净亏10.89亿欧元!法雷奥:2021年仍需保持谨慎,ADAS业务表现最佳
  10. 微计算机断层扫描的用途以及测试样品要求