参考了原文,原文地址:https://www.cnblogs.com/embInn/p/14038119.html
原作者写的很好,我在移植的时候,借鉴了里面内容,我的内核是linux-3.14.38,添加驱动前,我是提前编译过了一次,
下面是简单的驱动代码 hello.c
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kmod.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/reboot.h>
#include<linux/init.h>
#include<linux/module.h>
#include<linux/moduleparam.h>
#include<linux/kernel.h>/*printk()*/
#include<linux/sched.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello word\r\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Goodbye\r\n");
}
/* 注册卸载 */
module_init( hello_init );
module_exit( hello_exit );
MODULE_LICENSE("Dual BSD/GPL");
在\linux-3.14.38\drivers\目录下建立hello目录
目录下文件如下:
Kconfig内容:(大致内容如下,原文中 “#endmenu”我修改为了endmenu)
#
# HELLO device configuration
#
config HAVE_HELLO
tristate "hello driver"
help
This hello driver is just to shaow how to develop driver process.
This driver can also be built as a module. If so, the module
will be called hello.
default y
endmenu
表示如果使能了CONFIG_HAVE_HELLO在内核裁剪配置文件中,将显示hello driver菜单,默认编译进内核:
-
y: 编译进内核
-
m:编译为模块.ko文件
-
n:表示不编译,未使能。
Makefile内容:
obj-$(CONFIG_HAVE_HELLO) += hello.o
表示CONFIG_HAVE_HELLO使能时,编译规则指定的文件为hello.c
编辑\linux-3.14.38\drivers\ 目录下的Kconfig,Makefile文件
Kconfig文件,在最底部添加
menu "Device Drivers"
source "drivers/base/Kconfig"
source "drivers/bus/Kconfig"
source "drivers/connector/Kconfig"
source "drivers/mtd/Kconfig"
......
source "drivers/hello/Kconfig"
endmenu
在endmenu前添加hello文件夹的配置文件解析:source "drivers/hello/Kconfig"
如此一来,配置系统就会按照这个配置去解析hello文件夹下的Kconfig
Makefile文件:
#
# Makefile for the Linux kernel device drivers.
#
# 15 Sep 2000, Christoph Hellwig <hch@infradead.org>
# Rewritten to use lists instead of if-statements.
#
obj-y += irqchip/
obj-y += bus/
obj-$(CONFIG_GENERIC_PHY) += phy/
# GPIO must come after pinctrl as gpios may need to mux pins etc
.......
obj-$(CONFIG_HAVE_HELLO) += hello/
在原Makefile后添加obj-$(CONFIG_HAVE_HELLO) += hello/,这句话的作用是当CONFIG_HAVE_HELLO使能后,在哪里去找源文件。在结合hello文件下模块Makefile就形成了层次式Makefile
编译
我是之前内核编译过一次,然后运行make,提示有新的驱动是否加入,输入Y,就可以了,我自己又保存了一下,.config文件(备份)
然后调用make distclean,清除,
调用make menuconfig,可以在配置菜单中看到新加入的驱动了
然后,
在make 等编译成功即可