Linux下简易蜂鸣器驱动代码及测试实例
2025-01-07 来源:cnblogs
驱动代码:
#include #include #include #include #include #include #include #include #include #define DEVICE_NAME 'beep3' #define BEEP_MAGIC 'k' #define BEEP_START_CMD _IO (BEEP_MAGIC, 1) #define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2) static void beep3_stop(void) { printk('in the beep3_stop!!n'); s3c_gpio_cfgpin(S5PV210_GPD0(0), S3C_GPIO_OUTPUT); gpio_set_value(S5PV210_GPD0(0), 0); } static void beep3_start(void) { printk('in the beep3_start!!n'); s3c_gpio_cfgpin(S5PV210_GPD0(0), S3C_GPIO_OUTPUT); gpio_set_value(S5PV210_GPD0(0), 1); } static long beep3_ioctl(struct file *filep, unsigned int cmd, unsigned long arg) { printk('in the beep3_ioctl!!n'); switch ( cmd ) { case BEEP_START_CMD: { printk('in the start_cmd!!n'); beep3_start(); break; } case BEEP_STOP_CMD: { printk('in the stop_cmd!!n'); beep3_stop(); break; } default: { break; } } return 0; } static struct file_operations beep3_fops = { .owner = THIS_MODULE, .unlocked_ioctl = beep3_ioctl, }; static struct miscdevice beep3_misc_dev = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &beep3_fops, }; static int __init beep3_dev_init(void) { int ret; ret = gpio_request(S5PV210_GPD0(0), DEVICE_NAME); if (ret) { printk('request GPIO %d failedn',S5PV210_GPD0(0)); return ret; } s3c_gpio_cfgpin(S5PV210_GPD0(0), S3C_GPIO_OUTPUT); gpio_set_value(S5PV210_GPD0(0), 0); ret = misc_register(&beep3_misc_dev); printk(DEVICE_NAME 'tinitializedn'); return ret; } static void __exit beep3_dev_exit(void) { beep3_stop(); misc_deregister(&beep3_misc_dev); } module_init(beep3_dev_init); module_exit(beep3_dev_exit); MODULE_LICENSE('GPL'); MODULE_AUTHOR('mhb@SEU'); MODULE_DESCRIPTION('S5PV210 beep Driver'); 测试实例: #include #include #include #include #include #include #include #define BEEP_MAGIC 'k' #define BEEP_START_CMD _IO (BEEP_MAGIC, 1) #define BEEP_STOP_CMD _IO (BEEP_MAGIC, 2) int main(int argc ,char* argv[]) { int m_fd=0;// m_fd = open('/dev/beep3', O_RDONLY); ioctl(m_fd, BEEP_STOP_CMD); while(1) { printf('enter any key to start !!n'); getchar(); ioctl(m_fd, BEEP_START_CMD); printf('start success!!n'); printf('enter any key to stop !!n'); getchar(); ioctl(m_fd, BEEP_STOP_CMD); } close(m_fd); return 0; }
下一篇:如何将驱动加入内核
- SUSE 被曝以 60 亿美元估值寻找新买家
- Linux嵌入式开发必备命令速查表
- 使用JTAG在Zynq UltraScale+ MPSoC上引导嵌入式Linux系统
- Linux 内核将引入缓存感知调度,性能最高提升 44%
- Linux 之父罕见发声:GPLv2 许可仅限软件开源,不管硬件解锁
- AGL 发布 SoDeV 开源方案,加速软件定义汽车落地
- Linux 内核首个涉及 Rust 代码的安全漏洞公开:源于开发者在 unsafe 代码逻辑疏漏
- 基于安路DR1M90 FPSoC的Linux系统全流程开发指南(第四部分)
- 基于迅为iTOP-3568开发板的Linux驱动开发实战:menuconfig图形化配置实验
- 员工代码写不够就解雇!Linux创始人炮轰马斯克太愚蠢
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




