分享

嵌入式驱动开发环境搭建

 ZLM_图书馆 2014-02-25
 最近的驱动搭建出现了N多奇葩的问题,不过也是自己基础薄弱哈,在此记录分享下。
1.开发平台:
虚拟机:VMware-9.0.2 build-1031769
gcc:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
arm-linux-gcc:gcc-3.4.5-glibc-2.3.6
ubuntu系统版本:ubuntu-lucid-10.04
ubuntu自带内核版本:2.6.32.21(该版本和2.6.32-21-generic版本是不一样的哟)
在开始搭建前,尽量使用如下命令查看版本,其中需要关注的是ubuntu的内核版本,gcc版本。
a.查看ubuntu内核版本:uname -r        (一定要使用uname -r 显示的内核版本下载编译)
b.查看gcc版本:gcc -v
如果没有安装gcc请输入:apt-get install gcc
c.查看交叉编译器:arm-linux-gcc -v
如果没有安装需下载,然后解压到/usr/local/arm/文件夹内,并在/etc/bash.bashrc文件末尾添加如下内容:
fi
if [ -d /usr/local/arm ]; then
PATH=$PATH:/usr/local/arm/gcc-3.4.5-glibc-2.3.6/bin
fi
如果安装成功,执行arm-linux-gcc -v会提示你安装的版本,否则请检查出错信息。
另外还需要安装build-essential:apt-get install build-essential
如果提示没有安装包请更新下载源,该源列表在/etc/apt/sources.list文件中,可到官方下载源选择。里面有详细的修改方法,一定要将文档看完,文档下面还有针对不同版本的修改,选择较近区域的源可大大提高下载速度。
除此之外,设置共享文件夹也可大大方便您的操作。
在虚拟机选项:VM/Settings../Options/Shared Folders/Folder Sharing中选择always enable,然后add你想要共享的文件即可,该共享文件夹可在虚拟机/mnt/hgfs/mnt中看到。
2.内核树构建
平台搭建完成后需要下载相应版本的内核。
在官网下载内核:https://www./pub/linux/kernel/v2.6/
我选择的版本是linux-2.6.32.21.tar.bz2。
将该文件复制到/usr/src目录并解压。
cp /mnt/hgf/mnt/linux-2.6.32.21.tar.bz2 /usr/src/
cd /usr/src/
tar jxvf linux-2.6.32.21.tar.bz
a.配置内核,执行:menu oldconfig
测试交叉编译器:make prepare  (可不执行)
使能新的交叉编译器:make scripts   (可不执行)
b.配置完成后编译:make     (此过程较长大概一个小时)
c.制作映像文件:make bzImage    (执行完会在目录下生成vmlinux文件)
d.编译模块:make modules
e.将模块嵌进内核:make modules_install      (执行完会在/lib/moduls/2.6.32.21/目录下生成以内核版本命名的文件夹)
3.内核树测试
到此为止内核树就构建完成了。下面我们测试内核。建立lddr目录新建如下文件:
编写hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
        printk(KERN_ALERT "cs say hello world.");
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT "cs say goodbye.");
}
module_init(hello_init);
module_exit(hello_exit);编写Makefileobj-m:=hello.o
KERNELDIR=/lib/modules/2.6.32.21/
PWD:=$(shell pwd)
modules:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
执行编译:make
make -C /lib/modules/2.6.32.21/build M=/home/cs/lddr/hello modules
make[1]: Entering directory `/usr/src/linux-2.6.32.21'
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/linux-2.6.32.21'
若无问题将在该目录下生成hello.ko文件
加载模块:insmod hello.ko
查看结果:dmesg
卸载模块:rmmod hello.ko
查看结果:dmsg
环境搭建过程中的问题:
1.Invalid module format
这极有可能是版本不一致造成的。执行dmesg查看相关信息即可。
2更换linux内核,如果编译的linux内核和系统内核不一致则进行如下操作:
在上述的操作中执行完#make modules_install后进入如下(需根据你的实际编译路径选择,如果不知道在哪可查找find / -name "bzImage"):
/usr/src/linux-2.6.32.21/arch/i386/boot/bzImage
a、生成可执行的内核引导文件
#make bzImage
#cp arch/x86/boot/bzImage /boot/vmlinuz-2.6.32.21
b、将System.map复制到/boot下:
#cp System.map /boot/System.map-2.6.32.21
c、生成initrd.img文件
#cd /lib/modules/2.6.32.21
#update-initramfs –c –k 2.6.32.21
d、自动查找新内核,并添加至grub引导
#update-grub
e、修改/boot/grub/grub.cfg文件,将几个timeout的值设为10
这样grub在引导的时候就会出现10秒的停留,如果有按键输入,则可以对内核镜像进行选择。
重启后执行uname -r可查看系统内核信息看是否更改。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多