主次设备号的使用实例
时间:2010-05-20 来源:jianyuehan
1.驱动编译
make 生成minor.ko驱动目标程序
2.生成设备文件
mknode /dev/minor_write c 240 1
mknode /dev/minor_read c 240 2
3.生成测试程序
cc test.c -o test
4.加载驱动程序并测试
insmod minor.ko
./test
驱动程序源码
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h> #include <asm/io.h>
#include <asm/uaccess.h> #define MINOR_DEV_NAME "minordev"
#define MINOR_DEV_MAJOR 240
#define MINOR_WRITE_ADDR 0x0378
#define MINOR_READ_ADDR 0x0379 int minor0_open(struct inode *inode,struct file *file)
{
printk("call minor0 open!\n");
return 0;
} ssize_t minor0_write(struct file *file,const char *buf,size_t count,loff_t *f_ops)
{
printk("device file-write operation!\n");
/* unsigned char status;
int loop;
for (loop = 0;loop<count; loop++){
get_usr(status,(char *) buf);
outb(status,MINOR_WRITE_ADDR);
}
return count;
*/
return 0;
} int minor0_close(struct inode *inode,struct file *file)
{
printk("call minor0 close\n");
return 0;
} int minor1_open(struct inode *inode,struct file *file)
{
printk("call minor1 open!\n");
return 0;
} ssize_t minor1_read(struct file *file,char *buf,size_t count,loff_t *f_ops)
{
printk("device file-read operation!\n");
/* unsigned char status;
int loop;
for (loop = 0;loop<count; loop++) {
status = inb(MINOR_READ_ADDR);
put_usr(status,(char *) &buf[loop]);
}
return count;
*/
return 0;
} int minor1_close(struct inode *inode,struct file *file)
{
printk("call minor1 close\n");
return 0;
} struct file_operations minor0_fops={
.owner = THIS_MODULE,
.write = minor0_write,
.open = minor0_open,
.release = minor0_close
}; struct file_operations minor1_fops={
.owner = THIS_MODULE,
.read = minor1_read,
.open = minor1_open,
.release = minor1_close
}; int minor_open(struct inode *inode,struct file *filp)
{
printk("call minor open\n");
switch(MINOR(inode->i_rdev))
{
case 1: filp->f_op=&minor0_fops;break;
case 2: filp->f_op=&minor1_fops;break;
default: return -ENXIO;
}
if (filp->f_op && filp->f_op->open)
return filp->f_op->open(inode,filp);
return 0;
} struct file_operations minor_fops={
.owner =THIS_MODULE,
.open =minor_open,
}; int __init int_init(void)
{
int ret;
ret=register_chrdev(MINOR_DEV_MAJOR,MINOR_DEV_NAME,&minor_fops);
if (ret < 0) {
printk(KERN_INFO"minor device register failed!\n");
return ret;
}
else {
printk(KERN_INFO"minor device register successed!\n");
}
return 0;
}
void __exit void_exit(void)
{
unregister_chrdev(MINOR_DEV_MAJOR,MINOR_DEV_NAME);
printk(KERN_INFO"minor device unregister successed!\n");
}
module_init(int_init);
module_exit(void_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Savant Pan");
MODULE_DESCRIPTION("minor device driver example"); Makefile文件源码 ifneq ($(KERNELRELEASE),)
obj-m :=minor.o
else
PWD := $(shell pwd)
KVR := $(shell uname -r)
#for your destination kernel versinon
#KERNELDIR =/home/savant/kernel/linux-2.6.24/
#for your pc kernel version
KERNELDIR =/lib/modules/$(KVR)/build/
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
endif 测试程序源码 #include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#define READ_DEV_PATH "/dev/minor_read"
#define WRITE_DEV_PATH "/dev/minor_write" int main()
{
int read_dev,write_dev;
unsigned char buff[128];
int loop;
printf("starting...!\n");
read_dev=open(READ_DEV_PATH,O_RDWR|O_NDELAY);
if (read_dev < 0) {
printf("read device file open failed!\n");
perror("err");
exit(1);
} else {
printf("read device file open successfully!\n");
} printf("write device file open!\n");
write_dev=open(WRITE_DEV_PATH,O_RDWR|O_NDELAY);
if (write_dev < 0) {
printf("write device file open failed!\n");
perror("err");
close(read_dev);
exit(1);
} else {
printf("write device file open successfully!\n");
} /* printf("wait... input\n");
while(1) {
if(read(read_dev,buff,1) == 1) {
printf("read data [%02X]\n",buff[0]&0xFF);
if(!(buff[0]&0x10)) break;
}
}
printf("input ok...\n");
*/
printf("led flashing...\n");
for(loop=0;loop<2;loop++) {
buff[0]=0xFF;
write(write_dev,buff,1);
sleep(1);
buff[0]=0x00;
write(write_dev,buff,1);
sleep(1);
} close(read_dev);
close(write_dev);
return 0;
}
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/fs.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fcntl.h> #include <asm/io.h>
#include <asm/uaccess.h> #define MINOR_DEV_NAME "minordev"
#define MINOR_DEV_MAJOR 240
#define MINOR_WRITE_ADDR 0x0378
#define MINOR_READ_ADDR 0x0379 int minor0_open(struct inode *inode,struct file *file)
{
printk("call minor0 open!\n");
return 0;
} ssize_t minor0_write(struct file *file,const char *buf,size_t count,loff_t *f_ops)
{
printk("device file-write operation!\n");
/* unsigned char status;
int loop;
for (loop = 0;loop<count; loop++){
get_usr(status,(char *) buf);
outb(status,MINOR_WRITE_ADDR);
}
return count;
*/
return 0;
} int minor0_close(struct inode *inode,struct file *file)
{
printk("call minor0 close\n");
return 0;
} int minor1_open(struct inode *inode,struct file *file)
{
printk("call minor1 open!\n");
return 0;
} ssize_t minor1_read(struct file *file,char *buf,size_t count,loff_t *f_ops)
{
printk("device file-read operation!\n");
/* unsigned char status;
int loop;
for (loop = 0;loop<count; loop++) {
status = inb(MINOR_READ_ADDR);
put_usr(status,(char *) &buf[loop]);
}
return count;
*/
return 0;
} int minor1_close(struct inode *inode,struct file *file)
{
printk("call minor1 close\n");
return 0;
} struct file_operations minor0_fops={
.owner = THIS_MODULE,
.write = minor0_write,
.open = minor0_open,
.release = minor0_close
}; struct file_operations minor1_fops={
.owner = THIS_MODULE,
.read = minor1_read,
.open = minor1_open,
.release = minor1_close
}; int minor_open(struct inode *inode,struct file *filp)
{
printk("call minor open\n");
switch(MINOR(inode->i_rdev))
{
case 1: filp->f_op=&minor0_fops;break;
case 2: filp->f_op=&minor1_fops;break;
default: return -ENXIO;
}
if (filp->f_op && filp->f_op->open)
return filp->f_op->open(inode,filp);
return 0;
} struct file_operations minor_fops={
.owner =THIS_MODULE,
.open =minor_open,
}; int __init int_init(void)
{
int ret;
ret=register_chrdev(MINOR_DEV_MAJOR,MINOR_DEV_NAME,&minor_fops);
if (ret < 0) {
printk(KERN_INFO"minor device register failed!\n");
return ret;
}
else {
printk(KERN_INFO"minor device register successed!\n");
}
return 0;
}
void __exit void_exit(void)
{
unregister_chrdev(MINOR_DEV_MAJOR,MINOR_DEV_NAME);
printk(KERN_INFO"minor device unregister successed!\n");
}
module_init(int_init);
module_exit(void_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Savant Pan");
MODULE_DESCRIPTION("minor device driver example"); Makefile文件源码 ifneq ($(KERNELRELEASE),)
obj-m :=minor.o
else
PWD := $(shell pwd)
KVR := $(shell uname -r)
#for your destination kernel versinon
#KERNELDIR =/home/savant/kernel/linux-2.6.24/
#for your pc kernel version
KERNELDIR =/lib/modules/$(KVR)/build/
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *~core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules*
endif 测试程序源码 #include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#define READ_DEV_PATH "/dev/minor_read"
#define WRITE_DEV_PATH "/dev/minor_write" int main()
{
int read_dev,write_dev;
unsigned char buff[128];
int loop;
printf("starting...!\n");
read_dev=open(READ_DEV_PATH,O_RDWR|O_NDELAY);
if (read_dev < 0) {
printf("read device file open failed!\n");
perror("err");
exit(1);
} else {
printf("read device file open successfully!\n");
} printf("write device file open!\n");
write_dev=open(WRITE_DEV_PATH,O_RDWR|O_NDELAY);
if (write_dev < 0) {
printf("write device file open failed!\n");
perror("err");
close(read_dev);
exit(1);
} else {
printf("write device file open successfully!\n");
} /* printf("wait... input\n");
while(1) {
if(read(read_dev,buff,1) == 1) {
printf("read data [%02X]\n",buff[0]&0xFF);
if(!(buff[0]&0x10)) break;
}
}
printf("input ok...\n");
*/
printf("led flashing...\n");
for(loop=0;loop<2;loop++) {
buff[0]=0xFF;
write(write_dev,buff,1);
sleep(1);
buff[0]=0x00;
write(write_dev,buff,1);
sleep(1);
} close(read_dev);
close(write_dev);
return 0;
}
相关阅读 更多 +
排行榜 更多 +