QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5321|回复: 7

请教设备驱动程序加进核心方法(不是insmod动态加载)

[复制链接]
发表于 2005-3-29 17:53:07 | 显示全部楼层 |阅读模式
修改系统核心的源代码,把设备驱动程序加进核心里操作步骤是怎么样的?谢谢
发表于 2005-3-29 21:42:52 | 显示全部楼层
用百度查找一下就有了,但都是比较旧的.
回复

使用道具 举报

发表于 2005-3-30 22:52:52 | 显示全部楼层
如何在嵌入式LINUX中增加自己的设备驱动程序
载自http://www.hyesco.com/forum/index.asp

驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动态加载。由于uClinux不支持模块动态加载,而且嵌入式LINUX不能够象桌面LINUX那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。
下面以UCLINUX为例,介绍在一个以模块方式出现的驱动程序test.c基础之上,将其编译进内核的一系列步骤:

(1) 改动test.c源带代码
第一步,将原来的:
#include <linux/module.h>
#include <linux/version.h>

char kernel_version[]=UTS_RELEASE;
改动为:
#ifdef MODULE
#include <linux/module.h>
#include <linux/version.h>
char kernel_version[]=UTS_RELEASE;
#else
#define MOD_INC_USE_COUNT
#define MOD_DEC_USE_COUNT
#endif
第二步,新建函数int init_test(void)
将设备注册写在此处:
result=register_chrdev(254,"test",&test_fops);

如何在嵌入式LINUX中增加自己的设备驱动程序(2)

(2) 将test.c复制到linux/drivers/char目录下,并且在linux/drivers/char目录下mem.c中,int chr_dev_init( )函数中增加如下代码:
#ifdef CONFIG_TESTDRIVE:
init_test();
#endif
(3) 在linux/drivers/char目录下Makefile中增加如下代码:
ifeq ($(CONFIG_TESTDRIVE),y)
obj-y +=test.o
Endif
(4) 在linux/drivers/char/Config.in目录下config.in中字符设备段里增加如下代码:
bool 'support for testdrive' CONFIG_TESTDRIVE y
(5) 运行make menuconfig(在menuconfig的字符设备选项里你可以看见我们刚刚添加的'support for testdrive'选项,并且已经被选中);make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。
(6) 在 romdisk/dev/目录下创建设备:
mknod test c 254 0
回复

使用道具 举报

发表于 2005-3-31 19:06:01 | 显示全部楼层
Good!
Thanks WindTrace.
回复

使用道具 举报

发表于 2005-4-5 00:46:45 | 显示全部楼层
今天我试验了一下把我的字符设备驱动程序加载进内核,发现用上面的方法并不行的通
分析了一下源代码,我觉得mem.c主要是用来做集中管理devfs的,具体还不是很清楚

当我把
#ifdef CONFIG_TESTDRIVE
init_test();
#endif
这几句话加入mem.c的文件的时候,发现在用make编译内核是会发现undefined references to这类的错误
说是没有认出init_test这个标志,就算我在mem.c程序开头加了
#ifdef CONFIG_TESTDRIVE
extern int init_test(void);
#endif
也不行,没有深入了解,不知道为什么会这样,
后来干脆把这个驱动程序作成单独的模块,
这样的话我们就得在test.c文件末尾加上
module_init(init_test);
module_exit(exit_test);
把之前在mem.c的修改注释掉,make编译成功,把内核下载到内存执行
可以看到自己的设备号,以及设备名(进入/proc中执行cat  devices)
回复

使用道具 举报

发表于 2005-4-5 07:51:46 | 显示全部楼层
找板子上的一个例子看一下就清楚了。。。
回复

使用道具 举报

发表于 2005-4-5 18:34:44 | 显示全部楼层
module_exit(exit_test)和exit_test()都可以不要,这种做法主要对2.4版内核有效。
简单的说,就是2.4版内核中把编译为模块和编译入内核两种方法统一起来,
同一个驱动程序,不用修改代码,
只改变命令行参数就能编译为模块或编译入内核。
回复

使用道具 举报

发表于 2006-6-6 15:23:05 | 显示全部楼层
t有个问题问一下!
如何将RH9下以模块方式生成的驱动编译进内核?编译进内核的驱动程序是如何加载的?即谁调用了module_init(init_test)或init_module函数。编译进内核的驱动难道不需要module_init(init_test)和module_exit(exit_test)函数吗?如果没有这这两个函数,则init_test函数谁来调用,或者说init_test中的register_chrdev(254,"test",&test_fops)函数谁来调用!

编译进内核的驱动和编译成模块的驱动的命令行参数有啥区别?

新手上路,望多多指教
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-23 09:12 , Processed in 0.058722 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表