在适配系统移植后接下来就是对于驱动框架的学习 首先配置下驱动框架开发所需要的环境 驱动编译所需的linux内核的源码树目录,对于在Ubuntu下的内核源码树可以通过shell命令去分配,
KERN_VER = $(shell uname -r)
KERN_DIR = /lib/modules/$(KERN_VER)/build
为对应在Ubuntu下的源码树目录,而对于我们开发板所烧录的linux系统则需要提供内核源码树,原因是我们后面编写的驱动是在对应的系统下去安装的,为了保证可以进行同时避免不同版本的兼容性问题最好选择我们所烧录的内核版本作为其驱动的内核源码树 我这里指定的就是我开发板上烧录的内核源码的目录
KERN_DIR = /home/hawen/zyp_linux/driver_kernel/kernel
简单驱动程序下的Makefile文件
KERN_DIR = /home/hawen/zyp_linux/driver_kernel/kernel
obj-m += module_test.o
all:
make -C $(KERN_DIR) M=`pwd` modules
cp:
cp *.ko /root/porting_x210/rootfs/rootfs/driver_test
.PHONY: clean
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
然后通过Makefile帮助编译,在通过cp命令将.ko文件拷贝到我们挂载的根文件系统上,接下来就是开发板开机挂载上根目录然后进入到驱动文件目录下去安转驱动文件 insmod module.ko安转驱动模块 lsmod查看已经按装的驱动模块 进入到根目录下的/proc目录下的文件devices通过cat命令可以查看其运行的设备信息 proc目录是系统运行时产生的临时文件存放的目录这里就不在详细说明 cat /proc/devices 可以看到我们所分配的设备信息,主设备号为200,设备名为testchar 卸载驱动模块rmmod 驱动模块名称 附录
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#define MYMAJOR 200
#define MYNAME "testchar"
static int test_chrdev_open(struct inode *inode, struct file *file)
{
printk(KERN_INFO "test_chrdev_open\n");
return 0;
}
static int test_chrdev_release(struct inode *inode, struct file *file)
{
printk(KERN_INFO "test_chrdev_release\n");
return 0;
}
static const struct file_operations test_fops = {
.owner = THIS_MODULE,
.open = test_chrdev_open,
.release = test_chrdev_release,
};
static int __init chrdev_init(void)
{
int ret = -1;
printk(KERN_INFO "chrdev_init helloworld init\n");
ret = register_chrdev(MYMAJOR, MYNAME, &test_fops);
if (ret)
{
printk(KERN_ERR "register_chrdev fail\n");
return -EINVAL;
}
printk(KERN_INFO "register_chrdev success...\n");
return 0;
}
static void __exit chrdev_exit(void)
{
printk(KERN_INFO "chrdev_exit helloworld exit\n");
unregister_chrdev(MYMAJOR, MYNAME);
}
module_init(chrdev_init);
module_exit(chrdev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("");
MODULE_DESCRIPTION("module test");
MODULE_ALIAS("alias xxx");
就先记录到这里吧,算半只脚踏入入门阶段。
|