根据字符设备驱动的模型
1.驱动初始化
2.实现设备操作
3. 驱动注销
示例代码如下:
#include <linux/module.h>
#include <linux/init.h>
#include <linux/cdev.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
/*静态分配cdev*/
struct cdev mdev;
dev_t devno;
int dev1_regs[5];
int dev2_regs[5];
loff_t mem_lseek(struct file *filp, loff_t offset, int whence)
{
loff_t new_pos = 0;
switch(whence){
case SEEK_SET:
new_pos = 0+offset;
break;
case SEEK_CUR:
new_pos = filp->f_pos +offset;
break;
case SEEK_END:
new_pos = 5*sizeof(int)+offset;
break;
}
filp->f_pos = new_pos;
return new_pos;
}
ssize_t mem_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
//将设备基地址取出
int *reg_base = filp->private_data;
//从设备中取出数据
copy_to_user(buf,reg_base+(*ppos),size);
//读写指针偏移
filp->f_pos += size;
return size;
}
ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
//将设备基地址取出
int *reg_base = filp->private_data;
//往设备中写入数据
copy_from_user(reg_base+(*ppos),buf,size);
//读写指针偏移
filp->f_pos += size;
return size;
}
int mem_open(struct inode *node, struct file *filp)
{
//取出次设备号
int num = MINOR(node->i_rdev);
if(num == 0){
filp->private_data = dev1_regs;
}
if(num == 1){
filp->private_data = dev2_regs;
}
return 0;
}
int mem_close(struct inode *node, struct file *filp)
{
return 0;
}
const struct file_operations memfops =
{
.llseek = mem_lseek,
.read = mem_read,
.write = mem_write,
.open = mem_open,
.release = mem_close,
};
int memdev_init()
{
/*初始化cdev*/
cdev_init(&mdev, &memfops);
/*分配设备号*/
alloc_chrdev_region(&devno,0,2,"memdev");
/*注册cdev*/
cdev_add(&mdev,devno,2);
return 0;
}
void memdev_exit()
{
//驱动注销
cdev_del(&mdev);
//注销设备号
unregister_chrdev_region(devno,2);
}
module_init(memdev_init);
module_exit(memdev_exit);
编译 make
复制 copy到rootfs目录下
启动内核
安装驱动 insmod memdev.ko
cat主设备号 cat /proc/devices
创建字符设备文件 mknod /dev/memdev0 c 252 0
执行相关的写应用程序 ./write_mem
执行相关的读应用程序 ./read_mem
——————————————————
2018.01.08
23:18