linux 增加linux驱动编译进内核 必须编译内核吗

怎么编译Linux模块驱动 - 【Linux与安卓】 - 电子工程世界-论坛 后使用快捷导航没有帐号? 请完成以下验证码 查看: 2876|回复: 6 怎么编译Linux模块驱动 在线时间276 小时 威望1034分 TA的帖子TA的资源 纯净的硅(中级), 积分 1034, 距离下一级还需 166 积分 纯净的硅(中级), 积分 1034, 距离下一级还需 166 积分 Linux驱动编译方式一种是直接编译进kernel内核,一种是编译成模块。 编译成内核很简单,但是编译驱动模块要自己写make命令。 我现在手头有个Android的工程,想把驱动编译成模块*.ko,参照书《Android深度探索 卷1 HAL与驱动开发 》里的代码,不太理解: S3C6410_KERNEL_PATH=/root/kernel/linux_kernel_2.6.36 export PATH=$PATH:/root/compilers/arm-eabi-4.4.3/bin make&&-C $S3C6410_KERNEL_PATH&&M=${PWD} 这几行shell是什么意思? 万能的网友谁给我指点一二,谢谢了。 在线时间276 小时 威望1034分 TA的帖子TA的资源 纯净的硅(中级), 积分 1034, 距离下一级还需 166 积分 纯净的硅(中级), 积分 1034, 距离下一级还需 166 积分 百度了一下,稍微了解了,现在只剩下内核路径不太懂,“”make&&-C $S3C6410_KERNEL_PATH&&M=${PWD}“”中的S3C6410_KERNEL_PATH这个路径是”S3C6410_KERNEL_PATH=/root/kernel/linux_kernel_2.6.36“这句赋值的,但是不理解这路径代表的意思是什么,如果一份新的工程,哪个目录下有这个路径? 这个是你内核的路径啊,编译驱动里要依赖内核中的头文件& 在线时间1172 小时 威望1216分 芯币1840枚 E金币187枚 TA的帖子TA的资源 纯净的硅(高级), 积分 1216, 距离下一级还需 784 积分 纯净的硅(高级), 积分 1216, 距离下一级还需 784 积分 百度了一下,稍微了解了,现在只剩下内核路径不太懂,“”make&&-C $S3C6410_KERNEL_PATH&&M=${PWD}“”中 ... 这个是你内核的路径啊,编译驱动里要依赖内核中的头文件 是宿主机的内核路径还是目标板的工程内核路径?因为宿主机一般也是Linux吧& 在线时间574 小时 威望1188分 芯币1760枚 TA的帖子TA的资源 纯净的硅(中级), 积分 1188, 距离下一级还需 12 积分 纯净的硅(中级), 积分 1188, 距离下一级还需 12 积分 本帖最后由 ywlzh 于 18:29 编辑 自己好好看吧 项目一大起来 不得不好好学makefile怎么写了,尤其是要看懂顶层目录的Makefile文件 天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,,添加说明EEworld好友 在线时间1868 小时 威望8354分 芯币11261枚 TA的帖子TA的资源 五彩晶圆(高级), 积分 8354, 距离下一级还需 1646 积分 五彩晶圆(高级), 积分 8354, 距离下一级还需 1646 积分 you can search it in google website 在线时间276 小时 威望1034分 TA的帖子TA的资源 纯净的硅(中级), 积分 1034, 距离下一级还需 166 积分 纯净的硅(中级), 积分 1034, 距离下一级还需 166 积分 这个是你内核的路径啊,编译驱动里要依赖内核中的头文件 是宿主机的内核路径还是目标板的工程内核路径?因为宿主机一般也是Linux吧 在线时间1172 小时 威望1216分 芯币1840枚 E金币187枚 TA的帖子TA的资源 纯净的硅(高级), 积分 1216, 距离下一级还需 784 积分 纯净的硅(高级), 积分 1216, 距离下一级还需 784 积分 是宿主机的内核路径还是目标板的工程内核路径?因为宿主机一般也是Linux吧 目标板的,不然后编译的驱动会提示兼容性问题而加载不了 论坛测评队员 EEWORLD 官方微信 EE福利 唾手可得 Powered by最近一直在搞linux方面的开发 &在添加驱动的时候碰到一点点小麻烦 ,就是模块化添加驱动**.ko和直接把驱动编译进内核这两点 &其实我感觉还是把驱动直接编译进内核比较方便。当然根据不同的需求需要的方式也不尽相同 编写驱动的基本格式: #include&& static int hello_init(void){ &&&&&&&&&printk(&hello world\n&); &&&&&&&&&return 0; static void hello_exit(void) &&&&&&&&&printk(&bye hello world\n&); module_init(hello_init); module_exit(hello_exit); MODULE_LICENSE(&GPL&); MODULE_AUTHOR(&LJL&); Makle 的编写 obj-m := hello.o KERNELBUILD :=/usr/src/linux-headers-3.2.0-24-generic-pae &&&&&&&make -C $(KERNELBUILD) M=$(shell pwd) modules &&&&&&&rm -rf *.o &*.ko *.mod.c .*.cmd .tmp_versions *.order *.symvers 记住不是顶行写的一定要空一格TAB键值 也就是四个字符间隔 编译后生成hello.ko &拷贝到文件系统中insmod hello.ko &/rmmod hello.ko 可以试一下 方法二:直接编译进内核 还是以上边那个模板举例子 &,我要写的是字符设备驱动 &然后把程序保存在kernel/driver/char/hello.c 。 然后在Makefile中添加变量以及编译路径 例如我再kernel/driver/char/下面的Makefile中的首行添加如下: OBJ-$(CONFIG-HELLO) += hello.o 然后在/kernel/driver/char/下边的Kconfig 中添加如下语句:(Kconfig的作用大家肯定知道 不在此缀述。) config HELLO bool &HELLO DRV& 现在就可以的回到kernel根目录下make menuconfig -》driver》char》就可以选择了选中后直接编译内核就可以了 &&相关文章推荐 * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 访问:1129次 排名:千里之外 (window.slotbydup = window.slotbydup || []).push({ id: '4740881', container: s, size: '200,200', display: 'inlay-fix'驱动程序直接编译进内核 驱动程序直接编译进内核   hello程序直接编译进内核:   第一;先将hello.c拷贝到在内核源代码中drivers/char/,vi /drivers/char/Kconfig   添加 config HELLO_DRIVER   bool(tristate) "my hello driver"。然后回到源代码目录下make menuconfig,在文本菜单Device Drivers&&&character devices就可以发现my hello driver的选项。如果是bool就有两个选项(*和空),如果是tristate就有三个选项(*、空和m),选择空就可在源代码目录nfig文件查找HELLO(/HELLO),发现CONFIG_HELLO_DRIVER is not set(选*则=y,选m=m)。   第二;在内核源代码中vi /drivers/char/Makefile,添加obj-$(CONFIG_HELLO_DRIVER) +=hello.o。这样就可以将hello.c驱动程序直接编译进内核&   Kconfig文件的作用   内核源码树的目录下都有两个文件Kconfig(2.4版本是Config.in)和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文件相关的内核配置菜单。在内核配置make menuconfig(或xconfig等)时,从Kconfig中读出菜单,用户选择后保存nfig的内核配置文件中。在内核编译时,主Makefile调用这nfig,就知道了用户的选择。*上面的内容说明了,Kconfig就是对应着内核的配置菜单。如果要想添加新的驱动到内核的源码中,可以修改Kconfig,这样就可以选择这个驱动,如果想使这个驱动被编译,要修改Makefile   so添加新的驱动时需要修改的文件有两种(注意不只是两个)*Kconfig*Makefile要想知道怎么修改这两种文件,就要知道两种文件的语法结构Kconfig每个菜单都有一个关键字标识,最常见的就是config语法:config symbol是一个新的标记的菜单项,options是在这个新的菜单项下的属性和选项其中options部分有:   1、类型定义:每个config菜单项都要有类型定义,bool布尔类型、 tristate三态:内建、模块、移除 string字符串、 hex十六进制、 integer整型例如config HELLO_MODULEbool "hello test module"bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,如果选择编译成内核模块,则会nfig中生成一个CONFIG_HELLO_MODULE=m的配置,如果选择内建,就是直接编译成内核影响,就会nfig中生成一个CONFIG_HELLO_MODULE=y的配置.   2、依赖型定义depends on或requires指此菜单的出现与否依赖于另一个定义config HELLO_MODULEbool "hello test module"depends on ARCH_PXA这个例子表明HELLO_MODULE这个菜单项只对XScale处理器有效。   3、帮助性定义只是增加帮助用关键字help或者---help---内核的Makefile在linux2.6.x/Documentation/kbuild目录下有详细的介绍有关kernel makefile的知识。内核的Makefile分为5个组成部分: Makefile 最顶层的Makefile

我要回帖

更多关于 linux内核编译配置 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信