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

前言:

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

目录

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

1.通过Git仓库

2.通过windows上传 

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

1.前提条件:

2 编译内核:

(1)编译内核 

(2)编译设备树

3.编译安装内核模块

(1) 编译内核模块

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

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

 (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终端上执行如下命令。 

git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git

2.通过windows上传 

 hello.c的源码如下:


/* 执行命令: ./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]);elseprintf("Hello, world!\n");return 0;
}

 编译程序 在Ubuntu中可以执行以下命令编译、执行:

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

 mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt 

 

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

执行以下命令编译程序:

arm-buildroot-linux-gnueabihf-gcc -o hello hello.c

 

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

cp  hello   /home/book/nfs_rootfs 

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

1.前提条件:

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

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

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

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

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

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

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

2 编译内核:

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

cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88 
make 100ask_imx6ull_defconfig 

(1)编译内核 

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

make zImage  -j4 

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

(2)编译设备树

 make dtbs

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

cp arch/arm/boot/zImage ~/nfs_rootfs
cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb  ~/nfs_rootfs 

3.编译安装内核模块

(1) 编译内核模块

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

cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make  modules 

内核模块编译完成后如图 

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

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

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

sudo apt install tree

下载完成如图:

执行以下命令安装模块: 

 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) 查看当前内核版本

uname -a

(2)挂载网络文件系统

 mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt

(3)更新内核

cp  /mnt/zImage  /boot 

(4)更新设备树

cp  /mnt/100ask_imx6ull-14x14.dtb   /boot 

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

cp  /mnt/lib/modules  /lib  -rfd 

(7)同步一下

sync

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

reboot

5.编译驱动

(1)上传内核文件

(2)编译模块驱动

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

/home/book/100ask_imx6ull-sdk/Linux-4.9.88

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

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

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

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

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

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

(2)装载驱动程序

[root@imx6ull:~]# cd /mnt/01_hello_drv/

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

[root@imx6ull:/mnt/01_hello_drv]# insmod hello_drv.ko

[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices

[root@imx6ull:/mnt/01_hello_drv]# cat /proc/devices
Character devices:1 mem4 /dev/vc/04 tty5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input29 fb81 video4linux89 i2c90 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 gpiochipBlock devices:1 ramdisk
259 blkext7 loop8 sd31 mtdblock65 sd66 sd67 sd68 sd69 sd70 sd71 sd
128 sd
129 sd
130 sd
131 sd
132 sd
133 sd
134 sd
135 sd
179 mmc

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

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

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

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

7.进行编译测试

[root@imx6ull:/mnt/01_hello_drv]# ./hello_drv_test

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/123147.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放,会自动翻页,直到翻页到最后一页。

mac安装jenkins

1、安装jenkins之前确认是否安装了homebrew 2、开始安装jenkins 安装完如下图则安装完成 3、不想用默认ip和端口的自己改一下ip和端口 4、启动jenkins brew services restart jenkins 使用自己修改后的ip:port http://0.0.0.0:8088 根据提示信息,拿到管理员密码&…

深度学习中Transformer的简单理解

Transformer 网络结构 Transformer也是由编码器和解码器组成的。 每一层Encoder编码器都由很多层构成的,编码器内又是self-attention和前馈网络构成的。Self-attention是用来做加权平均,前馈网络用来组合。 但是decoder有点不同,多了一层En…

从0到1之微信小程序快速入门(基础知识)

目录 JSON 配置文件 WXML 模板 WXSS 样式 JS 逻辑交互 微信小程序中,每个页面由4 个基本文件组成,它们分别是:js文件(页面的脚本文件,存放页面的数据、事件处理函数等)、json文件(当前页面的配置文件,配置窗口的外…

html2pdf

页面布局时将需要保存在同一页pdf的dom元素用div包裹,并为该div添加class类名,例如.convertPDF,如果有多页创建多个.convertPDF这个div,再循环保存pdf即可 用到了html2canvas和JsPdf这两个插件,自行站内搜索安装

磁盘管理(初始化,引导块,坏块管理,固态硬盘)

目录 1.磁盘初始化2.引导块3.坏块的管理1.坏块检查2.坏块链表3.扇区备用 4.固态硬盘(SSD)1.原理2.组成3.读写性能特性4.与机械硬盘相比5.磨损均衡技术 1.磁盘初始化 ①进行低级格式化(物理格式化),将磁盘的各个磁道划分…

openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路

为什么要这样做? 随着国产化的普及,国家政策对信创产业的支持,尤其一些金融证券行业、政府单位等,逐渐开始走国产化信创的路线,越来越多接触到国产 CPU (arm 平台,比如华为的鲲鹏处理器&#xf…

koa搭建服务器(二)

在上一篇文章已经成功的运行了一个http服务器,接下来就是使用Sequelize ORM(官方文档:Sequelize 简介 | Sequelize中文文档 | Sequelize中文网)来操作数据库。 1、安装依赖 首先也是需要安装相关的依赖 npm i sequelize npm i …

MySQL面试题

面试题一 1、创建一个数据库 create database db_one; 2、 创建四张表 create table student( s_id int(10) not null comment 学号 primary key, s_name varchar(20) not null comment 姓名, s_birth year comment 生日, s_sex varchar(4) default "女" comment 性…

【PointNet—论文笔记分享】

第一个直接基于原始点云数据进行分割、分类的模型,之前都是基于多视图或者体素的方式。 论文: PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation代码: TensorFlow版 Pytorch版 基本模型架构: 分别对每个点进行特征提取…

微信小程序vue+uniapp旅游景点门票预订系统 名胜风景推荐系统

与此同时越来越多的旅游公司建立了自己的基于微信小程序的名胜风景推荐平台,管理员通过网站可以添加用户、景点分类、景点信息、在线预订、最新推荐,用户可以对景点信息进行在线预订,以及开展电子商务等。互联网的世界里蕴藏无限生机&#xf…

redis6.0源码分析:简单动态字符串sds

文章目录 sds简介与特性(面试)sds结构模型数据结构苛刻的数据优化数据结构优化uintX_t对齐填充 sds优势O(1)时间复杂度获取字符串长度二进制安全杜绝缓冲区溢出自动扩容机制——sdsMakeRoomFor方法 内存重分配次数优化 sds最长是多少部分API源码解读创建sds释放sds sds简介与特…

如何从Android手机上轻松恢复误删除的短信 ?

当您使用 Android 手机时,您可能会误删除一些 Android 短信。如果这些消息对您很重要,您可能想要恢复它们。在这种情况下,您可以尝试使用U1tData安卓数据恢复(奇客软件) 来完成这项工作。这篇文章将向您展示更多信息。…

MinIO安装

Minio是一个开源的分布式对象存储服务器,它兼容Amazon S3服务接口。它可以用于构建私有云存储,为应用程序提供可扩展的对象存储功能。 安装 docker安装 docker run -d -p 9000:9000 -p 50000:50000 --name minio \ -e "MINIO_ROOT_USERadminpili…

Springmvc 讲解(1)

文章目录 前言一、SpringMvc1、简介2、核心组件和调用流程2.1 涉及组件的理解 3、小案例快速体验3.1场景需求3.1.1 导入依赖3.1.2 controller声明3.1.3 核心配置类3.1.4 环境搭建3.1.6 配置tomcat3.1.7 测试 二、SpringMvc 接收参数1.路径设置注解2、param接收参数四种类型2.1 …

AD教程(一)工程组成及创建

AD教程(一)工程组成及创建 工程组成 原理图库 绘制电阻模型、芯片模型、电容模型等,即将元件模型绘制出来。 原理图 将绘制的原件模型放置到原理图中,然后再添加连接的导线、网络标号。器件和器件之间的连接关系,在原…

单片机中的 _nop_() 延时以及其相关的基础扩展

使用 _nop_() 函数做延时遇到的一些问题 以及对此延伸出的一些需要了解的基本概念 ...... by 矜辰所致 完善文章内容结构,补充指令周期、机器周期等一些基本概念 2023/10/25前言 最近还是继续做着项目,因为在某 8051 内核芯片上使用到了 I…

Docker数据卷

目录 1.bind mount 2.docker managed volume 1.bind mount docker run -it --rm -v /tmp/data1:/data1 -v /tmp/data2:/data2:ro -v /etc/passwd:/mnt/passwd:ro busybox 2.docker managed volume docker run -d --name web1 webserver:v3 docker inspect web1 cd/var/lib/doc…

泰州市旅游景点门票预订管理系统 vue+uniapp微信小程序

本文从管理员、用户的功能要求出发,泰州市旅游景点管理小程序中的功能模块主要是实现用户、景点类型、景区信息、门票预定。经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与泰州市旅游景点管理…

leetcode经典面试150题---4.删除有序数组中的重复项II

目录 题目描述 前置知识 代码 方法一 双指针 思路 图解 实现 复杂度 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间&…