linux移植驱动insmod时所遇到的问题
insmod时可能出现的错误:(问题5为自己遇到的实际问题,其他则为借鉴他认经验)
1.warning: function declaration isnt a prototype
这种错误也是很常见的,主要是对一些函数固定格式的错误使用。比如int function()改称int function(void)
static int xxxx_init(void)记住不要缺少static,而static void xxxx_exit(void)
2.出现 warning: assignment makes pointer from integer without a cast 的原因
第一可能是类型转换的问题。函数的返回值类型等等
第二、在源文件中没有发现函数的声明,可能是忘加头文件了。(未经声明的函数原型一律默认为返回int值
3、makefile:4: *** missing separator. Stop.
最近常用SourceInsight3.5编辑程序,里面直接编辑保存的是word格式。用WinHex或UltraEdit以二进制方式打开,里面的
Tab字符对应0x09而不应该是几个0x20。这是主要用vi打开文件,切入到底行模式,使用":set ff =unix"
4.hello: version magic 2.6.30.4 mod_unload ARMv4 should be2.6.30.4-EmbedSky mod_unload ARMv4
insmod:cannot insert hello.ko: invalid module format
出错原因:模块版本与内核版本不匹配!
解决办法:导入预设配置信息,进入menuconfig 继续配置General config ->( )Local version ->
括号中加入如下内容:“-EmbedSky”退出保存为 .config ,重新编译内核、驱动模块,再来加载模块
5# insmod buttons.ko
buttons: Unknown symbol __aeabi_unwind_cpp_pr0 (err 0)
insmod: can't insert 'buttons.ko': unknown symbol in module or invalid parameter
原因:驱动模块与内核镜像不匹配
解决办法:找到与下载到板子上的内核镜保持一致:修改Makefile
将(原来默认路径的内核镜像)KERN_DIR = /work/system/linux-3.4.2
改为(下载到板子上的路径的内核镜像)KERN_DIR = /work/system/linux_suspend/linux-3.4.2即可