335xGPIO型蜂鸣器控制
来源:互联网 发布:关宁军 知乎 编辑:程序博客网 时间:2024/05/21 04:20
转自:http://bbs.elecfans.com/jishu_903104_1_1.html
buzzer_drv.h
#ifndef _BUZZER_DRV_H#define _BUZZER_DRV_H#define BUZZER_IOC_MAGIC 'B'#define BUZZER_ON _IO(BUZZER_IOC_MAGIC, 1)#define BUZZER_OFF _IO(BUZZER_IOC_MAGIC, 0)#define BUZZER_IOCTL_MAXNR 2#endif /*_BUZZER_DRV_H*/~
buzzer_drv.c:
#include <linux/init.h>#include <linux/module.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/version.h>#include <asm/mach/arch.h>#include <mach/hardware.h>#include <mach/gpio.h>#include <asm/gpio.h>#include "buzzer_drv.h"static int major;static int minor;struct cdev *buzzer; /* cdev 数据结构 */static dev_t devno; /* 设备编号 */static struct class *buzzer_class;#define DEVICE_NAME "buzzer"#define GPIO_BUZZER_PIN_NUM (0*32 + 2) /*gpio0_2 */static int buzzer_open(struct inode *inode,struct file *file ){ try_module_get(THIS_MODULE); gpio_direction_output(GPIO_BUZZER_PIN_NUM, 1); return 0;}static int buzzer_release(struct inode*inode, struct file *file ){ module_put(THIS_MODULE); gpio_direction_output(GPIO_BUZZER_PIN_NUM, 1); return 0;}static int buzzer_ioctl(struct file *filp, unsigned int cmd, unsigned long arg){ if(_IOC_TYPE(cmd) != BUZZER_IOC_MAGIC) { return -ENOTTY; } if(_IOC_NR(cmd) > BUZZER_IOCTL_MAXNR) { return -ENOTTY; } switch(cmd){ case BUZZER_ON: gpio_set_value(GPIO_BUZZER_PIN_NUM, 1); break; case BUZZER_OFF: gpio_set_value(GPIO_BUZZER_PIN_NUM, 0); break; default: break; } return 0; }struct file_operations buzzer_fops = { .owner = THIS_MODULE, .open = buzzer_open, .release = buzzer_release, .unlocked_ioctl = buzzer_ioctl,};static int __init buzzer_init(void){ int ret; gpio_free(GPIO_BUZZER_PIN_NUM); if(gpio_request(GPIO_BUZZER_PIN_NUM, "buzzer_bee")) { printk("request %s gpio faile \n", "buzzer"); return -1; } ret = alloc_chrdev_region(&devno, minor, 1, "buzzer"); /* 从系统获取主设备号 */ major= MAJOR(devno); if(ret < 0) { printk(KERN_ERR"cannot get major %d \n", major); return -1; } buzzer = cdev_alloc(); /* 分配 buzzer 结构 */ if(buzzer != NULL) { cdev_init(buzzer,&buzzer_fops); /* 初始化 buzzer 结构 */ buzzer->owner = THIS_MODULE; if(cdev_add(buzzer, devno, 1) != 0) { /* 增加 buzzer 到系统中 */ printk(KERN_ERR"add cdev error!\n"); goto error; } }else { printk(KERN_ERR"cdev_alloc error!\n"); return -1; } buzzer_class = class_create(THIS_MODULE, "buzzer_class"); if(IS_ERR(buzzer_class)) { printk(KERN_INFO"create class error\n"); return -1; } device_create(buzzer_class,NULL, devno, NULL, "buzzer"); return 0; error: unregister_chrdev_region(devno,1); /* 释放已经获得的设备号 */ return ret;}static void __exit buzzer_exit(void){ cdev_del(buzzer);/* 移除字符设备 */ unregister_chrdev_region(devno,1); /* 释放设备号 */ device_destroy(buzzer_class,devno); class_destroy(buzzer_class);}MODULE_LICENSE("GPL");module_init(buzzer_init);module_exit(buzzer_exit);MODULE_AUTHOR("Xiaoxin");
Makefile:
PWD := $(shell pwd)ARCH=armCROSS_COMPILE=/home/goembed/B1/335x-B1-CROSS_COMPILE/usr/bin/arm-linux-gnueabihf-obj-m += buzzer_drv.oKDIR = /home/goembed/B4/project_kernel/335x-B1-LINUX/all: make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules arm-linux-gcc buzzer_test.c -o buzzer_testclean: make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) clean rm buzzer_test
buzzer_test.c
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/ioctl.h>#include <errno.h>#include <fcntl.h>#include "buzzer_drv.h"#define DEV_NAME "/dev/buzzer"int main(int argc, char *argv[]){ int i; int fd = 0; fd = open (DEV_NAME, O_RDONLY); if(fd < 0) { perror("Open"DEV_NAME" Failed!\n"); exit(1); } while(1){ ioctl(fd,BUZZER_ON); printf("BUZZER_ON\n"); sleep(1); ioctl(fd,BUZZER_OFF); printf("BUZZER_OFF\n"); sleep(1); } close(fd); return 0;}~
查看是否加载成功: ls /dev/buzz* 如果有buzzer(节点名),则加载成功
卸载: rmmod buzzer_drv 注意不要后缀名.ko
0 0
- 335xGPIO型蜂鸣器控制
- C# 控制蜂鸣器发声
- 蜂鸣器控制实验
- pwm控制蜂鸣器实验
- beep 控制蜂鸣器发声
- C# 控制蜂鸣器
- C# 控制蜂鸣器发声
- PWM控制蜂鸣器驱动
- C# 控制蜂鸣器发声
- 单片机控制蜂鸣器
- Ubuntu下控制蜂鸣器
- STM32控制蜂鸣器
- 51单片机(AT89C52)控制蜂鸣器
- AVR单片机(ATMEGA16)控制蜂鸣器
- Arduino 按键控制有源蜂鸣器
- C# 报警 控制蜂鸣器发声
- 蜂鸣器
- 蜂鸣器
- freeswitch初次安装
- HashMap两种遍历方式的异同(大数据的情况下)
- 算法第九周作业01
- 在mac里快速查找文件及所在路径
- Ubuntu 终端zsh的agnoster主题乱码
- 335xGPIO型蜂鸣器控制
- Dubbo入门
- (图文)命令行升级VCSA 6.0 U1到6.0 U2
- CSS hack方式
- BZOJ1726 POJ3255 P2865: [Usaco2006 Nov]Roadblocks路障
- [网络流24题]数字梯形问题
- S2地铁考试题目
- C语言字符指针
- (图文)如何在vSphere里创建Private Docker Registry