一个最简单的驱动包含二个文件
mydrv.c 源码文件
Makefiile 编译在KO
文件如下
mydrv.c c源码文件
/*
*/
#include <linux/module.h>
#include <linux/major.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/delay.h> /* guess what */
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/mutex.h>
#include <linux/firmware.h>
#include <linux/platform_device.h>
#include <linux/uaccess.h> /* For put_user and get_user */
static struct class *mydrv_class;
/*
*/
static int mydrv_open(struct inode *inode, struct file *file)
{
return 0;
}
/*
*/
static const struct file_operations mydrv_fops = {
.owner = THIS_MODULE,
.open = mydrv_open,
};
/*
入口函数
*/
int major;
static int __init mydrv_init(void)
{
printk("module_init--->mydrv_init\n");
//1
if(major=register_chrdev(0, "mydrv", &mydrv_fops)) {
printk("MYDRV driver: Unable to register driver\n");
return 1;
}
//2
mydrv_class = class_create(THIS_MODULE, "mydrv");
//3
device_create(mydrv_class, NULL, MKDEV(major, 0), NULL,
"mydrv");
//4 .初始化
return 0;
}
module_init(mydrv_init);
/*
出口函数
*/
static void __exit mydrv_exit(void)
{
printk("module_exit--->mydrv_exit\n");
//1
device_destroy(mydrv_class, MKDEV(major, 0));
//2
class_destroy(mydrv_class);
//3
unregister_chrdev(0, "mydrv");
}
module_exit(mydrv_exit);
MODULE_LICENSE("GPL");
Makefile 文件
KERN_DIR =/home/widora/openwrt_widora/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7688/linux-3.18.29
TOOLCHAIN="/home/widora/openwrt_widora/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mipsel-openwrt-linux-uclibc-"
all:
make -C $(KERN_DIR) ARCH=mips CROSS_COMPILE=$(TOOLCHAIN) M=`pwd` modules
clean:
rm -f *.ko
rm -f *.o
rm -f *.mod.c
rm -f *.mod.o
rm -f *.order
rm -f *.sysvers
obj-m +=mydrv.o
在linux虚拟机上建一个目录mydrv,copy 这二个文件到该目录下,运行make 生成
mydrv.ko copy mydrv.ko 开发板的/tmp
然后 insmod mydrv.ko
会在/sys/class 里面看到mydrv类 在/dev 看到mydrv设备