上一节,我教大家实现了一个最简单的MISC设备驱动,那么这节,我们将用一个实例来驱动蜂鸣器,这里为了方便,我就不再写应用程序进行测试,直接在驱动里调用open函数,这个程序是在Android系统里跑起来,后面我会教大家如何在Android下写应用测试程序。
我们参考以前写的蜂鸣器驱动程序,将它移植到我们这个程序里,让它成为一个MISC设备。
参考以前写的文章:
http://blog.csdn.net/morixinguan/article/details/50628588
接下来,看看代码:
#include <linux/kernel.h> #include <linux/module.h> #include <linux/miscdevice.h> #include <linux/fs.h> #include <linux/types.h> #include <linux/moduleparam.h> #include <linux/slab.h> #include <linux/ioctl.h> #include <linux/cdev.h> #include <linux/delay.h> #include <asm/uaccess.h> #include <asm/irq.h> #include <asm/io.h> #include <linux/gpio.h> #include <mach/gpio.h> #include <plat/gpio-cfg.h> //定义配置蜂鸣器的IO地址 #define GPD0CON 0x114000A0 volatile unsigned long *bell_config = NULL ; volatile unsigned long *bell_dat = NULL ; //misc设备名称--->就是字符设备 #define DEVICE_NAME "misc_dev" //实现open函数 int tiny4412_misc_dev_open(struct inode *inode , struct file *filp) { printk("tiny4412 bell dev open!\n"); //配置引脚为输出状态 *bell_config &= ~(0xf); *bell_config |= (0x1); //开启蜂鸣器 *bell_dat |= 0x1 ; return 0 ; } //实现close函数 int tiny4412_misc_dev_close(struct inode *inode, struct file *filp) { printk("tiny4412 bell dev close!\n"); //关闭蜂鸣器 *bell_dat &= ~0x1 ; return 0 ; } //初始化文件操作结构体 struct file_operations tiny4412_file_ops = { .owner = THIS_MODULE , .open = tiny4412_misc_dev_open, .release = tiny4412_misc_dev_close, }; //初始化misc设备结构体 struct miscdevice tiny4412_misc_dev = { //由内核自动分配次设备号 .minor = MISC_DYNAMIC_MINOR , //初始化设备名称 .name = DEVICE_NAME , //初始化文件操作结构体 .fops = &tiny4412_file_ops, }; static int __init tiny4412_misc_dev_init(void) { int ret_error ; //1、映射IO //映射控制配置引脚IO bell_config = (volatile unsigned long *)ioremap(GPD0CON , 16); //加4个字节偏移到GP0DAT顺便映射该物理地址---引脚状态控制IO bell_dat = bell_config + 1 ; //2、注册misc设备 int ret = misc_register(&tiny4412_misc_dev); if(ret != 0){ ret_error = ret ; printk("misc register fair!\n"); goto fair ; } printk("misc init success!\n"); //在这里直接调用open函数,就方便,不用直接写应用程序打开设备访问 tiny4412_misc_dev_open(NULL,NULL); return ret ; fair: return ret_error ; } static void __exit tiny4412_misc_dev_exit(void) { //注销misc设备 misc_deregister(&tiny4412_misc_dev); //取消映射 iounmap(bell_config); } module_init(tiny4412_misc_dev_init); module_exit(tiny4412_misc_dev_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("YYX add misc driver");
运行结果:
在开机log中,我们看到open函数被正确调用,蜂鸣器发出了清脆的响声。
至此,我们完成了这个简单的基于蜂鸣器的misc设备驱动,当然,如果有兴趣,我们可以在Android上写一个C的应用程序,在开机的时候以服务的形式加载,一旦加载上,再在里面写一个按键输入的程序,当按下某个按键就调用bell open函数,当释放按键,就调用bell close函数。
以上的程序还可以进一步优化,做得更好。