CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 32984|回复: 25

[教程]如何编译单个驱动文件

[复制链接]
发表于 2013-2-16 17:40:11 | 显示全部楼层 |阅读模式
本帖最后由 WindLand 于 2013-3-6 14:34 编辑

你是不是经常会缺某个驱动,但是又觉得全部编译太费时间了?试试单个模块编译吧。
如果过程中提示 xxx Not found的话,那么你缺什么就apt-get来装什么(我是linaro+debian源,debian源可以参照此贴配置)。
废话少说,进入正题:
1.首先你要有全部源码,这是必须的,从github下载源码(很漫长。。)
git clone git://github.com/linux-sunxi/linux-sunxi.git
或者下载zip打包的(依然漫长..) 注意选你的内核版本对应的版本,我的是3.0.**
未命名.jpg

比如我下载到目录 /home/lany/workspace/linux-sunxi
如果是交叉编译,请先执行:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-


2.  进入这个目录,创建配置文件,cubieboard可以使用 sun4i_defconfig 这个配置
cd /home/lany/workspace/linux-sunxi
make sun4i_defconfig


生成了默认配置的.config之后,你再去.config里把你要的驱动的配置项给开启(可以vi直接编辑.config或者使用make menuconfig图像界面来配置),我这里以sun4i_gpio这个驱动做列子:
vi ./.config
/GPIO
  #按/键 输入GPIO 回车 (即搜索GPIO这个词语)
将你找到的GPIO配置那一行改为CONFIG_SUN4I_GPIO_UGLY=m  
未命名.jpg
然后保存退出
#注意,如果你是编译其他稍微复杂一点的驱动,比如gpu里的几个驱动,他们存在依赖关系,建议使用make menuconfig来配置

3.保存之后,让他准备一下:
make prepare
make scripts


4.现在我们进入要编译的驱动的源码目录,比如sun4i-gpio.c在 drivers/misc 目录下:
cd  /home/lany/workspace/linux-sunxi/drivers/misc/
make -C /home/lany/workspace/linux-sunxi/ M=`pwd` modules

未命名.jpg
#-C后面是你下载的内核源码的目录 M=`pwd` 表示指定要编译的模块目录为当前目录
先看看编译出来的驱动的版本是否和你系统相同,如果不相同是无法使用的:
modinfo /home/lany/workspace/linux-sunxi/drivers/misc/sun4i-gpio.ko
输出:
filename:       /home/lany/workspace/linux-sunxi/drivers/misc/sun4i-gpio.ko
license:        GPL
author:         Tom Cubie
description:    a simple sun4i_gpio driver
depends:
vermagic:       3.0.57+ mod_unload modversions ARMv7

可以看到版本是3.0.57+ mod_unload modversions ARMv7,我的系统版本就是3.0.57+,如果不是,你需要将源码checkout到你对应的版本的分支再编译,或者直接完整编译,把系统内核uImage换成新的(不过这样你的其他驱动都得换)
如果3.0.57+和mod_unload之间还有其他字符,你就要看看你系统里正在使用的其他驱动是不是也有这个字符,如果对不上是无法使用的。

5.如果没问题,那么直接将sun4i-gpio.ko复制到/lib/modules/(你的内核版本)/kernel/drivers/misc/ 下 (即该驱动应该在的位置,而不是所有驱动都往这里放哦)
然后insmod /lib/modules/(你的内核版本)/kernel/drivers/misc/sun4i-gpio.ko
如果没有报错,那么恭喜你,已经加载成功,可以使用命令:lsmod 查看。如果有报错,输入命令:dmesg|tail   查看详细的报错信息。然后再去google(一般都不好解决,遇到这种情况,还是把内核和所有驱动都换了吧)
如果是报这个错:
  1. <3>sun4i_gpio_init script_parser_fetch "gpio_para" "gpio_used" error
  2. [  607.040000] sun4i_gpio_init script_parser_fetch "gpio_para" "gpio_used" error
  3. insmod: error inserting 'sun4i-gpio.ko': -1 Interrupted system call
复制代码
那是你没有设置script.bin里的gpio_para配置,设置后再insmod就OK


6.如果加载好驱动测试能够正常使用,而你每次启动系统都需要他,那么你可以把它加入到开机自加载模块里:
depmod -a
vi /etc/modules
未命名.jpg
保存退出,注意:对于某些有依赖的驱动,需要注意先后顺序哦

教程完毕。祝大家折腾愉快~

回复

使用道具 举报

发表于 2013-2-22 15:32:30 | 显示全部楼层
楼主的编译工具链是在哪里下载的啊?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-22 23:41:46 | 显示全部楼层
maosuyun2009 发表于 2013-2-22 15:32
楼主的编译工具链是在哪里下载的啊?

缺什么就apt-get装什么。当然,编译工具要安好几个包,你可以百度:   交叉编译环境 apt-get
回复 支持 反对

使用道具 举报

发表于 2013-2-24 00:44:05 | 显示全部楼层
maosuyun2009 发表于 2013-2-22 15:32
楼主的编译工具链是在哪里下载的啊?

建议用Sourcery G++的交叉编译链:arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
或者其它版本的也行。
回复 支持 反对

使用道具 举报

发表于 2013-2-25 14:07:09 | 显示全部楼层
从github.com/linux-sunxi/linux-sunxi.git这里下载过来的源码内核版本是3.0.*的,但是我用berryboot安装的linaro的源码是内核版本是3.4.24,所以我用编译出来的驱动,不能在linaro中insmod,怎么才能安装3.0.*的内核啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-26 10:04:57 | 显示全部楼层
maosuyun2009 发表于 2013-2-25 14:07
从github.com/linux-sunxi/linux-sunxi.git这里下载过来的源码内核版本是3.0.*的,但是我用berryboot安装的 ...

1.
[export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-]
make ARCH=arm sun4i_defconfig
make uImage
make modules
make modules_install INSTALL_MOD_PATH=/tmp/output
2.用编译出来的uImage覆盖原系统的对应文件
3.将编译好的/tmp/output中的内容覆盖原系统的对应文件

你的版本就变成新版本了。

如果你还是喜欢用3.4   ,请将源码checkout 到3.4分支再编译
回复 支持 反对

使用道具 举报

发表于 2013-4-23 12:43:38 | 显示全部楼层
WindLand 发表于 2013-2-26 10:04
1.
[export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-]

你好,WindLand,
我用的是archlinux ,内核版本是
Linux version 3.0.62 (amery@builder) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #8 PREEMPT Fri Mar 29 19:55:45 UTC 2013
请问应该下载https://github.com/linux-sunxi/linux-sunxi/
的哪个分支?
(PS:我使用sunxi-3.0,但是返回
insmod: ERROR: could not insert module ./gpio/gpio-sunxi.ko: Invalid module format)

麻烦您了,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-23 12:52:52 | 显示全部楼层
Ttcd 发表于 2013-4-23 12:43
你好,WindLand,
我用的是archlinux ,内核版本是
Linux version 3.0.62 (amery@builder) (gcc version  ...

modinfo xxx.ko
看里面的版本是否一致,如果不一致,需要把git源码revision到uname -a输出的对应版本(好像不太好找)。
make menuconfig的时候,你可以看到源码当前的版本。
我遇到这种情况一般是直接把整个内核全部换掉。。
回复 支持 反对

使用道具 举报

发表于 2013-4-23 15:19:57 | 显示全部楼层
WindLand 发表于 2013-4-23 12:52
modinfo xxx.ko
看里面的版本是否一致,如果不一致,需要把git源码revision到uname -a输出的对应版本(好 ...

很抱歉,打扰了,我uname -a 了一下,内核版本是
Linux alarm 3.0.62 #8 PREEMPT Fri Mar 29 19:55:45 UTC 2013 armv7l GNU/Linux
而gpio-sunxi.ko的modinfo为:
filename:       /root/linux-sunxi-sunxi-3.0/drivers/gpio/gpio-sunxi.ko
license:        GPL
description:    GPIO interface for Allwinner A1X SOCs
author:         Alexandr Shutko <alex@shutko.ru>
srcversion:     FAF074F47499E5A9DEFF530
depends:        
vermagic:       3.0.62 preempt mod_unload modversions ARMv7

都是3.0.62 为什么还是
insmod: ERROR: could not insert module gpio-sunxi.ko: Invalid module format

找了很久还是找不到原因。

麻烦您了,谢谢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-4-23 15:44:50 | 显示全部楼层
Ttcd 发表于 2013-4-23 15:19
很抱歉,打扰了,我uname -a 了一下,内核版本是
Linux alarm 3.0.62 #8 PREEMPT Fri Mar 29 19:55:45 UT ...

你随便找个正常的ko看看modinfo , 如果和你gpio这个一样的话,应该就不是版本问题了。
可能是这个驱动是有依赖的,依赖内核里面的东西,而你内核里面没有。这种情况你只能换整个内核了。
你先dmesg|tail看下,贴出来
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-4-30 07:29 , Processed in 0.033923 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部