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

news2024/12/25 1:05:07

前言:

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

目录

一、开发板的第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]);
        else
                printf("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 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 命令来查看是否安装成功 

[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.coloradmin.cn/o/1147721.html

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

相关文章

Day 13 python学习笔记

模块 内置模块 加密 加密是成本与时间的问题 不可逆加密 哈希加密,单向性,唯一性。 可逆加密 对称加密:加密与解密采用同一密匙(如文件压缩时设置密码) DES算法 非对称加密:采用一对密匙,公匙、…

邦邦资讯|邦邦机器人10月新鲜事来袭,请查收

01 邦邦机器人研发中心徐汇新址落成 立足新起点 实现新跨越 10月初,邦邦机器人成立徐汇研发中心,历时半年的策划、设计、讨论、施工,正式落定上海市徐汇区桂林路406号华鑫中心1号楼505室,“这是邦邦机器人发展史的又一座重要里程…

java代码审计-不安全的配置-Tomcat任意文件写入(CVE-2017-12615)

Tomcat任意文件写入(CVE-2017-12615) 影响范围:Apache Tomcat 7.0.0 - 7.0.79 (windows环境) 当 Tomcat 运行在 Windows 操作系统时,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置…

部署K8S

防火强的初始化: [rootk8s-node-12 ~]# systemctl stop firewalld NetworkManager [rootk8s-node-12 ~]# systemctl disable firewalld NetworkManager Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /et…

【Android】MQTT入门——服务器部署与客户端搭建

目录 MQTT 协议简介应用场景优点缺点 部署服务端下载安装包启动服务器 搭建客户端下载SDK添加依赖配置MQTT服务和权限建立连接订阅主题发布消息取消订阅断开连接 MQTT客户端工具最终效果实现传感器数据采集与监测功能思路 MQTT 协议 简介 MQTT(Message Queuing Te…

剑指JUC原理-6.wait notify

wait nofity 小故事 - 为什么需要 wait 由于条件不满足,小南不能继续进行计算 但小南如果一直占用着锁,其它人就得一直阻塞,效率太低 于是老王单开了一间休息室(调用 wait 方法),让小南到休息室&#xf…

C++可视化 有穷自动机NFA 有穷自动机DFA

一、项目介绍 根据正则表达式,可视化显示NFA,DFA;词法分析程序 二、项目展示

洛谷 B2007 A+B问题 C++代码

目录 题目描述 AC Code 题目描述 AC Code #include<bits/stdc.h> using namespace std; typedef long long ll; int main() { int a,b;cin>>a>>b;cout<<ab<<endl;return 0; }

F5修复了允许远程代码执行攻击的BIG-IP认证绕过漏洞

图片 导语 近日&#xff0c;网络安全公司Praetorian Security的研究人员发现了一项影响F5 BIG-IP配置工具的严重漏洞&#xff0c;该漏洞被命名为CVE-2023-46747。攻击者可以通过远程访问配置工具来执行未经身份验证的远程代码&#xff0c;从而对系统进行攻击。本文将详细介绍该…

基于 Python 的个性化电影推荐系统的研究与实现

1 简介 本毕业设计的内容是设计并且实现一个电影个性化推荐系统。它是在Windows下&#xff0c;以MYSQL为数据库开发平台&#xff0c;Python技术和Tomcat网络信息服务作为应用服务器。电影个性化推荐系统的功能已基本实现&#xff0c;主要实现首页&#xff0c;个人中心&#xf…

热力学第三定律

热力学第三定律能斯特定理 凝聚系的熵在等温过程中的改变随绝对温度趋于零 如果有 即有&#xff1a; 也就是说&#xff1a;当绝对温度趋于零时&#xff0c;熵和状态参量y无关。 普朗克绝对熵 当绝对温度趋于零时&#xff0c;一个化学均匀系统的熵趋向于一个极限值 也就是说&a…

【数据结构】面试OJ题——时间复杂度2

目录 一&#xff1a;移除元素 思路&#xff1a; 二&#xff1a;删除有序数组中的重复项 思路&#xff1a; 三&#xff1a;合并两个有序数组 思路1&#xff1a; 什么&#xff1f;你不知道qsort&#xff08;&#xff09; 思路2&#xff1a; 一&#xff1a;移除元素 27. 移…

离线语音通断器开发-稳定之后顺应新需求

使用云知声的US516p6方案开发了一系列的离线语音通断器&#xff0c;目前已经取得了不小的收获&#xff0c;有1路的&#xff0c;3路的&#xff0c;4路的&#xff0c;唛头和扬声器包括唛头线材也在不断的更新打磨中找到了效果特别好的供应商。 离线语音通断器&#xff0c;家用控…

【OpenCV实现平滑图像金字塔,轮廓:入门】

文章目录 概要图像金字塔轮廓&#xff1a;入门 概要 文章内容的概要&#xff1a; 平滑图像金字塔&#xff1a; 图像金字塔是什么&#xff1f; 图像金字塔是指将原始图像按照不同的分辨率进行多次缩小&#xff08;下采样&#xff09;得到的一系列图像。这种处理方式常用于图像…

openpnp - Warning - Unknown firmware

文章目录 openpnp - Warning - Unknown firmware概述笔记https://github.com/openpnp/openpnp/wiki/Motion-Controller-Firmwares备注END openpnp - Warning - Unknown firmware 概述 接上飞达控制板后, 显示未知固件的警告 开始没看源码之前, 总以为是回答的版本号不合适, …

L2-1 插松枝

L2-1 插松枝 分数 25 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始…

【算法-数组2】有序数组的平方 和 长度最小的子数组

今天&#xff0c;带来数组相关算法的讲解。文中不足错漏之处望请斧正&#xff01; 理论基础点这里 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输…

多线程---阻塞队列+生产者消费者模型

文章目录 阻塞队列自己实现一个阻塞队列&#xff08;三步&#xff09;标准库中的阻塞队列使用阻塞队列的优势 生产者消费者模型 阻塞队列 队列&#xff08;Queue&#xff09;是我们熟悉的一个数据结构&#xff0c;它是“先进先出”的。但是并不是所有的队列都是“先进先出”的…

椭圆曲线在SM2加解密中的应用(三)

一、SM2加密运算 1.1加密原始数据 SM2加密运算首先是用户A对数据加密,用户A拥有原始数据 椭圆曲线系统参数长度为klen比特的消息M公钥Pb椭圆曲线系统参数,已经在 椭圆曲线参数(二)中详细介绍;M就是需要加密消息,长度为klen; 1.1.1 公钥Pb的计算方式 公钥Pb=dBG,其中…