博航社区

 找回密码
 立即注册博航社区

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 6709|回复: 1
打印 上一主题 下一主题

编译安装最简单的驱动 [复制链接]

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2015-1-21 16:38:35 |只看该作者 |倒序浏览
分享到:

系统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

增加如下字段,如图所示:

1.png

保存退出,这时在linux-3.0.8目录“/home/xin/document/linux-3.0.8"位置运行一下

#ls –a 可以看到目录下有一个文件  mini210_linux_defconfig
#cp  mini210_linux_defconfig .config         注意有个“.”在config的前面,
#make menuconfig

这时系统报错

2.png

看一下错误信息是没有安装 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>,如图:

3.png

4步:编辑linux-3.0.8/drivers/char/Makefile
通过上一步,我们虽然可以在配置内核的时候进行选择,但实际上此时执行编译内核还是不能把mini2440_hello_module.c 编译进去的,还需要在Makefile 中把内核配置选项和真正的源代码联系起来,打开 linux-3.0.8/drivers/char/Makefile,如图添加并保存退出:

4.png

注意之间的下划线,我这里看不出来

5步:编译驱动模块
这时回到linux-3.0.8源代码根目录位置/home/xin/document/ linux-3.0.8
#make modules
就可以生成我们所需要的内核模块文件hello.ko 了,如图:

5.png

6步:加载驱动模块
将把编译出的mini2440_hello_module.ko下载到板子中,并把它移动到,然后在板子中的文件夹中执行:
#insmod hello.ko再执行以下命令,可以看到该模块被卸载
#rmmod hello.ko卸载模块


分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
分享分享0 收藏收藏0 转发到微博

使用道具 举报

Rank: 9Rank: 9Rank: 9

沙发
发表于 2015-1-21 17:51:02 |只看该作者

使用道具 举报

Archiver|手机版|谷歌地图|百度地图|官网地图|淘宝链接|博航智能圈 - ARM嵌入式AI物联网IOT机器人

GMT+8, 2024-5-4 19:11 , Processed in 0.033524 second(s), 8 queries , Gzip On, Memcache On.

club.broadon.net

© 2007-2012 BroadOn

回顶部