在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙。高高大大的墙。。。
笔者在初探这一方向时,就在这2个问题上苦恼了很久。查阅无数资料,大多提到了一些问题的解决方案,但又与自己的情况略有不同而不能照搬。在无数次尝试之后最终成功编译了第一个arm架构的驱动模块。仅写此文给后来人一点帮助,提供一点思路。
由于笔者能力有限,资历尚浅,如果不足错误之处,望海涵并不吝赐教。

一.关于交叉编译环境及内核树的先后及关系
因为最终编译后的模块是运行在arm架构下,而开发板本身的计算能力不足,故需要在主机上安装交叉编译环境arm-linux-gcc来编译相关代码。
本帖中的内核树使用的源代码是适配mini2440开发板而进行修改后的linux系统代码,由开发板开发商提供
下载地址:http://www.arm9.net/mini2440-linux.asp 
文件名:Linux 2.6.32.2 for mini2440/micro2440
该源代码在制作内核树的过程中需要使用到arm-linux-gcc等交叉编译工具,故而先配置交叉编译环境,后制作内核树。
笔者理解:内核树与你运行的宿主机之间没有太多关系。内核树的源代码需要与你使用的开发板的源代码相同。读者可根据自己情况到开发板的开发商官网下载,都会提供的。

二.交叉编译环境的安装及配置
首先下载交叉编译工具链,这里提供笔者使用的ARM-Linux GCC 4.4.3
下载地址:http://www.arm9.net/mini2440-linux.asp
文件名:ARM-Linux GCC 4.4.3
1.把arm-linux-gcc-4.4.3-20100728.tar.gz拷贝到任意文件夹下(这里文件名请不要照抄,根据实际情况使用tab补全,较熟悉的用户也不要吐槽笔者这么罗嗦,因为我就干过。。。后面不做赘述)
2.运行
$ sudo tar xvzf arm-linux-gcc-4.4.3-20100728.tar.gz -C /解压该压缩包。这里需要注意的是-C使用大写C,且C后有空格,然后加/ 这里-C的意思是改变解压路径
3.在/usr/local目录下建立arm路径
$ sudo mkdir /usr/local/arm
将/opt/FriendlyARM/toolschain/4.4.3文件夹全部拷贝到/usr/local/arm下(/opt下的FriendlyARM正是从第二步中解压出来的。该压缩包直接把/opt打包的。)
$ sudo cp -r /opt/FriendlyARM/toolschain/4.4.3 /usr/local/arm
4.修改环境变量,把交叉编译器的路径加入到PATH
这里提供ubuntu的方法(莫吐槽。。。我用的虚拟机。。。莫骂我)
在/home/用户名/.bashrc文件最后添加
export PATH=$PATH:/usr/local/arm/4.4.3/bin
然后运行
$ sudo source /home/用户名/.bashrc
然后检查环境变量添加是否成功
$ echo $PATH
查找是否已经将环境变量添加成功。
如果成功
运行
$ arm-linux-gcc -v
查看是否输出arm-linux-gcc的版本号,
如果正确,交叉编译环境应该就安装完成了。

三.内核树的构建
在编译驱动模块的过程中,内核树是必不可缺的。四楼提供了本例中内核树构建的源代码,读者应按照自己的实际情况,去开发板的官网下载相应的源代码。
1.本例中讲源代码拷贝到/tmp/linux/下,
2.在/opt/FriendlyARM/目录下创建mini2440文件夹
$ sudo mkdir /opt/FridendlyARM/mini2440 并进入该目录
$ cd /opt/FridendlyARM/mini2440
解压源代码
$tar xvzf /tmp/linux/linux-2.6.29-mini2440-20090331.tgz
3.配置编译文件
$ cd /opt/FriendlyARM/mini2440/linux-2.6.29
$ cp config_mini2440_t35 .config
配置内核

$sudo apt-get install libncurses5-dev
$ make menuconfig
选择Load an Alternate Configuration File

到这里编译内核树的准备工作还有最重要的一项。由于这里的内核是基于arm架构的,所以在编译的过程中需要使用到之前配置的交叉编译环境即arm-linux-gcc等。而内核源代码中的Makefile文件中的编译工具的地址需要修改为本机配置的具体地址。
4.makefile文件修改
在/opt/FriendlyARM/mini2440/linux-2.6.29下运行
$ sudo gedit ./Makefile 注意M为大写,编辑器你随意。。。
搜索arm-linux得到一个结果
CROSS_COMPILE?= arm-linux-
然后搜索CROSS_COMPILE,找到
AS= $(CROSS_COMPILE)as
LD= $(CROSS_COMPILE)ld
CC= $(CROSS_COMPILE)gcc
CPP= $(CC) -EAR= $(CROSS_COMPILE)ar
NM= $(CROSS_COMPILE)nm
STRIP= $(CROSS_COMPILE)strip
OBJCOPY= $(CROSS_COMPILE)objcopy
OBJDUMP= $(CROSS_COMPILE)objdump
-------------------------------------------------------------
这里定义了交叉编译文件的位置本例中作如下修改
#AS= $(CROSS_COMPILE)as
AS = /usr/local/arm/4.4.3/bin/arm-linux-as
#LD= $(CROSS_COMPILE)ld
LD = /usr/local/arm/4.4.3/bin/arm-linux-ld
#CC= $(CROSS_COMPILE)gcc
CC = /usr/local/arm/4.4.3/bin/arm-linux-gcc
CPP= $(CC) -E
#AR= $(CROSS_COMPILE)ar
AR = /usr/local/arm/4.4.3/bin/arm-linux-ar
#NM= $(CROSS_COMPILE)nm
NM = /usr/local/arm/4.4.3/bin/arm-linux-nm
#STRIP= $(CROSS_COMPILE)strip
STRIP = /usr/local/arm/4.4.3/bin/arm-linux-strip
#OBJCOPY= $(CROSS_COMPILE)objcopy
OBJCOPY = /usr/local/arm/4.4.3/bin/arm-linux-objcopy
OBJDUMP= $(CROSS_COMPILE)objdump
#OBJDUMP = /usr/local/arm/4.4.3/bin/arm-linux-objdump
注意笔者对最后一项未作修改,至于原因嘛。。。。试出来的。。。。
到这里准备工作完成
5.编译
$ sudo make prepare
$ sudo make scripts
$ sudo make

不出意料的话,到这里,内核树的编译也完成了。

四.关于驱动模块Makefile文件的编写
Makefile文件对于编译成功与否起到至关重要的作用。
在编译内核模块如驱动模块时需要制定内核为刚刚制作完成的内核树
obj-m:=s3c2440.o
CURRENT_PATH:=$(shell pwd)
ARM_LINUX_KERNEL:=/opt/FriendlyARM/mini2440/linux-2.6.32.2
all:
$(MAKE) -C $(ARM_LINUX_KERNEL) SUBDIRS=$(CURRENT_PATH) modulesclean:
rm -rf *.cmd *.o *.ko *.mod.c *.symvers *.order
上面的Makefile文件给大家一个参考。
第三行应该填写自己编译的内核树的具体位置,本例中为上文所写的内容。

五.最后
本例中许多命令需要使用root权限,请尽量sudo执行。如果与问题,请确认赋予了root权限。
本文参考了大量网络文献,不能一一列举,望作者见谅。有chinaUnix社区的大量美文。
本文中六楼第四步,即关于构建内核树过程中Makefile文件的修改系笔者原创,故而,关于这一部分的吐槽和赞美都嘲我来吧。
http://blog.csdn.net/sabalol/article/details/2076610
http://www.zhiwenweb.cn/Category/Learning/linux-ubuntu-Driver-Development-environment.html
上面两篇文章可能给你带来帮助。

完~

http://tieba.baidu.com/p/2055472114?see_lz=1

【基于mini2440开发板的交叉编译环境及内核树配置.的更多相关文章

  1. u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统

    http://www.linuxidc.com/Linux/2012-09/70510.htm  来源:Linux社区  作者:赵春江 uboot最主要的功能就是能够引导内核启动.本文就介绍如何实现该 ...

  2. 一个简单的基于MINI2440开发板的启动代码

    1. S3C2440大概的启动流程(NAND启动): ①设置CPU为SVC模式 ②关闭看门狗 ③屏蔽中断 ④关闭MMU ⑤初始化时钟 ⑥初始化内存(SDRAM) ⑦初始化栈指针(SP, R13) ⑧初 ...

  3. 第五章——搭建S3C6410开发板的测试环境

    搭建S3C6410开发板的测试环境 通过本章的学习学会了如何在开发板上安装Android.开发板是学习和开发嵌入式技术的主要硬件设备,想要顺利的通过linux驱动访问硬件,是不能在PC板上模拟的,需要 ...

  4. 基于uFUN开发板的心率计(三)Qt上位机的实现

    前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...

  5. 【转】Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板

    Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板 开发板:mini2440(2011.04.21)环境:ubuntu9.10 为方便的将文件上传到开发板,采用vsftpd, ...

  6. 手把手教你君正X2000开发板的OpenHarmony环境搭建

    摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况 本文分享自华为云社区<君正X2000开发板的OpenHarmony环境搭建>,作者: 星 ...

  7. 基于uFUN开发板和扩展板的联网校准时钟

    项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...

  8. 基于uFUN开发板的RGB调色板

    前言 使用uFUN开发板配合Qt上位机,实现任意颜色的混合,Qt上位机下发RGB数值,范围0-255,uFUN开发板进行解析,然后输出不同占空比的PWM,从而实现通过RGB三原色调制出任意颜色. Qt ...

  9. 基于uFUN开发板的心率计(二)动态阈值算法获取心率值

    前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...

随机推荐

  1. Elasticsearch 入门 - 基本概念

    NRT Elasticsearch 是一个 接近实时 的搜索平台.这意味着从你索引文档到其可以被搜索中间存在着一个轻微的延迟(通常为1秒钟). Cluster 一个或多个节点的完整数据.聚合索引和搜索 ...

  2. Map 遍历的几种方法

    复习map的过程中想到的,做个简单的记录 public class HashMapTest { public static void main(String args[]) { Map<Inte ...

  3. asp.net mvc-identity初步学习

    Install-Package Microsoft.AspNet.Identity.EntityFramework Install-Package Microsoft.AspNet.Identity. ...

  4. 浙大PAT考试1013~1016(最伤的一次。。)

    我能说我1016WA了几天都不得最后还是拿别人代码交的么. .. 真心找不到那个神数据.. . 自己把整个程序的流程都画出来了.细致推敲是木有问题的啊... 题目地址:点击打开链接 先从1013開始介 ...

  5. POJ 2407

    裸 的求欧拉函数 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...

  6. code::blocks配置编译cuda并进行第一个demo的測试

    我们先新建个NVCC的编译器. 使用复制GCC编译器的方式进行新建,然后我们进行下面的路径配置 先来看看链接库,将我们常常使用的cuda库链接进来. 然后链接cuda的头文件: 接着配置调试工具以及编 ...

  7. Ubuntu(64位)编译Android源码常见错误解决办法

    2013年07月10日 14:47:27 阅读数:1239 错误: /usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file ...

  8. Ubuntu开机报错:could not update ICEauthority file /home/user/.ICEauthority(转载)

    解决方法如下: 一. 代码:sudo chown $USER:$USER /home/$USER/.ICEauthority        sudo chmod 644 /home/$USER/.IC ...

  9. line-height与间距总总

    一点说明(个人吐槽,可以略过) 之所以想写这篇文章,是因为自己工作的经验总结.以前的页面编写极度不注重间距大小,特别是行级元素间距.认为只要差不多好就行了,没必要花那么大的精力去抠几px的小细节.事实 ...

  10. 彻底解决降级安装失败无法彻底卸载应用bug

    彻底解决魅族手机无法彻底卸载应用bug使用Flyme系统的同学可能会遇到一个问题:卸载了某些软件(例如通过开发者模式调试安装的应用)后,实际这个应用还残留在系统,当你用低版本或者其他签名的apk覆盖安 ...