//miscdevice结构体
struct miscdevice {
//次设备号一般赋值为MISC_DYNAMIC_MINOR---->由内核自动去分配次设备号
int minor;
//misc设备的名称
const char *name;
//文件操作结构体
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
umode_t mode;
};这里,我们写最简单的misc设备,我们只需要关注minor(次设备号),name(设备名称),fops(文件操作函数).#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 <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>
//misc设备名称--->就是字符设备
#define DEVICE_NAME "misc_dev"
//实现open函数
int tiny4412_misc_dev_open(struct inode *inode, struct file *filp)
{
printk("tiny4412 misc dev open!\n");
return 0 ;
}
//实现close函数
int tiny4412_misc_dev_close(struct inode *inode, struct file *filp)
{
printk("tiny4412 misc dev close!\n");
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 ;
//注册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");
return ret ;
fair:
return ret_error ;
}
static void __exit tiny4412_misc_dev_exit(void)
{
//注销misc设备
misc_deregister(&tiny4412_misc_dev);
}
module_init(tiny4412_misc_dev_init);
module_exit(tiny4412_misc_dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("YYX add misc driver");
然后,将驱动程序编译后,讲zImage下载到板子上。手把手教你从零实现Linux misc设备驱动一(基于友善之臂4412开发板)
原文:http://blog.csdn.net/morixinguan/article/details/63039090