字符设备驱动程序设计
n = first_drv_open,
.release =first_drv_release,
.write = first_drv_write,
.read = first_drv_read,
} ;
//驱动注册
static int major = 0;
实验
实验目的
掌握字符设备驱动程序编写的框架;
掌握设备驱动相关的知识;
实验原理
参考本周大课课件《字符设备驱动程序.PPT》。
实验步骤
建立一个工作目录,我们的驱动程序模块程序保存在这个目录下;
#mkdir first_drv
#cd first_drv
1
#include <linux/module.h>
#include <linux/kernel.h>
{
//注销cdev结构
........
//注销设备号
}
module_init(.......);
module_exit(.......);
MODULE_LICENSE(......);
注意:要求底层函数要实现open,release,write,read方法。
2
内容格式,参考如下:
obj-m+=模块程序文件名.o
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/uaccess.h>
#include <linux/kernel.h>
#include <linux/cdev.h>
}
static int first_drv_release(struct inode *in, struct file *fp)
{
printk("first driver release called!\n");
return 0;
}
static int data=0;
static ssize_t first_drv_write(struct file *fp, const char __user *buf, size_t len, loff_t *offset)
#include <linux/device.h>
#include <asm/io.h>
static int first_drv_open(struct inode *in, struct file *fp)
{
printk("first driver open called!\n");
return 0;
printk("first driver module insert!\n");
return 0;
}
static void __exit first_drv_exit(void)
{
dev_t dev;
dev = MKDEV(major,0);
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/uaccess.h>
#include <linux/cdev.h>
//(1)编写硬件底层操作函数实现open,release,write,read
......
//(2)创建一个file_operations结构
......
static int __initxxx_init(void)
{
//(3)申请设备号
........
//(4)初始化cdev结构
........
//(5)注册cdev结构
........
return 0;
}
static void __exitXXX_exit(void)
{
copy_from_user((void *)&data,buf,sizeof(int));
printk("first driver write called!data is %d\n",data);
return sizeof(int);
}
static ssize_t first_drv_read(struct file *fp, char __user *buf, size_t len, loff_t * offset)
{
data=data+1;
copy_to_user(buf,&data,sizeof(int));
printk("first driver read called!\n");
return sizeof(int);
}
static struct file_operations first_fops = {
static struct cdev *first_drv_cdev;
#define FIRST_DRV_NAME "first_drv"
static int __init first_drv_init(void)
{
dev_t dev;
alloc_chrdev_region(&dev, 0, 1, FIRST_DRV_NAME);
all:
make -C内核源码路径M=`pwd` modules#这一行要以TAB键开头
clean:
make -C内核源码路径M=`pwd` modules clean#这一行要以TAB键开头
3
编译内核模块,直接使用make命令就可以了;
#make
编译没有错误时,将模块拷贝到跟文件系统中;
#cp xxx.ko/opt/rootfs/lib/modules/3.5.0-yyy/
4
加载:
# insmod/lib/modules/3.5.0-yyy/xxxx.ko
查看系统分配的设备号
#cat /proc/devices
手动添加设备文件(设备节点)
# mknod /dev/first_drv c主设备号次设备号
5
实验成功后,叫老师查看实验结果,作为平时考察成绩;
first_drv:
major = MAJOR(dev);
first_drv_cdev = cdev_alloc();
cdev_init(first_drv_cdev,&first_fops);
first_drv_cdev->owner = THIS_MODULE;
cdev_add(first_drv_cdev, dev, 1);