昨天写了一篇驱动入手遇到的问题的文章来给自己鼓气,今天终于是把第一个驱动模块给加载进去并且能够运行了。对于昨天的问题还有俩个问题没有答案,不过那俩个问题就先放着。
首先大概说一下交叉编译来开发,以前对于交叉编译开发我的理解就是要安装一个交叉编译工具arm-linux-gcc然后其他的就不用管了,其实不是这样的,而且对于交叉编译环境的搭建一定要明确,那就是要在你开发的系统中(我们一般是在虚拟机中搭建的linux系统)搭建一个和你开发板中的系统完全一样的开发环境,这个环境包括安装相同的内核源码,库文件,各种内核配置等等,要完整的照着手册要做,包括安装linux源码,定制linux内核等等,一开始我不明白怎么又要安装linux内核干嘛的。其实这个搭建的环境编译后生成的内核镜像和你开发板的一样,你可以烧写到开发板中试一试。到这里的时候我就可以想到昨天出现的其他那俩个问题,开发机linux的内核编译和nfs问题就和这个不一样了,因为交叉编译的环境,内核代码,头文件库文件,各种配置都是在搭建的这个开发环境中,和你开发主机linux的内核没有关系。现在你可以看一下一般你的开发主机的内核和搭建的开机环境的内核一般是不一样的,我的pc机的linux内核是2.6.25-14.fc9.i686而我搭建的开发环境的linux内核是2.6.32.2.熟悉了的人看起来这种问题很简单,但是刚开始的时候我是很晕的,要不然我不会去编译PC开发机的linux内核的。
说了很多废话,回到主题,关于前一篇问题的问题1,前一篇文章 linux+arm驱动入手问题
有俩个方面的问题导致加载模块不成功,一是编译模块前需要一些配置,还有开发环境的搭建中的一些问题。二是minicom串口传输文件,这个也是昨天琢磨了好久的,今天发现用这个传文件的时候传完了一定要检查一下,昨天我看到了有一个命令可以检查的但是今天找不到了,不过检查大小也是一样的,我以前就是因为传的文件不完整,大小不大,我该了之后就好了。
这是我在网上找到的一份MINI2440开发环境及模块安装至少我现在觉得很好
1.安装Fedora9.0
mini2440推荐安装9.0的版本。
在VM虚拟机中默认安装即可。
2.安装gcc
在Fedora9.0.ISO中的package文件夹下可以找到gcc的rpm安装包,就不需要到网上费劲下载了。
rpm -ivh gcc*.rpm
首次安装会提示依赖包确实,按照提示一个一个的安装上,这些rpm包都在ISO里。
顺别说一次,如果需要相互依赖的包,可以通过rpm -Uvh a.rpm b.rpm同时安装这两个包。
安装完成后,输入gcc -v查询版本信息,如果能执行,表明gcc已安装成功。
3.安装arm-linux-gcc
在mini2440的光盘中linux文件夹下找到arm-linux-gcc.tar.gz文件,复制到/opt/下
然后tar xvzf arm-linux-gcc.tar.gz -C 解压缩
然后gedit /root/.bashrc
在最后一行追加
export PATH=$PATH:/opt/FriendlyARM/toolschain/4.4.3/bin
重新登录linux后
执行arm-linux-gcc -v,如果能执行,表明arm-linux-gcc已安装成功。
4.解压缩arm-linux源码
在mini2440光盘中linux下找到文件
linux-2.6.32.2-mini2440-20100728.tar.gz,将它复制到/opt下,然后解压缩,压缩后会生成
/opt/FriendlyARM/mini2440/linux2.6.32.2文件夹
cd /opt/FriendlyARM/mini2440/linux2.6.32.2
配置缺省config
cp config_mini2440_t35 .config
make menuconfig
如果提示ncurses有问题,需要通过rpm方式安装ncurses,其rpm包在Fedora9.0.ISO中可以找到。
然后 make menucofig,一般不需要改。
然后 make
5.编译模块
make menuconfig 配置要编译的模块
make modules
make modules_install
这样就可以生成.ko模块文件
将这个文件ftp(记住是bin模式)上传到mini2440开发板下的/lib/modules/2.6.32.2-FriendlyARMxia
然后modprobe yourmodulename,不要带扩展名.ko。如果通过insmod命令安装
通过lsmod查看模块安装情况
通过rmmod yourmodulename卸载
错误
insmod: error inserting 'helloworld.ko': -1 Invalid module format
原因是编译问题,必须严格按照步骤。
可以通过cat /var/log/messages查看详细的错误信息。
不过我这里说一下关于/var/log/messages 也是网上找到的,简单的说明了一下
日志文件其实是纯文本的文件,每一行就是一个消息。只要是在Linux下能够处理纯文本的工具都能用来查看日志文件。日志文件总是很大的,因为从你第一次启动Linux开始,消息就都累积在日志文件中。看日志文件的一个比较好的方法是用像More或Less那样的分页显示程序,或者用Grep查找特定的消息。我们先用Less显示“/var/log/messages”,可以看到从日志文件中取出来的一些消息。每一行表示一个消息,而且都由四个域的固定格式组成:
*时间标签(Timestamp),表示消息发出的日期和时间。
*主机名(Hostname),表示生成消息的计算机的名字。如果只有一台计算机,主机名就可能没有必要了。但是,如果在网络环境中使用Syslog,那么就可能要把不同主机的消息发送到一台服务器上集中处理。在我们的例子中主机名为lcbj。
*生成消息的子系统的名字。可以是“Kernel”,表示消息来自内核或者是进程的名字,表示发出消息的程序的名字。在方括号里的是进程的PID。
*消息(Message),即消息的内容。
我根据这个我查看了一下我的messages信息,发现你们说的是里面信息来自进程的名字那里写的是az 这个是串口的命令啊,所以我就去看看文件有没有完整,果然有问题。
今天暂时就先写到这里吧,其他的俩个问题或者关于messages的详解我一直没找到,那就以后看到了在来写。2011-08-29 16:53
今天终于是发现问题的所在了, 一个非常非常菜的问题,这样的问题都不好意思说出来,但是不说出来又意味着什么了?下面是引用别人的。
区别:kernel-devel包只包含用于内核开发环境所需的内核头文件以及Makefile,而kernel-souce包含所有内核源代码。
如果仅仅是用于你自己编写的模块开发的话,因为只需引用相应的内核头文件,所以只有devel包即可,如果你要修改现有的内核源代码并重新编译,那必须是kernel-souce。
kernel-souce在RH某些版本之后不再附带在发行版中了,必须自己通过kernel-XXX.src.rpm做出来。
kernel-devel是用做内核一般开发的,比如编写内核模块,原则上,可以不需要内核的原代码。
kernel则是专指内核本身的开发,因此需要内核的原代码。
关于kernel source的有kernel和kernel-devel两个rpm,其中kernel rpm包含源文件和头文件(就像2.4下的kernel-source rpm),而kernel-devel则主要是头文件。
这就是我折腾了好久今天终于弄明白的一件事,那就是我其实没有安装源代码,而我只是安装的一个kernel-devel,因为fedora安装VMware-tools的时候需要安装这个包,所以我一直编译不成功的内核源码原来是一直在编译没有源代码的头文件,因为编译不成功后面修改了内核的配置,所以导致nfs服务启动失败,cdrom无法挂载等等问题。而这些问题缘由是改变了内核,相当于伤到了筋骨,所以一般的办法无法修复。所以我搜遍了google baidu都没有一个办法可以解决,最后果断重装了。果然内核的修改伤不起啊!这个慢慢来,有空多练练内功。
2011-08-31 21:18