Linux内核学习-misc杂项设备驱动
2011-07-07 20:53
337 查看
Linux里面的misc杂项设备是主设备号为10的驱动设备,它的注册跟使用比较的简单,所以比较适用于功能简单的设备。
它有自己的设备结构体:
struct miscdevice {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
mode_t mode;
};
它在头文件linux/miscdevice.h里面有定义,
其中minor是misc设备的副设备号,misc设备主要依赖minor去区分,如果设置为MISC_DYNAMIC_MINOR则表示系统自动分配未使用的minor
nodename是在/dev下面创建的设备驱动节点,
fops是驱动主体处理函数入口指针
主要使用到的函数有:
int misc_register(struct miscdevice * misc);
int misc_deregister(struct miscdevice *misc);
misc01.c文件#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
/////////////////////////////////////////////////
MODULE_LICENSE("Dual BSD/GPL");
int open_state = 0;
/////////////////////////////////////////////////
int misc01_open(struct inode *inode, struct file *filp)
{
if (open_state == 0)
{
open_state = 1;
printk("misc01 open!\n");
return 0;
}
printk("misc01 has been open!\n");
return -1;
}
int misc01_release(struct inode *inode, struct file *filp)
{
if (open_state == 1)
{
open_state = 0;
printk("misc01 release!\n");
return 0;
}
printk("misc01 has not been open yet!\n");
return -1;
}
ssize_t misc01_read(struct file *filp, char *buf,
size_t count, loff_t fpos)
{
printk("misc01 read!\n");
return 0;
}
ssize_t misc01_write(struct file *filp, char *buf,
size_t count, loff_t fpos)
{
printk("misc01 write!\n");
return 0;
}
int misc01_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
printk("ioctl is called!\n");
printk("cmd:%d arg:%d\n", cmd, arg);
return 0;
}
/////////////////////////////////////////////////
struct file_operations fops =
{
.owner = THIS_MODULE,
.open = misc01_open,
.release = misc01_release,
.write = misc01_write,
.read = misc01_read,
.ioctl = misc01_ioctl
};
struct miscdevice dev =
{
.minor = MISC_DYNAMIC_MINOR,
.fops = &fops,
.name = "misc01",
.nodename = "misc01_node"
};
int setup_misc01(void)
{
return misc_register(&dev);
}
/////////////////////////////////////////////////
static int __init misc01_init(void)
{
printk("misc01 init!\n");
return setup_misc01();
}
static void __exit misc01_exit(void)
{
printk("misc01 exit!\n");
misc_deregister(&dev);
}
/////////////////////////////////////////////////
module_init(misc01_init);
module_exit(misc01_exit);
Makefile文件#Makefile
obj-m := misc01.o
PWD := $(shell pwd)
K_DIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(K_DIR) M=$(PWD) modules
clean:
$(MAKE) -C $(K_DIR) M=$(PWD) clean
test:misc01_test.o
gcc -o $@ {1}lt;
misc01_test.c文件#include <stdio.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
/////////////////////////////////////////////////
int main(int argc, char **argv)
{
int fd;
fd = open("/dev/misc01_node", O_RDONLY);
if (fd < 0)
{
printf("open /dev/misc01_node failed!\n");
printf("%s\n", strerror(errno));
return -1;
}
printf("open /dev/misc01_node ok!\n");
if (ioctl(fd, 6) != 0)
{
printf("ioctl failed!\n");
printf("%s\n", strerror(errno));
}
else
printf("ioctl ok!\n");
close(fd);
return 0;
}
它有自己的设备结构体:
struct miscdevice {
int minor;
const char *name;
const struct file_operations *fops;
struct list_head list;
struct device *parent;
struct device *this_device;
const char *nodename;
mode_t mode;
};
它在头文件linux/miscdevice.h里面有定义,
其中minor是misc设备的副设备号,misc设备主要依赖minor去区分,如果设置为MISC_DYNAMIC_MINOR则表示系统自动分配未使用的minor
nodename是在/dev下面创建的设备驱动节点,
fops是驱动主体处理函数入口指针
主要使用到的函数有:
int misc_register(struct miscdevice * misc);
int misc_deregister(struct miscdevice *misc);
misc01.c文件#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
/////////////////////////////////////////////////
MODULE_LICENSE("Dual BSD/GPL");
int open_state = 0;
/////////////////////////////////////////////////
int misc01_open(struct inode *inode, struct file *filp)
{
if (open_state == 0)
{
open_state = 1;
printk("misc01 open!\n");
return 0;
}
printk("misc01 has been open!\n");
return -1;
}
int misc01_release(struct inode *inode, struct file *filp)
{
if (open_state == 1)
{
open_state = 0;
printk("misc01 release!\n");
return 0;
}
printk("misc01 has not been open yet!\n");
return -1;
}
ssize_t misc01_read(struct file *filp, char *buf,
size_t count, loff_t fpos)
{
printk("misc01 read!\n");
return 0;
}
ssize_t misc01_write(struct file *filp, char *buf,
size_t count, loff_t fpos)
{
printk("misc01 write!\n");
return 0;
}
int misc01_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
printk("ioctl is called!\n");
printk("cmd:%d arg:%d\n", cmd, arg);
return 0;
}
/////////////////////////////////////////////////
struct file_operations fops =
{
.owner = THIS_MODULE,
.open = misc01_open,
.release = misc01_release,
.write = misc01_write,
.read = misc01_read,
.ioctl = misc01_ioctl
};
struct miscdevice dev =
{
.minor = MISC_DYNAMIC_MINOR,
.fops = &fops,
.name = "misc01",
.nodename = "misc01_node"
};
int setup_misc01(void)
{
return misc_register(&dev);
}
/////////////////////////////////////////////////
static int __init misc01_init(void)
{
printk("misc01 init!\n");
return setup_misc01();
}
static void __exit misc01_exit(void)
{
printk("misc01 exit!\n");
misc_deregister(&dev);
}
/////////////////////////////////////////////////
module_init(misc01_init);
module_exit(misc01_exit);
Makefile文件#Makefile
obj-m := misc01.o
PWD := $(shell pwd)
K_DIR := /lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(K_DIR) M=$(PWD) modules
clean:
$(MAKE) -C $(K_DIR) M=$(PWD) clean
test:misc01_test.o
gcc -o $@ {1}lt;
misc01_test.c文件#include <stdio.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
/////////////////////////////////////////////////
int main(int argc, char **argv)
{
int fd;
fd = open("/dev/misc01_node", O_RDONLY);
if (fd < 0)
{
printf("open /dev/misc01_node failed!\n");
printf("%s\n", strerror(errno));
return -1;
}
printf("open /dev/misc01_node ok!\n");
if (ioctl(fd, 6) != 0)
{
printf("ioctl failed!\n");
printf("%s\n", strerror(errno));
}
else
printf("ioctl ok!\n");
close(fd);
return 0;
}
相关文章推荐
- linux内核学习之总线、驱动、设备、kset、kobject
- linux内核杂项设备驱动源码分析
- linux驱动杂项设备类misc
- 我的内核学习笔记8:多功能设备mfd驱动
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析
- 学习windows驱动(WDF USB设备驱动开发)
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】PowerPC + Linux2.6.25平台下的I2C驱动架构分析
- 字符设备驱动函数解析(学习总结)
- Linux内核设备驱动之GIC驱动
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之三--Linux对异常和中断的处理
- 【转】linux2.6.28-tty设备驱动学习
- Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)
- misc设备驱动
- Linux设备驱动开发学习(4):字符设备驱动(未完)
- misc设备驱动模型及实例解析
- linux内核部件分析(十)——设备驱动模型之class
- Linux内核可装载模块对设备驱动的影响
- Linux内核部件分析--设备驱动模型之driver
- Linux内核学习之网络设备
- 浅谈切入内核学习的方法 - 从块设备驱动入手