Linux下的IMX6ULL——开发板的第一个APP和驱动实验(三)

前言:

万事开头难,如果我们在开发板上开发出第一个应用程序,第一个驱动程序,那么后续的开发就会稍微简单点,下面让我们来进行第一个应用程序和第一驱动程序的开发吧。

目录

一、开发板的第1个APP实验

1.通过Git仓库

2.通过windows上传

二、开发板的第1个驱动实验

1.前提条件:

[2 编译内核:](#2 编译内核:)

(1)编译内核

(2)编译设备树

3.编译安装内核模块

[(1) 编译内核模块](#(1) 编译内核模块)

[(2) 安装内核模块到Ubuntu某个目录下备用](#(2) 安装内核模块到Ubuntu某个目录下备用)

4.安装内核和模块到开发板上

[(1) 查看当前内核版本](#(1) 查看当前内核版本)

(2)挂载网络文件系统

(3)更新内核

(4)更新设备树

(5)接下来要把这些文件复制到开发板上

(7)同步一下

(6)最后重启开发板,它就使用新的zImage、dtb、模块了。

5.编译驱动

(1)上传内核文件

(2)编译模块驱动

6.在开发板安装驱动模块

(1)利用串口挂载网络文件系统

(2)装载驱动程序

7.进行编译测试


一、开发板的第1个APP实验

1.通过Git仓库

Git仓库里含有本教程的所有源码,前面已经在Windwos下载了Git仓库, 为例方便编译,也可以在Ubuntu中再次下载它。 在Ubuntu终端上执行如下命令。

cpp 复制代码
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git

2.通过windows上传

hello.c的源码如下:

cpp 复制代码
/* 执行命令: ./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中可以执行以下命令编译、执行:

上述命令编译得到的可执行程序hello 可以在 Ubuntu 中运行,但是如果把它放到 ARM 板子上去,它是无法执行的。因为它是使用gcc编译的,是给PC机编译的,里面的机器指令是x86的。 我们要想给ARM板编译出hello程序,需要使用交叉编译工具链

cpp 复制代码
 mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt 

我们要想给ARM板编译出hello程序,需要使用交叉编译工具链

执行以下命令编译程序:

cpp 复制代码
arm-buildroot-linux-gnueabihf-gcc -o hello hello.c

这样编译出来的hello程序才可以在ARM板子上运行。先把编译生成的 hello 文件拷贝到Ubuntu nfs服务目录下,备用:

cpp 复制代码
cp  hello   /home/book/nfs_rootfs 

二、开发板的第1个驱动实验

1.前提条件:

为什么编译驱动程序之前要先编译内核?(配置编译:1.内核,2.设备树,3.驱动)

驱动程序要用到内核文件:

比如驱动程序中这样包含头文件:#include ,其中的asm是 一个链接文件,指向asm-arm或asm-mips,这需要先配置、编译内核才会生成 asm 这个链接文件。

编译驱动时用的内核、开发板上运行到内核,要一致:

开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译 的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己编译出来到内核放到板子上去,替代原来的内核。

更换板子上的内核后,板子上的其他驱动也要更换

板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出 来的。所以在编译我们自己的第1个驱动程序之前,要先编译内核、模块,并且 放到板子上去。

2 编译内核:

不同的开发板对应不同的配置文件,配置文件位于内核源码 arch/arm/configs/目录。kernel 的编译过程如下:

cpp 复制代码
cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88 
make 100ask_imx6ull_defconfig 

(1)编译内核

编译完成zImage后才可编译设备树文件。

cpp 复制代码
make zImage  -j4 

编译完成后生成的文件如图

(2)编译设备树

cpp 复制代码
 make dtbs

编译完成后,在 arch/arm/boot 目录下生成 zImage 内核文件, 在 arch/arm/boot/dts 目录下生成设备树的二进制文件 100ask_imx6ull 14x14.dtb。把这 2个文件复制到/home/book/nfs_rootfs目录下备用。

cpp 复制代码
cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb  ~/nfs_rootfs 

3.编译安装内核模块

(1) 编译内核模块

进入内核源码目录后,就可以编译内核模块了:

cpp 复制代码
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make  modules 

内核模块编译完成后如图

(2) 安装内核模块到Ubuntu某个目录下备用

可以先把内核模块安装到nfs目录(/home/book/nfs_rootfs)。

注意:后面会使用tree命令查看目录结构,如果提示没有该命令,需要执行以 下命令安装tree命令:

cpp 复制代码
sudo apt install tree

下载完成如图:

执行以下命令安装模块:

cpp 复制代码
 cd ~/100ask_imx6ull-sdk/Linux-4.9.88/ 
 make  ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs  modules_install

把模块安装在nfs目录"/home/book/nfs_rootfs/"下:

4.安装内核和模块到开发板上

(1) 查看当前内核版本

cpp 复制代码
uname -a

(2)挂载网络文件系统

cpp 复制代码
 mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

(3)更新内核

cpp 复制代码
cp  /mnt/zImage  /boot 

(4)更新设备树

cpp 复制代码
cp  /mnt/100ask_imx6ull-14x14.dtb   /boot 

(5)接下来要把这些文件复制到开发板上

cpp 复制代码
cp  /mnt/lib/modules  /lib  -rfd 

(7)同步一下

cpp 复制代码
sync

(6)最后重启开发板,它就使用新的zImage、dtb、模块了。

cpp 复制代码
reboot

5.编译驱动

(1)上传内核文件

(2)编译模块驱动

首先,进入 100ask_imx6ull_src_bin 目录,修改 Makefile 文件 "KERN_DIR"为自己的内核所在路径,如果你的内核源码不在此目录则根据你的实际情况进行修改:

cpp 复制代码
/home/book/100ask_imx6ull-sdk/Linux-4.9.88

编译驱动程序和生成测试程序,修改完内核所在目录后,就可以编译模块驱动了

6.在开发板安装驱动模块

(1)利用串口挂载网络文件系统

启动开发板后挂载网络文件系统

开发板启动后通过nfs挂载Ubuntu目录的方式。使用的是VMware桥接方式,假设Ubuntu IP为192.168.5.11,在开发板上执行以下命令:

cpp 复制代码
[root@imx6ull:~]#  mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

(2)装载驱动程序

cpp 复制代码
[root@imx6ull:~]# cd /mnt/01_hello_drv/

在开发板串口终端上执行如下命令,即可安装相应的驱动模块。

cpp 复制代码
[root@imx6ull:/mnt/01_hello_drv]# insmod hello_drv.ko
cpp 复制代码
[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices
cpp 复制代码
[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  5 /dev/tty
  5 /dev/console
  5 /dev/ptmx
  7 vcs
 10 misc
 13 input
 29 fb
 81 video4linux
 89 i2c
 90 mtd
108 ppp
116 alsa
128 ptm
136 pts
166 ttyACM
180 usb
188 ttyUSB
189 usb_device
207 ttymxc
216 rfcomm
226 drm
245 hello        //hello驱动程序
246 ttyGS
247 ttyLP
248 watchdog
249 tee
250 iio
251 ptp
252 pps
253 rtc
254 gpiochip

Block devices:
  1 ramdisk
259 blkext
  7 loop
  8 sd
 31 mtdblock
 65 sd
 66 sd
 67 sd
 68 sd
 69 sd
 70 sd
 71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc

安装完成后可以执行lsmod 命令来查看是否安装成功

cpp 复制代码
[root@imx6ull:/mnt/01_hello_drv]# lsmod
Module                            Size  Used by
hello_drv                         3746  0
//hello_drv驱动程序

如果你没有更新板子上的内核,会出现类似如图所示错误

可以强行安装驱动程序,比如使用"insmod -f hello_drv.ko"这样的命令,它会提示说 "内核已经被污染了",但是不影响学习、不影响使用

7.进行编译测试

cpp 复制代码
[root@imx6ull:/mnt/01_hello_drv]# ./hello_drv_test

以上运行结果表明测试成功

相关推荐
希忘auto2 小时前
详解Redis的常用命令
redis·1024程序员节
yaosheng_VALVE17 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king17 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
一个通信老学姐5 天前
专业125+总分400+南京理工大学818考研经验南理工电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
sheng12345678rui6 天前
mfc140.dll文件缺失的修复方法分享,全面分析mfc140.dll的几种解决方法
游戏·电脑·dll文件·dll修复工具·1024程序员节
huipeng9267 天前
第十章 类和对象(二)
java·开发语言·学习·1024程序员节
earthzhang20217 天前
《深入浅出HTTPS》读书笔记(19):密钥
开发语言·网络协议·算法·https·1024程序员节
爱吃生蚝的于勒8 天前
计算机基础 原码反码补码问题
经验分享·笔记·计算机网络·其他·1024程序员节
earthzhang20218 天前
《深入浅出HTTPS》读书笔记(20):口令和PEB算法
开发语言·网络协议·算法·https·1024程序员节
一个通信老学姐8 天前
专业140+总分410+浙江大学842信号系统与数字电路考研经验浙大电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节