教您如何从头开始实现Linux misc设备驱动程序2(基于友好的arm 4412开发板)

在上一节中,我教您如何实现最简单的MISC设备驱动程序。

在本节中,我们将使用一个示例来驱动蜂鸣器。

为了方便起见,我将不编写用于测试的应用程序,而是直接在驱动程序中编写。

调用打开功能。

该程序在Android系统中运行。

稍后,我将教您如何在Android下编写应用程序测试程序。

我们参考以前编写的蜂鸣器驱动程序,将其移植到我们的程序中,并使其成为MISC设备。

请参阅上一篇文章:http://blog.csdn.net/morixinguan/article/details/50628588接下来,看一下代码:#include& lt; linux / kernel.h& gt; #include& lt; linux / module.h& gt; #include& lt; linux / miscdevice.h& gt; #include& lt; linux / fs.h& gt; #include& lt; linux / types.h& gt; #include& lt; linux / moduleparam.h& gt; #include& lt; linux / slab.h& gt; #include& lt; linux / ioctl.h& gt; #include& lt; linux / cdev.h& gt; #include& lt; linux / delay.h& gt; #include& lt; asm / uaccess.h& gt; & nbsp; #include& lt; asm / irq。

h& gt; & nbsp; #include& lt; asm / io.h& gt; & nbsp;& nbsp; #include& lt; linux / gpio.h& gt; #include& lt; mach / gpio.h& gt; #include& lt; plat / gpio-cfg.h& gt; //定义配置蜂鸣器的IO地址#define GPD0CON& nbsp; 0x114000A0 volatile unsigned long * bell_config = NULL; & nbsp;& nbsp;易失的无符号长* bell_dat = NULL; & nbsp;& nbsp; //其他设备名称---& gt;它是字符设备#define DEVICE_NAME“ misc_dev”, //执行打开函数int tiny4412_misc_dev_open(struct inode * inode,struct file * filp){printk(“ tiny4412 bell dev open! ”); //将引脚配置为输出状态* bell_config& =〜(0xf); * bell_config | =(0x1); //打开蜂鸣器* bell_dat | = 0x1; return 0;} //执行关闭函数int tiny4412_misc_dev_close(struct inode * inode,结构文件* filp){printk(“ tiny4412 bell dev close! ”); //关闭蜂鸣器* 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,//初始化设备名。

名称= DEVICE_NAME,//初始化文件操作结构.fops = & amp; tiny4412_file_ops,};静态int __init tiny4412_misc_dev_init(void)  {int ret_error; // 1,映射IO //映射控制配置引脚IO bell_config =(volatile unsigned long *)ioremap(GPD0CON,16); & nbsp; & nbsp; & nbsp; //向GP0DAT添加4个字节的偏移量,并通过引脚状态控制IO映射物理地址。

& nbsp; bell_dat = bell_config + 1; // 2,注册其他设备int ret = misc_register(& tiny4412_misc_dev); if(ret!= 0){& nbsp; ret_error = ret; & nbsp; printk(“其他注册公平! ”); & nbsp; goto fair;} printk("杂项初始化成功! ”); //在此处直接调用open函数很方便,而不是直接编写应用程序以打开设备以访问tiny4412_misc_dev_open(NULL,NULL);返回ret公平:返回ret_error;}静态void __exit tiny4412_misc_dev_exit(void)  {/ /取消注册其他设备misc_deregister(& tiny4412_misc_dev); //取消映射& nbsp; & nbsp; iounmap(bell_config); & nbsp;} module_init(tiny4412_misc_dev_init); module_exit(tiny4412_misc_dev_exit); MODULE_AULICOR”; “ YYX添加其他驱动程序”);操作结果:在启动日志中,我们看到open函数被正确调用,并且蜂鸣器发出清晰的声音。

至此,我们已经基于蜂鸣器完成了这个简单的杂项设备驱动程序,当然,如果您有兴趣,我们可以在Android上编写一个C应用程序,并在启动时将其作为服务加载。

加载后,在其中编写一个按键输入程序。

当按下一个键时,将调用钟声打开功能,而在释放键时,将调用钟声关闭功能。

上述程序可以进一步优化并变得更好。

欢迎您的咨询