之前的工作内容大多为调试各部分的硬件和系统的bug,真正编写代码的机会很少,或者说根本没有。
因此,想借着重新学习卫东山视频的机会,使用rk3399的板子来交叉编译驱动程序。
很简单,只要安装交叉编译工具链即可。
sudo apt-get install gcc-5-aarch64-linux-gnu
这样使用aarch64-linux-gnu-gcc hello.c,命令编译得到的a.out即可在开发板上运行。
2.由于交叉编译,若一直使用filezilla来进行文件传输,有些多次一举,因此计划采用挂载pc机共享目录的方式进行
转自下部链接:
https://blog.csdn.net/u013000434/article/details/17048541
首先得在宿主机上安装nfs服务器,并设置共享目录(以Ubuntu 12.04为例):
1_1、sudo apt-get install nfs-kernel-server nfs-common #安装nfs服务器#
1_2、sudo vim /etc/exports #打开exports,更改配置文件#
1_3、在最后加入/home/steve/share *(rw,sync,no_root_squash) #设置共享目录#
1_4、sudo /etc/init.d/nfs-kernel-server restart #重启nfs服务器#
做完这四步,基本就完成了宿主机上nfs服务器的配置,你要是不放心的话,也可以在本地挂载,做个测试:
1_5、sudo mount -t nfs -o nolock 192.168.0.XXX:/home/steve/share /mnt
# 其中,棕色为服务器ip地址,红色为共享的目录, 蓝色为本地的挂载目录 #
开发板也需要安装nfs服务:
sudo apt-get install nfs-common
至此,开发板已经可以访问PC机的目录了。
3、最根本的目的是,在pc机上编译驱动,可以直接在开发板上运行,而不必编译整个内核。
由于rk3399的内核编译时,使用的是一个rockchip提供的sdk,经过测试,如果将其中的kernel单独拷贝出来,那么首先内核编译就不通过,所以后续的交叉编译就无法执行,因此,直接将Makefile中的内核路径,指定为sdk中的内核路径,编译模块成功,insmod成功,可以在/proc/devices路径下看到自己注册的字符设备。
Makefile采用了韦东山的文件:
KERN_DIR = /home/cwp/work/rockchip/linux/kernel
all:
make -C $(KERN_DIR) M=`pwd` modules
clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
obj-m += first_drv.o
补充:
查看sdk中内核版本为4.4.179,于是从linux官网下载了该内核,使用sdk中的内核配置,当拷贝了sdk中的设备树后,直接按照sdk的编译方法编译设备树时,发下不通过,应该是瑞芯微做了一些修改,所以直接make,对提示的配置项直接回车默认。
结果编译出的ko模块时x86-64架构的,很明显,需要修改内核中的架构和编译器配置,发现如下两行并做出修改:
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
ARCH ?= arm64
CROSS_COMPILE ?= aarch64-linux-gnu-
编译出来的ko模块可以在开发板上insmod,至此,交叉编译环境的搭建完成,必每次都重新编译和烧写内核,也不必依赖于rockchip的sdk开发包。