文章目录
- 前言
- 一、Linux中配置编译环境
- 1.1 linux下安装软件的方法
- 1.2 交叉编译工具链的安装
- 1.2.1 测试是否安装成功
- 1.3 设置环境变量
- 1.3.1 将工具链导出到环境变量
- 1.4 为工具链创建arm-linux-xxx符号链接
- 二、 搭建运行开发环境
- 2.1 tftp网络方式加载内核和设备树文件
- 2.2 nfs网络方式加载rootfs
- 参考资料
前言
搭建驱动开发的环境,便于调试。文章记录了本人的项目实践和朱有鹏老师的课程知识汇总。
一、Linux中配置编译环境
1.1 linux下安装软件的方法
(1)在线安装。譬如ubuntu中使用apt-get install vim来安装vim软件。
(2)自己下载安装包来安装。缺陷: 不知道下载的安装包和系统是否匹配。
(3)源代码安装。
总结:安装交叉编译工具链(arm-linux-gcc)实际采用第二种安装方式。
1.2 交叉编译工具链的安装
打开虚拟机,在/usr/local/下创建/usr/local/arm文件夹
先将安装包从Windows中弄到linux中去。可以用共享文件夹,也可以用Samba,也可以用cuteftp。
解压:tar -jxvf arm-2009q3.tar.bz2
应用程序在解压出来的文件中,安装在/usr/local/arm/arm-2009q3/bin目录下。
注:linux中的目录管理方法。技术角度来讲,linux中所有目录性质都是一样的,所以技术角度来讲我们把软件安装到哪里都行。但是如果胡乱放置,将来程序可能不好找。所以久而久之就总结了一个文件放置的一般定义,譬如说,/bin目录放置一些系统自带的用户使用的应用程序,/sbin目录下存放的是系统自带的系统管理方面的应用程序。
那我们装软件放在哪里?
一般都在/usr目录下。我们安装arm-linux-gcc,就在/usr/local/底下创建一个arm文件夹,然后装到里面。
1.2.1 测试是否安装成功
切换到真正的应用程序的安装目录下(即/usr/local/arm/arm-2009q3/bin), 去执行arm-linux-gcc -v
执行方法:./arm-none-linux-gnueabi-gcc -v
执行后可以得到一长串输出,其中有**“gcc version 4.4.1”**字样,即表示安装成功。
arm-none-linux-gnueabi-gcc No such file or directory这个错误的分析思路:正常来说只有某个被编译的文件不存在才会报这个错误,但如果确少某个必要的包,也会出现这个问题,而且根本不知道从哪里查问题。
真正原因: 这个gcc可执行文件是32位的版本,而在64位系统上需要安装32位兼容包才可以运行正常。
解决办法:
安装ia32-libs (sudo apt-get install lib32z1
)
但是此时只能在应用程序目录下执行应用程序或者在别处执行时需要写入完整的应用程序路径/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc-v比较繁琐,所以下面引入环境变量。
1.3 设置环境变量
环境变量就是操作系统的全局变量。每一个环境变量对操作系统来说都是唯一的,名字和所代表的意义都是唯一的。linux系统可以有很多个环境变量。其中有一部分是linux系统自带的,还有一些是我们自己来扩充的。我们这里涉及到的一个环境变量是PATH。PATH这个环境变量是系统自带的,它的含义就是系统在查找可执行程序时会搜索的路径范围。(此时在任意路径直接执行arm-none-linux-gnueabi-gcc -v都可以了)
输出linux系统环境变量: echo $PATH
1.3.1 将工具链导出到环境变量
在终端中输入
export PATH=/usr/local/arm/arm-2009q3/bin:$PATH
但是此时只要关掉这个终端再另外打开一个立马就不行了。原因是我们本次终端中执行时的操作只是针对本终端,以后再打开的终端并未被执行过这个命令所以没导出。
解决方案:
在~/.bashrc中,在最下面添加环境变量
export PATH=/usr/local/arm/arm-2009q3/bin:$PATH
更新~/.bashrc文件, source ~/.bashrc
1.4 为工具链创建arm-linux-xxx符号链接
终端中输入: ln arm-none-linux-gnueabi-addr2line -s arm-linux-addr2line,即可通过arm-linux-addr2line访问ln arm-none-linux-gnueabi-addr2line
二、 搭建运行开发环境
2.1 tftp网络方式加载内核和设备树文件
- 将uImage和dtb文件放入到ubuntu中的/tftpboot
- 在开发板中设置uboot参数,使其能够去加载内核(根据自己实际的IP进行配置),或直接把配置过nfs服务的内核,经过编译得到的zImage烧录到开发板。
set ipaddr 192.168.1.10
set serverip 192.168.1.141
set bootcmd tftp 0x41000000 uImage \; tftp 0x42000000 exynos4412-fs4412.dtb \; bootm 0x41000000 - 0x42000000
save或saveenv
2.2 nfs网络方式加载rootfs
- 需要一个根文件系统目录–rootfs.tar.xz,需要解压到ubuntu
sudo tar -zxvf rootfs.tar.xz -C /x210_porting/rootfs
- 配置nfs服务器(需要安装),让/x210_porting/rootfs可以被挂载
sudo vim /etc/exports
/x210_porting/rootfs *(subtree_check,rw,no_root_squash,async)
sudo service nfs-kernel-server restart //重启nfs服务器,或sudo /etc/init.d/nfs-kernel-server restart
测试是否挂载成功
sudo mount -t nfs localhost:/x210_porting/rootfs /mnt
- 设置bootargs使开发板从nfs去挂载rootfs(内核配置记得打开使能nfs形式的rootfs)。在开发板中去指定内核要挂载/opt/…/rootfs–切换到开发操作。
setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/x210_porting/rootfs/rootfs ip=192.168.1.10:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
save
reset //重启开发板
解释:
bootargs 是uboot传递给内核到启动参数,是一个字符串
console=xxx: 告诉内核启动时候到调试信息是从哪个设备输出
init=xxx: 告诉内核linux到第一个用户进程是什么
root=xxx : 告诉内核根文件系统在哪里
root=/dev/nfs 表示根文件系统在网路远端
nfsroot=ip:path
ip=xxx :告诉内核开机的时候内核的ip地址是多少(静态分配ip)
- 修改Makefile中的KERN_DIR使其指向自己建立的内核源码树,并将自己编译好的驱动.ko文件放入nfs共享目录下去
4、开发板启动后使用insmod、rmmod、lsmod等去进行模块实验
至此,我们具备了开发驱动的基础,我们将在之后一步步去探究驱动开发的奥秘。
参考资料
HQ驱动开发环境搭建-上
驱动开发环境搭建-下
华为云