字符驱动程序入门
最近心情不好,有很多事情要做,也慢慢感觉时间不够用了。。。
1.建立字符模型
linux内核给我们大家提供了一些函数接口,只要懂得利用这些接口我们就很容易编写驱动
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/cdev.h> //包含必要的头文件
static struct cdev chr_dev;
static dev_t ndev;
static int chr_open(struct inode *nd,struct file *filp)
{
int major=MAJOR(nd->i_rdev);
int minor=MINOR(nd->i_rdev);
printk("chr_open,major=%d,minor=%d\n",major,minor);
return 0;
}
static ssize_t chr_read(struct file *f,char __user *u,size_t sz,loff_t *off)
{
printk("In the chr_read()funtion\n");
return 0;
}
static ssize_t chr_write(struct file *file,const char __user *buf,size_t sz,loff_t *ppos)
{
return 0;
}
struct file_operations chr_ops=
{
.owner = THIS_MODULE,
.open =chr_open,
.read =chr_read,
.write =chr_write,
}; //这个数据结构非常重要,不懂自行google
static int demo_init(void)
{
int ret;
cdev_init(&chr_dev,&chr_ops);
ret =alloc_chrdev_region(&ndev,0,1,"chr_dev");
if(!ret)
{
printk("demo_init sucess,major=%d,minor=%d\n",MAJOR(ndev),MINOR(ndev));
ret = cdev_add(&chr_dev,ndev,1);
}
else
return ret;
return 0;
}
static void demo_exit(void)
{
printk("Removing chr_dev module...\n");
cdev_del(&chr_dev);
unregister_chrdev_region(ndev,1);
}
module_init(demo_init);
module_exit(demo_exit);
MODULE_LICENSE("GPL");
2.生成相应驱动模块
在这各部分真的搞得我焦头烂额的。。
首先在上述c文件的目录建立一个Makefile,规则如下
# Makefile – makefile of our first driver
# if KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq (${KERNELRELEASE},)
obj-m := demo_chr_dev.o //demo_chr_dev.c的驱动名
# Otherwise we were called directly from the command line.
# Invoke the kernel build system.
else
KERNEL_SOURCE := /home/learner/workdir/system/iTop4412_Kernel_3.0 //该内核与你要加载的系统内核版本一致
PWD := $(shell pwd)
default:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
clean:
${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean
endif
make 生成相应.ko文件
可以用以下命令查看内核信息
1.驱动信息 modinfo 驱动文件 //系统
2.uname -a 查看系统内核版本 //驱动
若发现版本有些小不一致(用的是同一内核,但信息不一致)可以通过以下方法修改系统内核信息
cd 内核文件目录/include/linux/
在该目录下找到vermagic.h 修改相关信息
3.加载模块
通过minicom上传.ko文件到开发板,minicom配置自行查找
insmod xx.ko //加载
remmod xx //卸载
好了,就写到这里了。有什么错误希望大家指出来,乐在分享嘛(>.<)