第二次写linux驱动总结

  第一次写驱动是在去年,2019年十月份左右。当时是看着韦老师的视频一步步完成的。其中经历了很多error.搭建环境花费了很多精力。时间来到了2020年2月19日星期三,韦老师新视频出来了,我跟着再来了一次学习,使用开发板是100ask_6ull,依然是从搭建环境开始,不过感觉没有说明进步,该经历的坎坷,一样也没有少。特别是shinrk,压缩虚拟机ubuntu大小,导致挂掉,幸亏之前导出来过一次,又还原了!要不然,又要推迟2天!废话不多说,下面正式开始。

准备工作:

  1. 构建系统

使用如下命令一键配置/初始化开发环境,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 命令使其生效。

  1. 编译

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.烧录

  1. 上面步骤编译后的u-boot-dtb.imx、zImage、100ask_imx6ull-14x14.dtb 3个文件,copy到目录: 100ask_imx6ull-mfgtools\Profiles\Linux\OS Firmware\files 下。
  2. buildroot-image-100ask_100ask-ddr512m-emmc4g.vbs所在目录不要有中文!

USB线不要经过USB HUB!直接插到电脑!台式机不要插前面,插后面。

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

上面准备工作做完了,下面就是进行驱动代码的编写和测试了。

  1. 怎么访问u盘,tf卡等,需要挂载

Mount -t

怎么查看有没有挂载?cat /proc/mounts查看。

  1. 怎么快速查看用户手册?

man 2 read

Man write

注意:黑科技,F,往前翻;B,往后翻。

3.怎么查找所用的函数比如printf()需要包含哪些头文件?

就使用man指令查询,

  1. 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

  1. 驱动测试常用指令

insmod firstdrvtest.ko

chmod +x  firstdrvtest   //增加可执行属性,否则执行时会出现-

Lsmod

cat /proc/devices

ls /dev/hello -l

rmmod hello_drv //卸载驱动

dmesg  //查看printfk打印信息

代码具体过程就不贴出来了,有详细的教程,只记录下出现的问题的解决方法:

insmod lzhhello_drv..ko失败,见下方:

[[email protected]:/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

[[email protected]:/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里面。

板子测试驱动记录如下:

[[email protected]:/home/book/nfs_rootfs]# rmmod hello_drv

[[email protected]:/home/book/nfs_rootfs]# lsmod

Module                  Size  Used by    Tainted: G

lzhhello_drv            3548  0

[[email protected]:/home/book/nfs_rootfs]# ./lzhhello_drv_test -w lzjdhsjcjsjj

can not open file /dev/hello

[[email protected]:/home/book/nfs_rootfs]# rmmod lzhhello_drv

[[email protected]:/home/book/nfs_rootfs]# lsmod

Module                  Size  Used by    Tainted: G

[[email protected]:/home/book/nfs_rootfs]# insmod lzhhello_drv.ko

以上就是本次学习的驱动部分记录,只选择主要的记录下来了。像makefile,代码编写过程等等都没有记录了,参考教程即可。

原文地址:https://www.cnblogs.com/zhihui-3669/p/12332379.html

时间: 2024-11-10 14:07:53

第二次写linux驱动总结的相关文章

怎么写Linux驱动

搞了一段时间驱动后的个人感悟,不管什么驱动,要少走弯路,共同的驱动工作流程应该如下: 1.看书,看资料,搞清驱动的原理:内核的该类驱动的架构,工作机制等,建议必读的文档是linux内核源代码的Document目录下的该驱动的txt文档,这里的文档最直接,最核心.最关键... 该有的都有了. 2.看datasheet,datasheet往往很多页,需要现在全看吗?No,现在先看总体的相关内容,先了解管脚定义,了解总体架构,了解寄存器或内存分配.掌握硬件的基本工作原理. 以上两步别想着偷懒略过,即使

linux驱动probe函数的实现框架思考

linux驱动probe函数的实现框架思考 .probe函数实现无非就是1)创建一个私有的driver_data用于区分不同的device,因为一个driver可以管理多个device,2)parse device tree,并根据配置申请资源.io resource.memory:3)初始化设备4)注册对应的子系统暴露对应的接口,子系统相关的底层函数需要你实现,实现/dev/设备的file_operation.sysfs.proc接口.:5)dev_set_drvdata 绑定私有结构和设备的

编写一个陌生的linux驱动的技巧

编写一个陌生的linux驱动的技巧 当你要写一个陌生的linux子系统的驱动时,例如v4l2的camera sensor驱动.首先你得去google.百度搜索一些关于这个子系统****框架的介绍,由于网上文章往往有错误,所以你要多看几篇好的文章,从而有一定了解.然后需要看linux相关的子系统的代码,特别是子系统的api,从而更深入的了解.然后你找一个使用该子系统的应用层和驱动代码例子,进一步理解.然后你基于已有的demo硬件和该子系统设备的驱动,例如camera sensor驱动ov5640_

第二十二篇:再写Windows驱动,再玩Windbg---NET

2011年到现在,就没再怎么搞过Windows驱动了. 最近, 由于项目需要, 试着改一改一个显卡驱动(KMDOD), 从实践上证明, 我在理论上对一个驱动的架构的正确与否.(USB Display = KMDOD + AVStream). 其中, KMDOD是完成显示的部分功能, 完成其中的VidPN(Video present network), 将驱动中原来的POST物理设备转变为USB物理设备. 而AVStream之所以这样提出, 完成是由于USB Video class的启发, 要不然

Linux驱动开发盲点笔记1

1. vim中在找到搜索目标后,使用n与N进行定位查找 2. vim中使用gg到最好第一行,使用xxxG到某一行,否则G直接到最后一行: 3. ln -s 产生的链接文件最终指向的目标文件src 新产生的当前软链接文件dst. ln -s project(磁盘上实际存在的文件或者目录) a.lnk ln -s src dst(新产生的文件dst,dst链接到src) symlink功能类似 4 tar -czvf 最终生产的tar打包好的文件 待打包的文件或者文件夹 tar czvf a.tar

linux驱动面试题整理

资料来自网上,简单整理,答案后续补充...... 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可

linux驱动移植(nand,yaffs2)

原文:http://blog.sina.com.cn/s/blog_7090b8670101b0bi.html linux驱动移植(nand,yaffs2) 在linux操作系统的顺利移植之后,linux的内核虽然在板子上跑了起来,但是此时linux还不支持板子的的各个硬件,比如说lcd,摄像头,声卡,usb等模块,我们必须要在板子上装入驱动程序后,才能上这些硬件在linux操作系统下工作. 这些驱动在内核中都有驱动的源码,我们要做的就是将这些驱动源码编译到内核中,当然在编译之前是需要对驱动源码

s3c6410 Linux 驱动开发环境搭建

s3c6410 Linux 驱动开发环境搭建 -- 既然你是做Linux开发的,你还用虚拟机? 非常多人都在win下做开发,于是SD_writer.exe之类的烧写工具"大行其道",多是用虚拟机Linux. 全然转到Linux下学习開始蛮不爽的,开发板制作商送的教程都是些讲Win-CE的东东,感觉实质性的东西没什么.对于全然用Linux做开发的技术解说非常少,连烧写SD卡都用的win以下的程序.后来找了些资料,整理在这里,希望留给有心人.共同营造一个更好的共同学习的环境. 当别人遇到困

驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的住,不然真像一些人说的,学了一年嵌入式感觉还没找到门. 不能再扯了,涉及到linux的驱动开发知识面灰常广,再扯文章就会变得灰常长.首先还是回到led驱动的本身上,自从linux被移植到arm上后,做驱动开发的硬件知识要求有所降低,很多都回归到了软件上,这是系统编程的一大特点,当然 ,也不排除有很多