开发板和 Ubuntu 之间传文件
在 Ubuntu 上安装、配置 NFS 服务
安装NFS服务
sudo apt-get install nfs-kernel-server
修改/etc/exports,添加类似以下的内容(允许开发板通过 NFS访问 Ubuntu 的/home/book)
/home/book *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
重启NFS服务
sudo /etc/init.d/nfs-kernel-server restart
验证挂载自己
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/book /mnt
ls /mnt
在开发板上挂载
首先保证开发板和Ubuntu能相互ping通。假设Ubuntu的ip地址为:192.1681.100
mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book /mnt
一切顺利,就能在开发板的/mnt文件夹中访问到Ubuntu的/home/book文件夹里的文件了
开发前准备
在线下载内核及工具链
配置repo
git config --global user.email "user@100ask.com"
git config --global user.name "100ask"
下载源码
git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_imx6ull_mini-sdk && cd 100ask_imx6ull_mini-sdk
../repo/repo init \
-u https://gitee.com/weidongshan/manifests.git -b linux-sdk \
-m imx6ull/100ask_imx6ull_mini_linux4.9.88_release.xml --no-repo-verify
../repo/repo sync -j4
tar cjf Linux-4.9.88.tar.bz2 Linux-4.9.88
配置交叉工具链
永久生效
vi ~/.bashrc
配置路径
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull_mini-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
使文件生效
source ~/.bashrc
验证 交叉工具链
arm-buildroot-linux-gnueabihf-gcc -v
下载教程源码(可以先下载,里面有很多示例源码)
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
APP实验
找到01_all_series_quickstart\04_嵌入式Linux应用开发基础知识\source\01_hello中hello.c,如下所示
#include <stdio.h>
/* 执行命令: ./hello weidongshan
* argc = 2
* argv[0] = ./hello
* argv[1] = weidongshan
*/
int main(int argc, char **argv)
{
if (argc >= 2)
printf("Hello, %s!\n", argv[1]);
else
printf("Hello, world!\n");
return 0;
}
Ubuntu可执行文件
通过gcc生成在Ubuntu的可执行文件(gcc -o hello hello.c)
gcc -o hello hello.c
在Ubuntu中执行效果(此时,编译出来的hello,在开发板上执行不了)
./hello
->Hello, world!
./hello weidongshan
->Hello, weidongshan!
开发板可执行文件
直接用gcc 编译,只能在PC上执行,在开发板上执行不了,所以要使用交叉编译工具链生成开发板的可执行文件
arm-buildroot-linux-gnueabihf-gcc -o hello hello.c
将可执行文件拷贝到nfs服务文件夹下
cp hello /home/book
开发板挂载并将文件拷贝到自己的文件夹下(用nfs挂载可执行文件,开发板就可以直接使用)
mount -t nfs -o nolock,vers=3 192.168.1.100:/home/book /mnt
cp /mnt/hello ./hello
给文件增加可执行权限,执行
chmod +x hello
./hello
驱动实验
找到驱动源码01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识 \
/source/02_led_drv/02_led_drv_for_boards/100ask_imx6ull_src_bin
配置文件位于内核源码arch/arm/configs/目录(内核源码就是Linux-4.9.88)
编译内核镜像(ubuntu)
kernel编译
先进入 内核文件
cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
Linux下面去编译内核项目之前,一般常会用make mrproper去先删除之前编译所生成的文件和配置文件,备份文件等
make mrproper
指定开发板,也是指定是编译给ARM的,不是x86的。
make 100ask_imx6ull_mini_defconfig
开始编译内核 -j4也可以
make zImage -j2
编译设备树
make dtbs
四个步骤如下:
make mrproper
make 100ask_imx6ull_mini_defconfig
make zImage -j2
make dtbs
将生成的内核文件zImage,设备树文件100ask_imx6ull-14x14.dtb 移到nfs_rootfs 服务目录
cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs
编译安装内核模块(ubuntu)
编译内核模块
进入内核源码目录后,就可以编译模块了:
100ask: cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make modules
编译完成后如下
/*如果没有找到编译器,就手动指定交叉编译器*/
/*如果没有找到编译器,就手动指定交叉编译器*/
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules
安装内核模块到Ubuntu的某个目录下备用
可以先把内核模块安装到nfs目录(/home/book/nfs_rootfs)。后面会使用tree命令查看目录结构,先安装tree命令
sudo apt install tree
执行以下命令 安装模块 到 nfs_rootfs 文件目录下
book@100ask:~$ cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
安装完成
安装好驱动后的/home/book/nfs_rootfs/目录结构如下图
安装镜像和模块到开发板
假设:在 Ubuntu 的/home/book/nfs_rootfs /home/book/nfs_rootfs /home/book/nfs_rootfs 目录下 ,已经有了 已经有了 zImage 、 dtb 文件,并且有 lib/ modules odules odulesodules子目录 (里面含有各种模块 里面含有各种模块 )。
接下来要把这些文件复制到开发板上。假设 Ubuntu IP 为 192.168. 5.1 1, 在开发板上执行以下命令: 在开发板上执行以下命令: 在开发板上执行以下命令:(一定要是要在开发板执行,不是在Ubuntu)
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt #挂载
cp /mnt/zImage /boot #更新内核
cp /mnt/100ask_imx6ull-14x14.dtb /boot #更新设备树
cp /mnt/lib/modules /lib -rfd # 更新模块
sync #同步一下
重启,重启动之后,开发板就是新的内核,新的设备树,新的模块
reboot
重启完成,我们可以用 umane -a 查看版本的情况
uname -a
内核编译时间显示出来了
编译led模块
把02_led_drv_for_boards源码上传到Ubuntu ,下面的操作都是在Ubuntu上操作
G:\Linux\Git\01_all_series_quickstart\05_嵌入式Linux驱动开发基础知识\source\02_led_drv\02_led_drv_for_boards
用pwd命令复制内核路径 ,我们的路径内核路径如下,在编译内核源码已经设定好
/home/book/100ask_imx6ull-sdk/Linux-4.9.88
路径指到 02_led_drv_for_boards 文件夹
book@100ask:~/nfs_rootfs/02_led_drv_for_boards$
执行 vi Makefile
book@100ask:~/nfs_rootfs/02_led_drv_for_boards$ vi Makefile
设置内核路径 KERN_DIR , 保存
如果路径设置不对,会出错
执行 make 或 make all 命令就可以编译,编译完成后会生成 100ask_led.ko ledtest 两个文件
make
生成 100ask_led.ko(驱动程序) 和 ledtest(测试程序) 两个文件
把这两个文件拷贝到 Ubuntu nfs_rootfs 目录下
book@100ask:~/nfs_rootfs/02_led_drv_for_boards$ cp 100ask_led.ko ledtest ~/nfs_rootfs
登录开发板,在开发板复制这两个文件
开发板挂载到Ubuntu
开发板直接定位到 /mnt 目标下,ls 查看这两个文件
关闭系统led状态灯控制
echo none > /sys/class/leds/cpu/trigger
安装led模块
insmod 100ask_led.ko
执行
chmod +x ./ledtest
./ledtest
打开LED0
./ledtest /dev/100ask_led0 on
关闭LED0
./ledtest /dev/100ask_led0 off