第二次写linux驱动总结
第一次写驱动是在去年,2019年十月份左右。当时是看着韦老师的视频一步步完成的。其中经历了很多error.搭建环境花费了很多精力。时间来到了2020年2月19日星期三,韦老师新视频出来了,我跟着再来了一次学习,使用开发板是100ask_6ull,依然是从搭建环境开始,不过感觉没有说明进步,该经历的坎坷,一样也没有少。特别是shinrk,压缩虚拟机ubuntu大小,导致挂掉,幸亏之前导出来过一次,又还原了!要不然,又要推迟2天!废话不多说,下面正式开始。
准备工作:
- 构建系统
使用如下命令一键配置/初始化开发环境,Wget是一种很好用的因特网下载工具,他具有的很多特性是其他工具所不能比拟的,再者他是一个轻量级可配置的下载工具。
命令:wget --no-check-certificate --tries=100 -c -O Configuring_ubuntu.sh https://dev.tencent.com/u/weidongshan/p/DevelopmentEnvConf/git/raw/master/Configuring_ubuntu.sh && sudo chmod +x Configuring_ubuntu.sh && sudo ./Configuring_ubuntu.sh
运行错误解决:
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)
此问题表明当前有某个进程正在apt-get,然而我并没有使用任何命令,于是需要kill掉进程。
解决方法是:
sudo rm /var/lib/apt/lists/lock
又出错了:
Err:70 http://us.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libdrm-amdgpu1 amd64 2.4.99-1ubuntu1~18.04.2
Connection failed [IP: 91.189.91.24 80]
输入命令:sudo apt-get update
修改指令,增加: --tries=100 -c,意思是网络不好重复链接100次,-c表示续传。
再次执行上个指令。成功!

2.获取imx6ull-sdk 源码
执行 7z x 100ask_imx6ull-sdk.7z.002 解压缩文件(解压缩时请不要用 sudo 命令,否则后面编译会有一些列错误发生)。

使用的是下载的文件!
100ask_imx6ull-sdk.7z.001
100ask_imx6ull-sdk.7z.002
这两个文件是一起的,不可缺少!
3.设置交叉编译工具链
交叉编译工具链用来在 ubuntu 主机上编译应用程序,而这些应用程序是在 ARM 等其他平台上运行。设置交叉编译工具主要是设置 PATH, ARCH 和 CROSS_COMPILE 三个环境变量,下面介绍具体设置方法。
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
设置完毕后,要执行 source ~/.bashrc 命令使其生效。
- 编译
uboot
cd Uboot-2017.03
make distclean
make mx6ull_14x14_evk_defconfig
make
生成 u-boot-dtb.imx
⚫ 编译内核
cd Linux-4.9.88
make mrproper
make 100ask_imx6ull_defconfig
make zImage
make dtbs
在 arch/arm/boot 目录下生成 zImage 内核文件, 在 arch/arm/boot/dts 目录下生成
设备树的二进制文件 100ask_imx6ull-14x14.dtb。
⚫ 构建文件系统
cd Buildroot_2019.02
make clean
make 100ask_imx6ull-qt_defconfig
make all
注意:因为后续要学习QT,所以不是100ask_imx6ull_qt_defconfig。
5.烧录
- 上面步骤编译后的u-boot-dtb.imx、zImage、100ask_imx6ull-14x14.dtb 3个文件,copy到目录: 100ask_imx6ull-mfgtools\Profiles\Linux\OS Firmware\files 下。
- buildroot-image-100ask_100ask-ddr512m-emmc4g.vbs所在目录不要有中文!
USB线不要经过USB HUB!直接插到电脑!台式机不要插前面,插后面。

点击buildroot-image-100ask_100ask-ddr512m-emmc4g.vbs烧录


上面准备工作做完了,下面就是进行驱动代码的编写和测试了。
- 怎么访问u盘,tf卡等,需要挂载
Mount -t
怎么查看有没有挂载?cat /proc/mounts查看。
- 怎么快速查看用户手册?
man 2 read
Man write
注意:黑科技,F,往前翻;B,往后翻。
3.怎么查找所用的函数比如printf()需要包含哪些头文件?
就使用man指令查询,
- nfs配置
打开/etc/exports 文件,进行配置:
/work/ *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
/work/nfs_root 192.168.1.*(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
使用以下语句刷新配置并且重启NFS:
sudo exportfs -r
重启NFS服务
sudo /etc/init.d/nfs-kernel-server restart
在开发板上操作:
mount -o nolock -t nfs 192.168.1.9:/home/book/nfs_rootfs /home/book/nfs_rootfs
(其中nfs 192.168.1.9:/home/book/nfs_rootfs是虚拟机的目录。)
出现错误:Device or resource busy
改用命令:
mount -o nolock -t nfs 192.168.1.9:/home/book/nfs_rootfs /mnt
- 驱动测试常用指令
insmod firstdrvtest.ko
chmod +x firstdrvtest //增加可执行属性,否则执行时会出现-
Lsmod
cat /proc/devices
ls /dev/hello -l
rmmod hello_drv //卸载驱动
dmesg //查看printfk打印信息
代码具体过程就不贴出来了,有详细的教程,只记录下出现的问题的解决方法:
insmod lzhhello_drv..ko失败,见下方:
[root@imx6ull:/home/book/nfs_rootfs]# insmod lzhhello_drv.ko
[ 2231.161775] lzhhello_drv: loading out-of-tree module taints kernel.
[ 2231.169483] lzhhello_drv: disagrees about version of symbol device_create
[ 2231.179909] lzhhello_drv: Unknown symbol device_create (err -22)
[ 2231.193644] lzhhello_drv: disagrees about version of symbol device_destroy
[ 2231.206373] lzhhello_drv: Unknown symbol device_destroy (err -22)
[ 2231.215148] lzhhello_drv: disagrees about version of symbol device_create
[ 2231.223264] lzhhello_drv: Unknown symbol device_create (err -22)
[ 2231.230179] lzhhello_drv: disagrees about version of symbol device_destroy
[ 2231.237882] lzhhello_drv: Unknown symbol device_destroy (err -22)
insmod: can't insert 'lzhhello_drv.ko': Invalid argument
[root@imx6ull:/home/book/nfs_rootfs]
disagrees about version of symbol device_create Unknown symbol device_create
解决方法:
参考用户手册,更新内核

实测OK!
行如上操作后,重启开发板。并检查是否更新成功,方法是查看内核编译时间,对比下板子和虚拟机里ubuntu。
◼ 板子执行 cat /proc/version
◼ Ubuntu 虚拟机执行:date
对比内核编译的时间和当前运行内核的时间是不是一致,确保运行的内核更新最新的成
功。
要烧录的zlmage,以及dtb都在目录:/home/book/nfs_rootfs里面。
板子测试驱动记录如下:
[root@imx6ull:/home/book/nfs_rootfs]# rmmod hello_drv
[root@imx6ull:/home/book/nfs_rootfs]# lsmod
Module Size Used by Tainted: G
lzhhello_drv 3548 0
[root@imx6ull:/home/book/nfs_rootfs]# ./lzhhello_drv_test -w lzjdhsjcjsjj
can not open file /dev/hello
[root@imx6ull:/home/book/nfs_rootfs]# rmmod lzhhello_drv
[root@imx6ull:/home/book/nfs_rootfs]# lsmod
Module Size Used by Tainted: G
[root@imx6ull:/home/book/nfs_rootfs]# insmod lzhhello_drv.ko
以上就是本次学习的驱动部分记录,只选择主要的记录下来了。像makefile,代码编写过程等等都没有记录了,参考教程即可。
第二次写linux驱动总结的更多相关文章
- 超简单易用的 “在 pcduino 开发板上写 Linux 驱动控制板载 LED 的闪烁”
版权声明:本文为博主原创文章,未经博主同意不得转载.转载联系 QQ 30952589,加好友请注明来意. https://blog.csdn.net/sleks/article/details/251 ...
- 嵌入式linux驱动开发之给linux系统添加温度传感器模块
忙了几天,终于可以让ds18b20在自己的开发板的linux系统上跑了!虽然ds18b20不是什么新鲜玩意,但是想想知己可以给linux系统添加模块了还是有点小鸡冻呢! 虽然说现在硬件的资源非常丰富而 ...
- 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED
这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...
- 【从零开始,从内核驱动驱动到用户空间调用】编写第一个linux驱动,通过端口访问I/O寄存器。
目的: 通过I/O端口方式访问RTC的秒寄存器: 由于本人从来没看过linux方面的书籍,也只是会在终端用些常用的命令而已,这次老大叫我学着通过I/O端口方式直接去读写寄存器.于是我在google中搜 ...
- linux驱动简单介绍
linux驱动简单介绍 驱动基本介绍 驱动.顾名思义就是“驱使硬件设备行动”.设备驱动与底层硬件之间打交道,按照硬件设备的具体操作方式来读写设备寄存器,最终完成一系列操作. 设备 驱动充当了应用程序 ...
- linux驱动 之 module_init解析 (上)【转】
转自:https://blog.csdn.net/Richard_LiuJH/article/details/45669207 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- Linux 驱动开发
linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...
- linux驱动工程面试必问知识点
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...
随机推荐
- C++记录(二)
1.算术移位和逻辑移位. 逻辑移位是只补0,算术移位是看符号,负数补1,正数补0(讨论的是右移的情况下). 负数左移右边一样补0.如果遇到位运算的相关题目需要对int变量进行左移而且不知道正负,那么先 ...
- C语言运算符的优先级与结合性
结合性:左结合是从左到右依次执行,右结合是从右到左依次执行. 优先级 运算符 名称或作用 运算类型 结合方向 特点 1 () [] -> . 小括号运算符 下标运算符 指向结构成员运算符 结构成 ...
- python接口自动化之fiddler使用(二)
1.快捷设置,自定义会话框,查看get和post请求 (1)鼠标放在#后面,右键 (2)选择Customize columns (3)选择Miscellaneous (4)选择RequestMetho ...
- 题解【AcWing178】第K短路
题面 经典的 \(\text{A*}\) 算法例题. 我们可以把估价函数 \(f(i)\) 设置成当前点 \(i\) 到终点 \(t\) 的最短距离,这可以建反图使用 \(\text{Dijkstra ...
- PolandBall and Forest
PolandBall lives in a forest with his family. There are some trees in the forest. Trees are undirect ...
- Spring Boot的27个注解【核心】
导读[约定大于配置] Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用程序,还能轻松地通过一些注解配置与目前比较火热的微服务 ...
- LitElement(四)属性
1.概述 LitElement管理您声明的属性及其对应的属性.默认情况下,LitElement将: 确保在任何声明的属性更改时进行元素更新. 捕获已声明属性的实例值.在浏览器注册自定义元素定义之前设置 ...
- 三分钟快速上手TensorFlow 2.0 (中)——常用模块和模型的部署
本文学习笔记参照来源:https://tf.wiki/zh/basic/basic.html 前文:三分钟快速上手TensorFlow 2.0 (上)——前置基础.模型建立与可视化 tf.train. ...
- 2.2 logistic回归损失函数(非常重要,深入理解)
上一节当中,为了能够训练logistic回归模型的参数w和b,需要定义一个成本函数 使用logistic回归训练的成本函数 为了让模型通过学习来调整参数,要给出一个含有m和训练样本的训练集 很自然的, ...
- 初识Docker:BusyBox容器后台运行失败
1.问题描述:我在进行Docker网络实验时,使用docker run -d busybox命令时,busybox无法保持后台长期运行. ============================ ...