1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 【无标题】嵌入式Linux学习笔记3_开发板的第一个驱动程序

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

时间:2019-10-21 19:23:56

相关推荐

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

文章目录

1.什么是内核?为什么要编译内核2.编译内核3.编译内核模块4.安装内核和模块到开发板上5.编译、测试第一个程序

这里用的板子是韦东山的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目录挂载到开发板上,因为这条命令很常用,可以用链接中提到的方法创建一个宏,以后要用到这个命令,只需点击一下宏。

/qq_42848805/article/details/128893835?spm=1001..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是读取。

至此,第一个驱动程序就完成啦。

参考视频

/video/BV1zV411U7H9?p=12&share_source=copy_web

参考文献:

01_嵌入式Linux应用开发完全手册V5.1_IMX6ULL_Pro开发板

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。