最近在看一本书,受益匪浅,作者是李宁,下边是编写本次蜂鸣器的全程实录:

1. 了解开发板中的蜂鸣器

1) 查看蜂鸣器buzzer在底板中的管脚信息

2) 查看蜂鸣器在总线中的信息

3) 翻看S3C6410芯片手册,查看GPF15相关信息

2. 在了解了开发板中蜂鸣器之后,编写代码对它进行控制。

由于蜂鸣器是通过PWM(脉冲宽度调制)进行开关控制的,故也称为PWM。

1) 编写pwm.c(包含Linux驱动模块的主要模型代码)

#include "pwm_fun.h"

static struct semaphore lock; /*创建信号量*/

//文件打开时,自动操作此函数,使用信号量控制其访问

static int s3c6410_pwm_open(struct inode *inode, struct file *file){if (!down_trylock(&lock)) /*使用信号量控制只能由一个进程打开*/{return 0;

}else{return -EBUSY;

}

}//文件关闭时,自动操作此函数,使用信号量控制其访问

static int s3c6410_pwm_close(struct inode *inode, struct file *file){

up(&lock); /*释放信号量*/

return 0;

}//文件中关于ioctl的操作

static long s3c6410_pwm_ioctl(struct file *filep, unsigned int cmd, unsigned longarg){switch( cmd ) {casePWM_IOCTL_START:

pwm_start();break;casePWM_IOCTL_STOP:

pwm_stop();break;default:break;

}/*----- end switch -----*/

return 0;

}//文件操作的指针

static struct file_operations dev_fops ={

.owner=THIS_MODULE,

.open=s3c6410_pwm_open,

.release=s3c6410_pwm_close,

.unlocked_ioctl=s3c6410_pwm_ioctl,

};//设备的属性

static struct miscdevice misc ={

.minor=MISC_DYNAMIC_MINOR,

.name=DEVICE_NAME,

.fops= &dev_fops,

};//驱动的入口函数

static int __init dev_init(void){intret;

init_MUTEX(&lock); /*初始化信号量*/ret= misc_register(&misc);

printk(DEVICE_NAME"initialized");returnret;

}//驱动的退出函数

static void __exit dev_exit(void){

misc_deregister(&misc);

printk(DEVICE_NAME"exited");

}

module_init(dev_init);

module_exit(dev_exit);

2) 编写pwm_fun.c(包含对蜂鸣器控制的主要代码)

#include "pwm_fun.h"

void pwm_start(void){

unsignedinttmp;

tmp=ioread32(S3C64XX_GPFCON);

tmp&= ~(0x3U<<30); /*最高两位清零,保留其他位*/tmp|= (0x2U<<30); /*最高两位设置为10,蜂鸣器发出尖叫声*/iowrite32(tmp, S3C64XX_GPFCON);

}void pwm_stop(void){

unsigned tmp;

tmp=ioread32(S3C64XX_GPFCON);

tmp&= ~(0x3U<<30); /*最高两位清零,蜂鸣器停止尖叫*/iowrite32(tmp, S3C64XX_GPFCON);

}

3) 编写pwm_fun.h(包含一些必须的头文件及宏定义信息)

#include #include#include#include#include#include#include#include#include#include#include#include#include#include

#define DEVICE_NAME "pwm_dev"

#define PWM_IOCTL_START 1

#define PWM_IOCTL_STOP 0

extern void pwm_start(void);extern void pwm_stop(void);

4) 编写Makefile文件(使编译过程自动完成)

obj-m :=pwm_driver.o

pwm_driver-objs :=pwm.o pwm_fun.o

PWD := $(shell pwd)

CROSS_COMPILE?= arm-none-linux-gnueabi-CC := $(CROSS_COMPILE)gccCFLAGS+= -static

KPATH := /media/Source/Forlinx/android2.3_kernel_v1.01all: ioctlmake -C $(KPATH) M=$(PWD) modules

ioctl: ioctl.c

$(CC) $(CFLAGS) $^ -o $@

clean:rm -rf *.o *.ko *.mod.c Module.* modules.* ioctl

5) 编写测试程序ioctl(用于对驱动程序的测试)

#include #include#include#include#include

/** === FUNCTION ======================================================================

* Name: main

* Description: 对驱动程序进行测试

* =====================================================================================*/

int main ( int argc, char *argv[] )

{int file_handler = 0;int cmd = 0;int arg = 0;if (argc < 4)

{

printf("Usage: ioctl ");returnEXIT_FAILURE;

}

cmd= atoi(argv[2]);

arg= atoi(argv[3]);

printf("dev:%s", argv[1]);

printf("cmd:%d", cmd);

printf("arg:%d", arg);

file_handler= open(argv[1], 0);if (file_handler<0)

{

printf("open %s failure.", argv[1]);

}

ioctl(file_handler, cmd, arg);

close(file_handler);return EXIT_SUCCESS;

3. 编写好源代码程序之后,交叉编译,上传至OK6410A开发板,进行测试

1) 配置好交叉编译工具链arm-none-linux-gnueabi-gcc之后,在终端输入make即可自动完成编译

2) OK6410A(Android2.3.4操作系统)通过USB线连接至PC端,通过adb上传至开发板:

adb push pwm_driver.ko /tmp/pwm_driver.ko

adb push ioctl /tmp/ioctl

3) 通过adb shell打开并控制OK6410A开发板,输入命令安装驱动模块:

adb shell

insmod /tmp/pwm_driver.ko

4) 测试蜂鸣器驱动程序

/tmp/ioctl /dev/pwm_dev 1 0 #打开蜂鸣器

/tmp/ioctl /dev/pwm_dev 0 0 #关闭蜂鸣器

linux c蜂鸣器驱动程序,〖Linux〗OK6410a蜂鸣器的驱动程序编写全程实录相关推荐

  1. 嵌入式Linux USB驱动开发之教你一步步编写USB驱动程序

    2019独角兽企业重金招聘Python工程师标准>>> 编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标 ...

  2. linux cdc设备驱动程序,Linux Kernel 'cdc-wdm' USB设备驱动程序堆缓冲区溢出漏洞

    发布日期:2013-03-14 更新日期:2013-03-19 受影响系统: Linux kernel 3.x Linux kernel 2.6.x 描述: --------------------- ...

  3. linux arm下硬件驱动程序放哪里,Arm-Linux摄像头驱动程序的移植

    Arm开发板上摄像头的移植有两种方法:第一,将驱动程序添加到内核,通过编译内核,烧写到板子上:第二种,通过动态加载摄像头驱动模块的方法进行硬件的驱动.作者首先在PC的linux系统进行摄像驱动程序的移 ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  5. Linux设备驱动程序学习-Linux设备模型(总线、设备、驱动程序和类)

    文章的例子和实验使用<LDD3>所配的lddbus模块(稍作修改). 总线 总线是处理器和一个或多个设备之间的通道,在设备模型中, 所有的设备都通过总线相连, 甚至是内部的虚拟" ...

  6. Linux中断(interrupt)子系统之四:驱动程序接口层 中断通用逻辑层

    在本系列文章的第一篇:Linux中断(interrupt)子系统之一:中断系统基本原理,我把通用中断子系统分为了4个层次,其中的驱动程序接口层和中断通用逻辑层的界限实际上不是很明确,因为中断通用逻辑层 ...

  7. linux文件控制驱动程序,Linux设备驱动程序学习(6)-高级字符驱动程序操作[(3)设备文件的访问控制]...

    Linux设备驱动程序学习(6) -高级字符驱动程序操作[(3)设备文件的访问控制] 提供访问控制对于一个设备节点来的可靠性来说有时是至关重要的.这部分的内容只是在open和release方法上做些修 ...

  8. linux内核mtd驱动程序与sd卡驱动程序,Linux内核MTD驱动程序与SD卡驱动程序.docx

    Linux内核MTLB动程序与SD卡驱动程序 flash闪存设备和SD?卡设备是嵌入式设备用到的主要存储设备,它们相当丁 PC机的硬盘.在嵌入设备特别是手持设备中,flash闪存是焊接在嵌入设备主板 ...

  9. c 调用 linux驱动程序,Linux下的C编程实战(五)――驱动程序设计

    Linux下的C编程实战(五) ――驱动程序设计 1.引言 设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: (1)初始 ...

  10. linux下怎么安装打印驱动安装驱动程序,Linux下安装HP打印机的驱动程序

    前言 在Linux下,我想通过惠普打印机打印文件,我房间的HP打印机型号为HP LaserJet 1020/1008. 一开始通过命令行安装hplip及其相关插件,由于我的电脑是Fedora 22 W ...

最新文章

  1. SVO学习笔记(一)
  2. mac系统添加VSCode到右键菜单(转)
  3. 遗传算法主程序(辅助)
  4. 如何破解root以及grub密码
  5. mysql client 5.1.34_mysql最新版
  6. MSDN Magazine推出Custom Report Item示例ProgressTracker CRI
  7. Windows平台Eclipse配置Maven
  8. iis管理常用命令 创建IIS站点 应用应用程序 及虚拟目录
  9. 后台审核管理 ergo_Kogito,ergo规则—第2部分:规则的全面执行模型
  10. android app应用签名生成工具,android应用签名详细步骤
  11. mysql导致根目录爆满_因为根目录磁盘满了,我移动数据和软件造成mysql启动不了,查原因mysql.sock不在了...
  12. CSS 清理浮动 clear属性
  13. VMware Data Recovery安装配置
  14. 【ECSHOP插件】ECSHOP商品相册批量上传插件
  15. Spring源码分析-Bean生命周期概述
  16. h计算机二级基础知识题库,2020计算机二级Office考试题库真题
  17. discuzq 去除页面版权
  18. 高中数学知识点:导数的概念及运算(复习+解析+答案)
  19. JavaScript Date相关练习
  20. 沃趣赵晨 | 从技术岗位到产品经理:漫谈IT产品经理的生存之道

热门文章

  1. 最新GEM技术导航系统开心版源码+免授权
  2. 【银行】银行业务系统设计特点概述
  3. 互联网思维提升与电子商务转型
  4. 解决Android logcat: Unexpected EOF!方法指南
  5. Typora中插入分页符
  6. excel函数去重_excel去掉重复值的函数用法
  7. excel vba 去重
  8. 计算机辅储存器有什么,计算机辅存储器包括
  9. 解决vue项目背景图片在IE和火狐上不显示的问题
  10. numpy中的ones函数