【基于mini2440开发板的交叉编译环境及内核树配置.
在学习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开发板的交叉编译环境及内核树配置.的更多相关文章
- u-boot-2011.06在基于s3c2440开发板的移植之引导内核与加载根文件系统
http://www.linuxidc.com/Linux/2012-09/70510.htm 来源:Linux社区 作者:赵春江 uboot最主要的功能就是能够引导内核启动.本文就介绍如何实现该 ...
- 一个简单的基于MINI2440开发板的启动代码
1. S3C2440大概的启动流程(NAND启动): ①设置CPU为SVC模式 ②关闭看门狗 ③屏蔽中断 ④关闭MMU ⑤初始化时钟 ⑥初始化内存(SDRAM) ⑦初始化栈指针(SP, R13) ⑧初 ...
- 第五章——搭建S3C6410开发板的测试环境
搭建S3C6410开发板的测试环境 通过本章的学习学会了如何在开发板上安装Android.开发板是学习和开发嵌入式技术的主要硬件设备,想要顺利的通过linux驱动访问硬件,是不能在PC板上模拟的,需要 ...
- 基于uFUN开发板的心率计(三)Qt上位机的实现
前言 上两周利用周末的时间,分别写了基于uFUN开发板的心率计(一)DMA方式获取传感器数据和基于uFUN开发板的心率计(二)动态阈值算法获取心率值,介绍了AD采集传感器数据和数据的滤波处理获取心率值 ...
- 【转】Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板
Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板 开发板:mini2440(2011.04.21)环境:ubuntu9.10 为方便的将文件上传到开发板,采用vsftpd, ...
- 手把手教你君正X2000开发板的OpenHarmony环境搭建
摘要:本文主要介绍基于君正X2000开发板的OpenHarmony环境搭建以及简单介绍网络配置情况 本文分享自华为云社区<君正X2000开发板的OpenHarmony环境搭建>,作者: 星 ...
- 基于uFUN开发板和扩展板的联网校准时钟
项目概述 上周在uFUN试用群里看到管理员说试用活动快结束了,要抓紧完成评测总结,看大家的评测总结也都写了,我也不能落后啊!正好最近做的扩展板到手了,于是赶紧进行调试,做了一个不用校准的时钟,时钟这种 ...
- 基于uFUN开发板的RGB调色板
前言 使用uFUN开发板配合Qt上位机,实现任意颜色的混合,Qt上位机下发RGB数值,范围0-255,uFUN开发板进行解析,然后输出不同占空比的PWM,从而实现通过RGB三原色调制出任意颜色. Qt ...
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...
随机推荐
- [tyvj 1061] Mobile Service (线性dp 滚动数组)
3月15日第一题! 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Local 题目描述 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须 ...
- vscode快捷键(lua开发)
快速定位行:ctrl+g 查找:ctrl+f 格式化代码:ctrl+alt+f 快速查找到当前复制内容的第一次出现的位置ctrl+d 其他常用不一一列举了
- 【ACM-ICPC 2018 沈阳赛区网络预赛 I】Lattice's basics in digital electronics
[链接] 我是链接,点我呀:) [题意] [题解] 每个单词的前缀都不同. 不能更明示了... 裸的字典树. 模拟一下.输出一下就ojbk了. [代码] #include <bits/stdc+ ...
- MySQL 函数大全及用法示例
1.字符串函数ascii(str) 返回字符串str的第一个字符的ascii值(str是空串时返回0) mysql> select ascii('2'); -> 50 mysql ...
- 洛谷 U249 匹配
U249 匹配 题目描述 输入整数s和两个整数集合A和B,从这A和B中各取一个数,如果它们的和等于s,称为“匹配”.编程统计匹配的总次数 输入输出格式 输入格式: 第一行为三个整数s(0<s≤1 ...
- mongodb 学习笔记 07 -- 数据备份、恢复
mongoexport 导出json或者csv格式 mongoimport 导入json或者csv mongodump 导出二进制bson结构数据以及索引信息 mongorestore 导入二进制文件 ...
- [Ionic] Align and Size Text with Ionic CSS Utilities
The Ionic framework provides several built-in CSS Utilities or directives that you can leverage when ...
- hashmap的put方法源码分析
put主源码如下: public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = ha ...
- [寒江孤叶丶的Cocos2d-x之旅_33]RichTextEx一款通过HTML标签控制文字样式的富文本控件
RichTextEx一款通过HTML标签控制文字样式的富文本控件 原创文章,欢迎转载.转载请注明:文章来自[寒江孤叶丶的Cocos2d-x之旅系列] 博客地址:http://blog.csdn.net ...
- tp中使用事务
是什么 事务是为了防止,多个操作,其中有失败,数据有部分被执行成功的时候使用的. 比如,银行,用户转账.张三钱扣了,结果李四钱还增加! 这个时候需要使用事务,确保张三钱扣了,李四的钱也增加,才真正的成 ...