系统win7+虚拟机Ubuntu12.04 开发板 smart210 一、第一种编译驱动方式,共6步 第1步:建立源码树 解压安装Linux 内核源代码,拷贝光盘B中的Linux文件夹下的linux-3.0.8-20141105.tgz到自己的工作目录,我的是home/xin/ducoment执行:
#cd /home/xin/ducoment
#tar xvzf linux-3.0.8-20141105.tgz
将创建生成linux-3.0.8目录,里面包含了完整的Linux-3.0.8 内核源代码说明:20141105 是发行更新日期标志,请以光盘中实际日期尾缀为准。 第2步:编辑驱动源文件hello.c
该文件所在目录: /home/xin/ducoment /linux-3.0.8/drivers/char/下建立hello.c文件,输入以下内容:
#include <linux/kernel.h>
#include <linux/module.h> MODULE_LICENSE("GPL"); static int hello_init(void) { printk(KERN_ALERT "Hello, Linux.Iam coming!/n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye, Linux.I will back later./n"); } module_init (hello_init); module_exit (hello_exit);
********************************************************************************************* 下面简单分析上述内容的代码, #include<linux/init.h>
#include <linux/module.h> init.h包含初始化和清除函数。 module.h包含有可装载模块需要的大量符号和函数的定义。 MODULE_LICENSE("GPL"); // MODULE_LICENSE是一个宏,用来告诉内核模块采用许可证类型。尽管不是严格要求,但模块应该指定代码所使用的许可证。内核能够识别的许可证有:“GPL”、“GPL v2”、“GPL and additional rights"、“Dual BSD/GPL"、“GPL MPL/GPL”、“Proprietary”。在我们的模块里我们用“GPL” 模块定义了两个函数:static int hello_init(void) static void hello_exit(void)。模块被装载时调用hello_init,模块被移除时调用hello_exit。 这里用到了一个内核函数:prinfk。内核运行时不信赖于C库,内核模块只能调用内核导出的函数。 第3步:编辑配置文件linux-3.0.8/drivers/char/Kconfig 增加如下字段,如图所示:
保存退出,这时在linux-3.0.8目录“/home/xin/document/linux-3.0.8"位置运行一下 #ls –a 可以看到目录下有一个文件 mini210_linux_defconfig
#cp mini210_linux_defconfig .config 注意有个“.”在config的前面,
#make menuconfig 这时系统报错
看一下错误信息是没有安装 ncurses 再试了另一条命令`sudoapt-get install ncurses`, 出现: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树 正在读取状态信息... 完成 现在没有可用的软件包 ncurses,但是它被其它的软件包引用了。 这可能意味着这个缺失的软件包可能已被废弃, 或者只能在其他发布源中找到 E: 软件包 ncurses 没有可供安装的候选者 解决方法 Linux几乎每个发行版都会有'ncurses'及'ncurses-devel'的安装包的,再根据上面第二条命令错误提示,“现在没有可用的软件包 ncurses,但是它被其它的软件包引用了。” 可以判定Ubuntu软件管理器服务端有作修改过。所以到 Ubuntu Package archive(http://packages.ubuntu.com/)搜索是否存在该安装包,用'ncurses-devel'作为关键字搜索,没有任何结果。搜索'ncurses'出现了很多返回结果。根据每个返回搜索结果的说明可以发现在Ubuntu中'ncurses-devel'是以'libncurses5-dev'命名的。 # sudo apt-get install libncurses5-dev (安装过程没有提示任何错误,安装成功) 接着再试一下`make menuconfig`,可以正常进入内核配置了 就可以在Device Drivers---> Character devices 菜单中看到刚才所添加的选项了,按下空格键将会选择为<M>,此意为要把该选项编译为模块方式;再按下空格会变为<*>,意为要把该选项编译到内核中,在此我们选择<M>,如图:
第4步:编辑linux-3.0.8/drivers/char/Makefile
通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini2440_hello_module.c 编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开 linux-3.0.8/drivers/char/Makefile,如图添加并保存退出:
注意之间的下划线,我这里看不出来 第5步:编译驱动模块
这时回到linux-3.0.8源代码根目录位置/home/xin/document/ linux-3.0.8
#make modules
就可以生成我们所需要的内核模块文件hello.ko 了,如图:
第6步:加载驱动模块
将把编译出的mini2440_hello_module.ko下载到板子中,并把它移动到,然后在板子中的文件夹中执行:
#insmod hello.ko再执行以下命令,可以看到该模块被卸载
#rmmod hello.ko卸载模块 。
|