手把手教你从零实现Linux misc设备驱动二(基于友善之臂4412开发板)

简介: 上一节,我教大家实现了一个最简单的MISC设备驱动,那么这节,我们将用一个实例来驱动蜂鸣器,这里为了方便,我就不再写应用程序进行测试,直接在驱动里调用open函数,这个程序是在Android系统里跑起来,后面我会教大家如何在Android下写应用测试程序。

上一节,我教大家实现了一个最简单的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函数。

以上的程序还可以进一步优化,做得更好。

目录
相关文章
|
20天前
|
运维 安全 Linux
试试Linux设备命令行运维工具——Wowkey
WowKey 是一款专为 Linux 设备设计的命令行运维工具,提供自动化、批量化、标准化的运维解决方案。它简单易用、高效集成且无依赖,仅需 WIS 指令剧本文件、APT 账号密码文件和 wowkey 命令即可操作。通过分离鉴权与执行过程,WowKey 让运维人员专注于决策,摆脱繁琐的交互与执行工作,大幅提升运维效率与质量。无论是健康检查、数据采集还是配置更新,WowKey 都能助您轻松应对大规模设备运维挑战。立即从官方资源了解更多信息:https://atsight.top/training。
|
20天前
|
数据采集 运维 安全
Linux设备命令行运维工具WowKey问答
WowKey 是一款用于 Linux 设备运维的工具,可通过命令行手动或自动执行指令剧本,实现批量、标准化操作,如健康检查、数据采集、配置更新等。它简单易用,只需编写 WIS 指令剧本和 APT 帐号密码表文件,学习成本极低。支持不同流派的 Linux 系统,如 RHEL、Debian、SUSE 等,只要使用通用 Shell 命令即可通吃Linux设备。
|
28天前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
8月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
93 6
|
8月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
117 5
|
8月前
|
存储 缓存 Unix
Linux 设备驱动程序(三)(上)
Linux 设备驱动程序(三)
92 3
|
8月前
|
缓存 安全 Linux
Linux 设备驱动程序(一)((下)
Linux 设备驱动程序(一)
85 3
|
8月前
|
安全 数据管理 Linux
Linux 设备驱动程序(一)(中)
Linux 设备驱动程序(一)
59 2
|
8月前
|
Linux
Linux 设备驱动程序(四)
Linux 设备驱动程序(四)
67 1
|
8月前
|
存储 数据采集 缓存
Linux 设备驱动程序(三)(中)
Linux 设备驱动程序(三)
103 1