原创 PC_linux以及ARM_linux下驱动开发第一例实践

2009-7-26 14:19 5210 9 16 分类: MCU/ 嵌入式

今天尝试了linux下的驱动开发,花了一个上午的时间终于在PCARM上跑成功了经典驱动教材《LINUX设备驱动程序》的第一个例子 hello.c。看似简单的程序折腾了我不少时间。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


 


由于我用的redhat9.0,以及arm上以前烧录的是linux<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2.4.20的内核因此只能用《LINUX设备驱动程序》第二板中的源代码,《LINUX设备驱动程序》第三版的源代码是for 2.6的内核的。2.42.6的驱动模型做了改动,因此开发的过程,有点不大一样,有兴趣的人可以自己在网上搜索看看。不过我也会简单比较一下不同点.


 


首先拿到hello.c的源代码:


Ldd2(《LINUX设备驱动程序》的简称)给的如下:


 


/*                                                    


 * $Id: hello.c,v 1.10 2001/07/17 10:30:02 rubini Exp $


 */                                                   


#define MODULE


#include <linux/module.h>


 


/*                                                       


 * These lines, although not shown in the book,          


 * are needed to make hello.c run properly even when     


 * your kernel has version support enabled                


 */                                                      


                                                         


int init_module(void)      { printk("<1>Hello, world\n"); return 0; }


void cleanup_module(void)  { printk("<1>Goodbye cruel world\n"); }


 


你会发现这个程序其实是有问题的:我做了简单修改:


 


/*                                                    


 * $Id: hello.c,v 1.10 2001/07/17 10:30:02 rubini Exp $


 */                                                   


#define MODULE


#include <linux/module.h>


 


/*                                                        


 * These lines, although not shown in the book,          


 * are needed to make hello.c run properly even when     


 * your kernel has version support enabled               


 */                                                       


MODULE_LICENSE("GPL");           //添加这句话,否则在PC上编译的时候会出现


//警告,没有注册


//2.6的注册不同:


//MODULE_LICENSE("Dual BSD/GPL");


#include <linux/kernel.h>               //添加了这个头文件printk函数在里面


int init_module(void)      { printk("<1>Hello, world\n"); return 0; }


void cleanup_module(void)  { printk("<1>Goodbye cruel world\n"); }


 


//2.6内核中这两个函数改成了


/*


static int hello_init(void)


{


  printk(KERN_INFO " Hello World enter\n");


  return 0;


}


 


static void hello_exit(void)


{


  printk(KERN_INFO " Hello World exit\n ");


}


 


module_init(hello_init);


module_exit(hello_exit);


*/


 


程序修改好后就可以编译了:


#gcc –I /usr/src/linux2.4/include/linux –c hello.c


//说明:写内核或内核模块不能用写应用程序时的系统调用或函数库


//      -I 后面是就是编译模块专用的内核库路径


//注意 这里编译驱动模块 只需编译到 *.o格式就可以了


 


编译好后我们执行:


#lsmod   //看看现在有那些驱动在内核中


#insmod hello.o   //加入我们刚刚编译的驱动


                //这里可能会报linux版本不匹配的错误


解决方法:1.无视它  改用#insmod –f hello.o


2. 有人提供这样的建议:


进入/usr/include/linux/目录


version.h第一句


#define UTS_RELEASE 2.4.20-1"


改成


#define UTS_RELEASE "2.4.20",这样就可以了。以你自己为准


这时候我们查看打印信息:printk函数相关内容与优先级这里不赘述,自己查看~


由于我们在xwindow下使用的是虚拟终端,所以终端不回打印,在这里查看:


#cat /var/log/messiges


发现已经有Hello, world输出了


接下来:


#rmmod hello       //卸载驱动,注意不是hello.o


同样在messiges里有good bye输出了


 


 


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//                           分隔线


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


接下来我们交叉编译该文件,方法与上面一样


代码稍微修改一下,需要删除:


 


MODULE_LICENSE("GPL");    //这句话,否则交叉编译不过去,不明,达人指教下!!


 


然后我们编译:


 


/opt/host/armv4l/bin/armv4l-linux-gcc –D__KERNEL__-I /usr/src/linux-2.4/include/linux/ -DMODULE –c hello.c


 


//  /opt/host/armv4l/bin/armv4l-linux-gcc我的交叉编译gcc


//  –D__KERNEL__  -DMODULE 代表编译的是内核模块


//  -I  同上


 


这时生成了hello.o,载到arm板子上,执行


#insmod –f hello.o  //无视版本警告


//会直接输出打印信息 hello world 因为这不是虚拟终端


#rmmod hello  //卸载 打印信息 goodbye

PARTNER CONTENT

文章评论7条评论)

登录后参与讨论

用户539229 2009-8-21 22:07

验证了下 2.4内核也可以采用以下的模式: module_init(hello_init); module_exit(hello_exit); 前提是要这个: #include 编译的时候必需: gcc –D__KERNEL__-I /usr/src/linux-2.4/include/linux/ -DMODULE –c hello.c 内核模块编译不能少。 为了能看见打印信息,可以ctrl+F5进入字符模式 返回图形界面 ctrl+F7

用户1522964 2009-7-31 09:42

学习了,哈哈

用户225729 2009-7-29 17:36

我晕,提交上去没有了格式。 我把它写到我的博客中。 希望能一起学习。

用户225729 2009-7-29 17:34

我也照着上面的方法试着做了。 环境:radhet9(文本模式下) gcc(3.2.2), 试验1 #define MODULE #includes int init_module(void) { printk("<1>Hello,world\n"); return 0; } void cleanup_module(void) { printk("<1>Googbye crule world\n"); } 编译: gcc -I /usr/scr/linux-2.4/include/linux -Wall -c hello.c 结果: hello.c: In function 'init_module': hello.c:11: warning: implicit declaration of function 'printk' 没有理会警告继续: insmod hello.o 警告: 版本不匹配,继续: insmod -f hello.o 还是警告,但同时也输出了“Hello,world”,说明模块加载成功。 rmmod hello 显示: Googbye crule world 试验2 在上面的文件中加入 #includ MODULE_LICENSE("GPL"); 然后重新编译 gcc -I /usr/scr/linux-2.4/include/linux -Wall -c hello.c 出现了同样的警告。我不是已经加了printk的声明了?怎么还有警告? 继续试验一得步骤: 出现的结果完全一样。 试验3 同实验2的文件。 编译命令为: gcc -D__KERNEL__ -DMODULE -I /usr/src/linux-2.4/include -Wall -c hello.c 没有任何的警告。 加载,卸载也没有任何的警告。 原因:头文件的路径设置错误。 在头文件路径正确的情况下,去掉#inclue,将会出现printk的警告。 去掉MODULE_LICENSE("GPL"),在加载时会出没有注册的警告。 试验4 没有任何警告和错误的文件,以及编译方法。 #define MODULE #includes #includes MODULE_LICENSE("GPL"); int init_module(void) { printk("<1>Hello,world\n"); return 0; } void cleanup_module(void) { printk("<1>Googbye crule world\n"); } 编译,加载,卸载命令: gcc -D__KERNEL__ -DMODULE -I /usr/src/linux-2.4/include -Wall -c hello.c 再提一下,我是在文本模式下进行的实验。 学习中...... 看到你的文章我才,决心再仔细的做一次。谢谢你。

用户225729 2009-7-29 14:02

我今天刚刚知道的一点。 linux的驱动模块编程的都要在一个c文件中完成。

用户225729 2009-7-29 13:58

谢谢分享,学习中。

tengjingshu_112148725 2009-7-27 09:54

支持一下,2.6与2.4区别也有些太大了吧,很多书上是2.4的,换到2.6改动太大
相关推荐阅读
用户539229 2010-01-23 22:52
vmware下debian5的安装配置以及vmtools的安装使用
一.安装vmware6.5.21.下载vmware6.5.2http://4.scdx3.crsky.com/software/vmware_652.rar2.下载vmware6.5.2汉化包http...
用户539229 2009-12-29 12:57
最新诺基亚Qt4.6的上下位机移植手记,触摸屏支持
一.PC for Winxp下的开发环境的搭建诺基亚收购Qt以后,开发了自己的集成开发环境Qt Creater。这是一个非常强大的工具,上手也很快。登陆:http://qt.nokia.com/dow...
用户539229 2009-12-11 20:14
Omap3evm下android开发第一例hello下位机运行实践
1.       驱动的安装<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 1.1...
用户539229 2009-12-09 19:01
android的windows下开发环境的搭建与hello第一例
Android的SDK的官方网址如下官方网址:http://androidappdocs.appspot.com/sdk/index.html<?xml:namespace prefix = o...
用户539229 2009-11-28 13:21
Omap3下Goole的Android操作系统的实现 相当于山寨智能机啦
首先要有一个:OMAP3EVM平台的开发板 我用的是OMAP35x的TI的评估板还要有一个SD卡 TI花了很大的功夫打造了OMAP3智能手机开发平台,给用户提供了SDK包,GDK包,以及双核的Davi...
用户539229 2009-11-08 19:50
OMAP35x下OneNand的分析以及x-loader的介绍
OMAP35x下OneNand的分析以及x-loader的介绍<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:...
我要评论
7
9
关闭 站长推荐上一条 /3 下一条