编译linux开发板的第 1 个驱动实验

本文讲述了在编译驱动程序前必须先编译内核的原因,包括内核文件的引用、内核版本的一致性以及设备树文件的编译。详细介绍了Linux内核的编译步骤,涉及配置、编译zImage、设备树文件,以及内核模块的编译和安装流程。
摘要由CSDN通过智能技术生成

为什么编译驱动程序之前要先编译内核?
⚫ 驱动程序要用到内核文件:
比如驱动程序中这样包含头文件:#include <asm/io.h>,其中的 asm 是
一个链接文件,指向 asm-arm 或 asm-mips,这需要先配置、编译内核才会生成asm 这个链接文件。
⚫ 编译驱动时用的内核、开发板上运行到内核,要一致:
开发板上运行到内核是出厂时烧录的,你编译驱动时用的内核是你自己编译的,这两个内核不一致时会导致一些问题。所以我们编译驱动程序前,要把自己编译出来到内核放到板子上去,替代原来的内核。
⚫ 更换板子上的内核后,板子上的其他驱动也要更换:
板子使用新编译出来的内核时,板子上原来的其他驱动也要更换为新编译出来的。所以在编译我们自己的第 1 个驱动程序之前,要先编译内核、模块,并且放到板子上去。

编译内核

不 同 的 开 发 板 对 应 不 同 的 配 置 文 件 , 配 置 文 件 位 于 内 核 源 码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

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

编译内核模块

内核模块:内核模块是一种动态链接的机制,它可以在运行时加载到内核,从而扩展内核的功能。内核模块可以是设备驱动程序、系统调用函数、文件系统等,它能够通过内核提供的机制来进行操作系统的扩展与改进。
内核模块的编译过程相对于内核的编译而言,要简单得多。内核模块的编译是将一个独立的源文件编译成一个动态链接库文件(.ko文件)的过程。一般情况下,Linux内核源码集成了一个叫做Makefile的工具,可以实现内核模块的编译。
进入内核源码目录后,就可以编译内核模块了:

book@100ask: cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make modules

内核模块编译完成后如图 5.4 所示:
在这里插入图片描述
安装内核模块到 Ubuntu 某个目录下备用可以先把内核模块安装到 nfs 目录(/home/book/nfs_rootfs)。
注意:后面会使用 tree 命令查看目录结构,如果提示没有该命令,需要执行以下命令安装 tree 命令:

sudo apt install tree

执行以下命令安装模块:

book@100ask:~$ cd ~/100ask_imx6ull-sdk/Linux-4.9.88/
book@100ask:~/100ask_imx6ull-sdk/Linux-4.9.88$ make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs modules_install

如图 5.5,把模块安装在 nfs 目录“/home/book/nfs_rootfs/”下:
在这里插入图片描述
安装好驱动后的/home/book/nfs_rootfs/目录结构如图 5.6 所示:
在这里插入图片描述

安装内核和模块到开发板上(重要)

假设:在 Ubuntu 的/home/book/nfs_rootfs 目录下,已经有了 zImage、dtb 文件,并且有 lib/modules 子目录(里面含有各种内核模块,也就是ko驱动文件)。
接下来要把这些文件复制到开发板上。假设 Ubuntu IP 为192.168.5.11,在开发板上执行以下命令:

mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cp /mnt/zImage /boot
cp /mnt/100ask_imx6ull-14x14.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync

最后重启开发板,它就使用新的 zImage、dtb、模块了。

编译 led 驱动

led 驱动
首 先 , 进 入 驱动文件的目 录 , 修 改 Makefile 文 件“KERN_DIR”为自己的内核所在路径。如图 5.7 红框所示,如果你的内核源码不在此目录则根据你的实际情况进行修改:
在这里插入图片描述
注意:有些并不按照前面的文档编译内核,而是使用 Buildroot 来编译内核,那么 led 驱动程序的 Makefile 中要指定 KERN_DIR 为如下目录:

KERN_DIR = /home/book/100ask_imx6ull-sdk/Buildroot_2020.02.x/output/build/linux-origin_master

修改完内核所在目录后,就可以编译 led 模块驱动了,如图 5.8 红框 1 所示,执行“make all”命令就可以编译,编译完成后会生成 100ask_led.ko ,ledtest 两个文件。
在这里插入图片描述
此时,把这两个文件拷贝到 Ubuntu nfs 目录下备用:

cp 100ask_led.ko ledtest ~/nfs_rootfs

在开发板安装驱动模块

下载驱动程序

开发板启动后通过 nfs 挂载 Ubuntu 目录的方式,将相应的文件拷贝到开发板内。如果你使用的是 VMware 桥接方式,假设 Ubuntu IP 为192.168.5.11,在开发板上执行以下命令:

[root@100ask:~]# mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
[root@100ask:~]# cp /mnt/100ask_led.ko ./
[root@100ask:~]# cp /mnt/ledtest ./

关闭系统默认 cpu 状态灯

可能开发板上的 led 灯已被设置为 CPU 状态灯(可以看到绿色 LED 在闪),我们需要将其关闭,才可以使用我们的驱动对其进行操作,关闭方法如下所示:

[root@100ask:~]# echo none > /sys/class/leds/cpu/trigger

我们后面出厂的开发板,已经把 CPU 状态灯禁止了,所以上述命令可能出错:这没影响。

安装驱动模块

在开发板串口终端上执行如下命令,即可安装相应的驱动模块。

[root@100ask:~]# insmod 100ask_led.ko

安装完成后可以执行 lsmod 命令来查看是否安装成功,如图 5.9 所示:
在这里插入图片描述如果你没有更新板子上的内核,会出现类似如图 5.10 所示错误:
在这里插入图片描述可以强行安装驱动程序,比如使用“insmod -f hello_drv.ko”这样的命令,它会提示说“内核已经被污染了”,但是不影响学习、不影响使用,如图 5.11 所示:
在这里插入图片描述

执行测试程序

驱动模块安装成功后,就可以使用测试程序来控制 led 灯的状态,如图 5.12所示,操作 led 灯时可同时观察开发板串口旁的灯是否有亮灭的变化。

[root@100ask:~]# chmod +x ./ledtest
[root@100ask:~]# ./ledtest
Usage: ./ledtest <dev> <on | off>
[root@100ask:~]# ./ledtest /dev/100ask_led0 on //打开 led0 灯
[root@100ask:~]# ./ledtest /dev/100ask_led0 off //关闭 led0 灯

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在进行Linux开发板USB驱动演示,我们首先需要确保开发板的硬件和软件环境已经配置完毕。 硬件方面,我们需要连接一个USB设备到开发板的USB接口。这个USB设备可以是一个USB存储设备,例如U盘或移动硬盘,也可以是其他USB设备,例如USB摄像头或USB音频设备。 软件方面,我们需要确保开发板上已经安装了Linux操作系统,并且已经配置好USB主机控制器和USB驱动。一般来说,Linux内核已经默认集成了常见USB设备的驱动程序,因此我们只需要确认这些驱动程序已经正确加载。 接下来,我们可以进行USB驱动的演示。 首先,在开发板上打开一个终端窗口,使用dmesg命令查看系统的内核日志,确认USB设备已经被识别并分配了对应的设备节点。 然后,使用lsusb命令查看已连接的USB设备的信息,例如设备的厂商ID和产品ID。这将有助于我们在驱动程序中确定对应的USB设备。 接下来,我们可以使用udev规则来配置和实例化设备节点。我们可以在udev规则中指定使用哪个驱动程序来处理特定的USB设备。这样,当USB设备被插入开发板,系统将自动加载对应的驱动程序并创建设备节点。 然后,我们可以编写一个简单的应用程序来测试USB驱动。这个应用程序可以通过读取或写入USB设备的数据来验证驱动程序的功能。我们可以使用系统的文件I/O接口(如read和write函数)来与USB设备进行数据交换。 最后,我们可以在终端窗口中运行这个应用程序,观察它与USB设备之间的通信是否正常。如果一切顺利,我们应该能够成功读取或写入USB设备的数据。 通过以上步骤,我们可以进行Linux开发板USB驱动的演示。这将帮助我们更好地理解和学习USB驱动开发和调试过程。 ### 回答2: Linux开发板上的USB驱动演示是指在Linux系统上进行USB设备开发的示范。USB驱动是操作系统与USB设备之间的通信桥梁,它负责管理和控制USB设备的连接、数据传输和电源管理等功能。 在这个演示中,我们将使用一块Linux开发板和一款支持USB接口的设备。首先,我们需要安装合适的Linux发行版,以及开发板需要驱动和工具链等。 接下来,我们会创建一个简单的USB设备驱动程序,它将负责识别和管理连接到Linux开发板的USB设备。我们会编写相应的代码,包括设备识别、配置和通信等功能,并将其编译内核模块。 然后,我们会将该USB设备驱动程序加载到Linux内核中,并对USB设备进行测试。我们可以通过命令行工具或者编写测试程序的方式,来验证USB设备在Linux系统上的正常工作。 演示中,我们还可以尝试不同的USB设备,比如USB鼠标、键盘、摄像头等,并编写相应的驱动程序来支持这些设备的功能。 通过这个演示,我们可以了解到USB设备驱动Linux系统中的工作原理和开发流程。同也可以了解到设备与系统之间的通信过程,以及如何利用Linux提供的API进行设备管理和数据传输。 总的来说,Linux开发板USB驱动演示是一个很好的学习和实践USB设备开发的机会,通过动手实践,可以更好地理解和掌握相关知识和技能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值