步骤一:编辑驱动文件
Mac_test.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/version.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/dma-mapping.h>
#include <linux/fs.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/clk.h>
#include <linux/device.h>
#include <linux/cdev.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <asm/dma.h>
#include <asm/delay.h>
#include <linux/delay.h>
MODULE_LICENSE("DualBSD/GPL");
unsigned intmajor=0;//主设备号
unsigned intminor=0;//副设备号
structcdev mac_dev; //字符设备结构体
ssize_tmac_read(struct file*fp,char __user *buf,size_t count,loff_t *f_pos)
{
memcpy(buf,"mac",count);
returncount;
}
intmac_open(struct inode *inodp,struct file *filp)
{
printk("open Macdevice success!\n");
return0;
}
intmac_close(struct inode *inodp,struct file *filp)
{
printk("close Macdevice success!\n");
return0;
}
structfile_operations t_fops={
.owner=THIS_MODULE,
.open=mac_open,
.read=mac_read,
.release=mac_close
};
dev_tdev_no;//设备号结构体
staticint mac_init(void)
{
intret;
printk("come inkernel...\n");
cdev_init(&mac_dev,&t_fops);
mac_dev.owner=THIS_MODULE;
if(major)
{
dev_no=MKDEV(major,minor);
ret=register_chrdev_region(dev_no,1,"Mac");//这里的Mac为设备文件名
if(ret<0)
{
printk("registererror!\n");
}
}
else{
ret=alloc_chrdev_region(&dev_no,0,1,"Mac");
if(ret<0)
{
printk("unregistererror!\n");
}
}
//register_chrdev(major,"mac_test",&t_fops);
cdev_add(&mac_dev,dev_no,1);
return0;
}
staticvoid mac_exit(void)
{
cdev_del(&mac_dev);
unregister_chrdev_region(dev_no,1);
//unregister_chrdev(major,"Mac");
printk("leave fromkernel...\n");
return;
}
module_init(mac_init);
module_exit(mac_exit);
MODULE_AUTHOR("Mac");
步骤二:创建Makefile文件
ifneq($(KERNELRELEASE),)
obj-m:=mac_test.o
else
KDIR:=/lib/modules/2.6.28/build
all:
make -C$(KDIR) M=`pwd` modules
clean:
-rm -f*.markers *.order *.ko *.o *.mod.o *.mod.c *.symvers
#make -C $(KDIR) M=`pwd` modulesclean
Endif
步骤三:编译产生mac_test.ko模块文件(module)并加载上。
#make
#insmodmac_test.ko 加载模块
#cat/proc/devices 查看主设备号(这里查看到的Mac设备的主设备号为250)
#mknod/dev/Mac c 250 0 创建设备文件,主设备号为250副设备号为0(主副设备号可在mac_test.c 文件中定义好)
步骤四:编写简单应用程序,打开设备文件Mac进行测试
Application.c
//本测试应用程序实现打开设备文件,并从内核中读取一个字符串,输出显示。
#include
#include
#include
#include
intmain()
{
intfd;
charbuf[10]={0};
if((fd=open("/dev/Mac",O_RDONLY))==-1)
printf("openerror!\n");
elseprintf("open ok!\n");
read(fd,buf,3);
printf("buf:%s\n",buf);
close(fd);
return0;
}
以下为操作指令:
#gccApplication.c
#./a.out进行测试打开设备文件
#openok!
buf:Mac
#rmmodmac_test
#dmesg查看内核日志
………….
………….
come inkernel...
openMac device success!
closeMac device success!
leavefrom kernel...
以上内核日志表示,模块加载完成,设备文件被打开、关闭,然后卸载了模块。
简单字符设备驱动实验操作完毕,其他设备驱动文件应依照此流程进行学习领会。