CubieBoard中文论坛

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

编译驱动时,makefile把我的驱动当x86平台编译了,导致错误

[复制链接]
发表于 2014-1-27 02:24:44 | 显示全部楼层 |阅读模式
首先我不太确定我烧写的android是否正确运行了.
我自己按官方编译了个android4.0.4固件烧进去串口有输出,adb可以运行.大小和官方固件大小一样.但是不能用串口控制.
我看这个帖子说http://forum.cubietech.com/forum ... &extra=page%3D1
是可以串口控制的.
然后换官方固件/cubiebox_tvbox_rel2.3.img 刷后情况一样.
----------------------------------------------------------------------------------
然后主要问题:
编译驱动的时候
make  -C $S3C6410_KERNEL_PATH  M=${PWD}

输出
  WARNING: Symbol version dump /disk1/sources/cb-A10/lichee/linux-3.0/Module.symvers
           is missing; modules will have no dependencies and modversions.
和一堆类似这样的错误

/disk1/sources/cb-A10/lichee/linux-3.0/arch/x86/include/asm/processor.h:114:30: error: 'CONFIG_X86_L1_CACHE_SHIFT' undeclared here (not in a function)
编译脚本把它当x86编译了.是缺什么变量没设置么??

但是 $S3C6410_KERNEL_PATH  指向的内核目录已经 make ARCH=arm menuconfig 而且编译,烧写,运行了,从输出看貌似是没问题的.
----------------------------------------------------------------------------------
下面是烧写官方img后的最后几行串口输出..正常吗?
[    2.537449] logwrapper used greatest stack depth: 5608 bytes left            
[    2.689697] init: do_umount: /cache                                          
[    2.732285] init: dont need format /dev/block/nandk                          
[    2.738504] init: dont need format /dev/block/nandi                          
[    3.043218] init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_.
[    3.057542] init: cannot find '/system/etc/install-recovery.sh', disabling ''
[    6.010658] android_usb: already disabled                                    
[   17.875066] init: untracked pid 90 exited                                    
[   17.879600] netd used greatest stack depth: 5496 bytes left                  
[   17.886894] init: untracked pid 85 exited                                    
[   26.405830] init: untracked pid 160 exited                                   
[   26.411640] init: untracked pid 161 exited                                   
[   34.274970] init: untracked pid 194 exited                                   
[   34.283673] init: untracked pid 195 exited

我没hdimi线,现在手头也没工具转接vga....

----------------------------------------------------------------------------------
另外android开发的资料太少啦..
这里不少是学生吧.大手们就顺手写个pdf 例如怎么编译运行驱动呗.貌似android下还是和linux有点不同?

谢谢!
回复

使用道具 举报

 楼主| 发表于 2014-1-28 04:01:01 | 显示全部楼层
折腾两天终于把驱动编译出来了.
正确的编译方便 不像  AndroidA10(4.0.3)系统编译详解.pdf那样.
先说说这个文档介绍的方法的毛病.
如果按照它的顺序:  (最好先 make mrproper)make menuconfig 返回上层, build.sh
最后得到的.config 有几个不是我们想要的.
CONFIG_ARCH_SUN4I 没有选上,CONFIG_ARCH_VERSATILE is not set 被选上了.然后可能会出现wifi的某些模块出现问题.这些模块的编译由 makefile.26执行. 具体在哪没记录下来.
然后手动编辑 .config 把相关config n掉就好.
这样编译内核是成功了.驱动编译会出问题.通过配置
CONFIG_CMDLINE_FROM_BOOTLOADER# CONFIG_CMDLINE_EXTEND
# CONFIG_CMDLINE_FORCE

可以编译驱动..但是insmod时会因为版本不适加载不了.回头看编译过程,发现警告,内核源码根目录缺少Module.symvers. 到现在我还不清楚这个文件是干哈子用的.但是至少它有一个功能,可以为驱动(ko文件)提供内核版本号.
又bing 了半天才搜到generate Module.symvers. 国外的一个帖子.......懒得贴了.
其实就是一个 make modules 命令.
如果按照那个pdf的方法,这时候才会发现原来根本没有按CONFIG_ARCH_SUN4I 配置编译内核.
又bing了半天....在这个帖子找到编译方法
http://m.oschina.net/blog/83234
#cd lichee/linux-3.0
#make clean   如果你之前没有编译过那么这一步就不用了
#make  ARCH=arm  sun4i_crane_defconfig   -->我的产品是sun4i_crane,这个一步是为了省略将来编译的时候让你选择ARM system type列出的选项

#./build.sh  -p  sun4i_crane  -k 3.0  参数-k表示选择的内核版本   

说道这里,坛里有人说可以#./build.sh  -p  sun4i_crane 后编译驱动,我看了下build.sh脚本,这条命令和上面区别只是这条把内核当默认(2.6)编译了.我试了下还是不行.

最后按上面的方法编译还是会有点问题.手动修改.config解决. 最后./build.sh 后提示example模块不在.没有像帖子里说的那样成功返回. 但其实内核已经生成好了.这对我们就够用了.回到 linux-3.0 make modules ,有错误 继续手动修改.config解决.make modules 成功后就生成  Module.symvers文件了.此时自己的驱动文件夹        make -C $(KERN_DIR) M=`pwd` modules
&& adb push 命令&& adb insmod 命令
加载成功!!


写起来看似顺利.其实我走了很多弯路,以上过程有些是先做了后面发现问题不应该这样解决又回去头来重新理清思路.
确实学了不少东西,特别是关于Makefile shell脚本的.
像这样的一条语句
$(warning  SUBARCH)
$(warning  $(SUBARCH))

可以在Makefile执行时打印这个变量.这个小技巧是我在一个不到2页的一个提问帖里的一个楼层找到的.超级有用!!!

end 碎觉!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-1-28 04:02:49 | 显示全部楼层
哦哦..主贴的问题解决还没说..
把Makefile里的这两个变量这样改


ARCH                ?=arm
CROSS_COMPILE        ?=arm-none-linux-gnueabi-
就ok啦
回复 支持 反对

使用道具 举报

发表于 2014-2-8 10:08:24 | 显示全部楼层
gerrie 发表于 2014-1-28 04:02
哦哦..主贴的问题解决还没说..
把Makefile里的这两个变量这样改
  1. ARCH                ?=arm
  2. CROSS_COMPILE        ?=arm-none-linux-gnueabi-
复制代码
这里是关键,前面那么多都不是最紧要的。

另外,建议直接将驱动纳入源码下编译,直接放进linux-3.4/driver/xxx 下,不要轻易拿出来。然后这样,只需要按照源码中的makefile的格式写一份即可,也免去了各种symbol的烦扰。
makefile  Kconfig写好后, make ARCH=arm menuconfig 配置一下即可,不用辛辛苦苦拿出来
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 01:16 , Processed in 0.023522 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部