【无标题】嵌入式Linux学习笔记3_开发板的第一个驱动程序

这里用的板子是韦东山的IMX6ULL PRO开发板。
编译驱动程序之前要先编译内核。

1.什么是内核?为什么要编译内核

“内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。”——百度百科释义。
简单来说,操作系统内核主要负责提供对计算机设备的核心管理调用。在Linux内核中,包括了进程管理、设备驱动程序、系统调用和安全防护、内存管理。
为什么在编译驱动前要先编译内核?
1.驱动程序要用到内核文件,例如驱动程序中包含头文件<asm/io.h>,其中asm是一个链接文件,可能指向asm-arm或指向asm-mips或其他目录,但是具体指向哪个呢?得先配置,编译内核,才会生成asm这个链接文件,指向具体的某个目录。
2.要让编译驱动时的内核和开发板上运行的内核一致
开发板上运行的内核时出厂时烧录的,编译驱动的时候用的内核时自己编译的,而内核不一致导致一些问题。所以要在编译驱动程序前,将编译出来的内核放到板子上,替代原有内核。
3.更换板子上的内核后,板子上的其他驱动也要更换

2.编译内核

不同开发板对应不同的配置文件,配置文件位于内核源码arch/arm/configs/目录。kernel的编译过程如下:
cd /home/book/100ask_imx6ull-sdk/Linux-4.9.88
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make mrproper
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make 100ask_imx6ull_defconfig
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make zImage -j4
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make dtbs
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ cp arch/arm/boot/zImage ~/nfs_rootfs
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs

编译完成后生成的文件如下图所示:
在这里插入图片描述
编译完成后,在 arch/arm/boot 目录下生成 zImage 内核文件, 在
arch/arm/boot/dts 目 录 下 生 成 设 备 树 的 二 进 制 文 件 100ask_imx6ull-14x14.dtb。把这 2 个文件复制到/home/book/nfs_rootfs 目录下备用,如图所示
在这里插入图片描述

3.编译内核模块

进入内核源码目录,编译内核模块:
输入命令:
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
make modules
在这里插入图片描述
内核模块编译完成后如下图所示:
在这里插入图片描述
安装内核模块到Ubuntu某个目录备用,因为后面会用到tree命令查看目录结构,所以如果没有该命令,需要执行以下命令安装tree命令:
sudo apt install tree
执行以下命令安装模块
cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install
把模块安装在nfs目录下
在这里插入图片描述
安装好驱动后的/home/book/nfs_rootfs/目录结构如图所示
在这里插入图片描述

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

Mobaxterm连接好开发板后,输入命令
mount -t nfs -o nolock,ver=3 192.168.5.11:/home/book/nfs_rootfs /mnt
将Ubuntu的nfs目录挂载到开发板上,因为这条命令很常用,可以用链接中提到的方法创建一个宏,以后要用到这个命令,只需点击一下宏。
https://blog.csdn.net/qq_42848805/article/details/128893835?spm=1001.2014.3001.5501
挂载好后,用以下命令更新内核:
cp /mnt/zImage /boot
用以下命令更新设备树:
cp /mnt/100ask_imx6ull-14x14.dtb /boot
用以下命令覆盖modules,其中-rfd的r是指递归复制,f是指强制复制,d是指之前是链接文件,现在仍作为链接文件复制。
cp /mnt/lib/modules /lib -rfd
执行上述命令拷贝文件后,内容可能还在内存里,执行以下命令同步一下,将内容刷到flash中。
sync
执行reboot命令重启开发板。
在开发板中执行uname -a
可以发现已使用刚刚编译好的内核。
在这里插入图片描述

5.编译、测试第一个程序

首先打开filezilla,连接好Ubuntu后,将韦东山提供的git仓库里的hello_drv驱动程序上传到ubuntu的nfs目录下。
在这里插入图片描述
复制下图中选中的路径
在这里插入图片描述
按照如下命令操作,首先进入01_hello_drv/目录,然后修改Makefile
在这里插入图片描述
将路径改为刚刚复制的路径。
在这里插入图片描述
Mobaxterm连接好开发板后,输入命令
mount -t nfs -o nolock,ver=3 192.168.5.11:/home/book/nfs_rootfs /mnt
将Ubuntu的nfs目录挂载到开发板上,输入cd /mnt/01_hello_drv/进入目录,输入ls查看一下目录。在这里插入图片描述
输入命令insmod hello_drv.ko装载驱动程序
在这里插入图片描述
执行驱动程序,-w写入字符串,-r是读取。
在这里插入图片描述
至此,第一个驱动程序就完成啦。
参考视频
https://www.bilibili.com/video/BV1zV411U7H9?p=12&share_source=copy_web
参考文献:
01_嵌入式Linux应用开发完全手册V5.1_IMX6ULL_Pro开发板

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值