Linux驱动-IMX6ULL开发板qemu环境搭建

张开发
2026/4/21 3:01:24 15 分钟阅读

分享文章

Linux驱动-IMX6ULL开发板qemu环境搭建
Linux驱动-IMX6ULL开发板qemu环境搭建俗话说“**工欲善其事必先利其器**”本篇文章不介绍Linux驱动的知识但是想学习Linux内核和驱动就需要查看和运行内核源码这时你就需要**买一个ARM开发板**市场上资料比较全的开发板有**正点原子**、**野火**、**百问网**的下面以正点原子的为例说一下首先打开http://www.openedv.com/docs/boards/arm-linux/zdyz-i.mx6ull.html#这里首先是**视频**大家都知道看视频学习的比较快其次是学习的**PDF书籍**《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.6》。不得不说正点原子的左盟主在Linux驱动方面的技术的确有一手内容很好非常高效的帮助你学习Linux并且视频和书等学习资料都是免费送给大家不要钱就可以获取到。但是有点小缺陷只看书不行啊得有板子运行下才能实践出真知不然你看书上的东西你自己都不信并且也记不住。软件编程是**实践**的学科。下面就买开发板**买买买**剧情反转写到这里你或许以为我是**做广告**卖开发板来了。大错特错相反我是来**拆台的**小一千买个开发板没那必要就是要**断人财路**方便大家。百闻网的**韦东山**也是一号人物也卖开发板但是这人不简单有格局察觉到**虚拟化**不可避免开发板的生意快到头了利用**qemu**技术搞了一个**模拟IMX6ULL开发板**的环境并且免费开放参考https://www.bilibili.com/video/BV1pU4y1h7pn?spm_id_from333.999.0.0用qemu运行linux有两个好处1、省钱不用买开发板要深入研究还是需要一个开发板。2、调试速度快修改代码编译打断点gdb运行一气呵成随时都可以快速使用。1. 虚拟机环境搭建百闻网资料网盘直接提供了Ubuntu18.04的Vmware虚拟机安装包直接加载就可以运行。1.1 下载资料打开http://download.100ask.net/找到QEMU下载百度网盘的资料找到虚拟机文件1.2 虚拟机配置在win10设备管理器里面查看是否开启了虚拟化如果没开启需要设置BIOS开启。使用vitualbox打开ubuntu18.04book的密码是123456可以自己设置一个root账号安装vituralbox的增强功能设置剪切板和共享文件夹。自动开发环境配置执行如下命令wget --no-check-certificate -O Configuring_ubuntu.sh https://weidongshan.coding.net/p/DevelopmentEnvConf/d/DevelopmentEnvConf/git/raw/master/Configuring_ubuntu.sh sudo chmod x Configuring_ubuntu.sh sudo ./Configuring_ubuntu.sh配置成功如下2. QEMU基础参考资料:QEMU user manual: https://qemu.weilnetz.de/doc/QEMUhttps://wiki.archlinux.org/index.php/QEMU2.1 qemu简介QEMU的英文单词是Quick Emulator它是一个小巧的模拟器。还有很多模拟器比如VMWare、Virtual Box等。但是VMWare、Virtual Box只能模拟x86、AMD64/Intel64等PC系统而QEMU可以模拟更多硬件ARM、MIPS、PPC、x86、AMD64/Intel64。 QEMU用途广泛比如Xen、Android模拟器等都是基于QEMU的。在嵌入式领域很多人使用QEMU来深研Linux比如研究文件系统、优化等等。用户模式在PC上使用qemu运行单个ARM程序时这就是使用QEMU的用户模式。系统模式:我们想模拟出整个ARM单板在这个模拟出来的虚拟ARM单板上运行Linux系统在其中运行各种APP。这时候需要使用QEMU的系统模式。2.2 qemu安装官方的qemu需要修改下百问网自己修改了一个使用如下命令下载git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git下载后如下首次运行需要安装SDL环境$ ./install_sdl.sh // 提示输入用户密码等待安装完成执行过程中遇到各种报错最后放弃了。手动自己安装SDL参考如下自己安装SDLlinux安装 SDL环境_helloworld128的博客-CSDN博客_linux安装sdl库2.3 运行带GUI的imx6ul模拟器①模拟百问网imx6ul-qemu开发板$ ./qemu-imx6ull-gui.sh // 启动后登录名是root无需密码或$ ./qemu-imx6ull-gui_test.sh // 使用测试版的QEMU启动后登录名是root无需密码②模拟野火imx6ul-pro开发板$ ./qemu-imx6ull-gui.sh fire // 启动后登录名是root无需密码③模拟正点原子imx6ul-alpha开发板$ ./qemu-imx6ull-gui.sh atk // 启动后登录名是root无需密码① 运行不带GUI的imx6ul模拟器$ ./qemu-imx6ull-nogui.sh // 启动后登录名是root无需密码学习对应的开发板资料如下i.MX6ULL Linux阿尔法开发板 - 正点原子资料下载中心 1.0.0 文档野火i.MX6ULL Linux开发板 ‒ 野火产品资料下载中心文档100ASK_QEMU ‒ 百问网资料下载中心 3.0 文档脚本文件qemu-imx6ull-gui.sh中qemu参数-M mcimx6ul-evk 指定需要模拟的单板型号。-m 512M 指定板子的内存大小。-kernel zImage 指定使用的内核镜像文件。-dtb 100ask_imx6ull_qemu.dtb 指定使用的设备树文件。-display sdl 指定使用那种图形显示输出。-serial mon:stdio 指定串口信息输出。-drive filerootfs.img,formatraw,idmysdcard 名为mysdcard的drive,源为rootfs.img-device sd-card,drivemysdcard 添加一个sd-card设备,内容来自名为mysdcard的drive-append consolettymxc0,115200 rootfstypeext4 root/dev/mmcblk1 rw rootwait init/sbin/init loglevel8 指定内核的命令行参数-nic user 指定网卡为user mode#有了内核zImage、设备树、文件系统(rootfs.img)这就是一个完整的Linux系统。#注意QEMU中没有实现bootloader以后我们会完全模拟SD卡在SD卡上面放置u-boot、内核、设#备树、文件系统。退出QEMU可以同时按住ctrla松开后再输入’x’。点击QEMU的GUI窗口后无法移出鼠标可以同时按住ctrla松开后再输入’g’。操作LCD$ ./qemu-imx6ull-gui_test.sh // 启动后登录名是root无需密码qemu-imx6ul-gui_test.sh会使用zImage_test这个内核里含有触摸屏驱动。[rootqemu_imx6ul:~]# fb-test或[rootqemu_imx6ul:~]# myfb-test /dev/fb0操作触摸屏NFS操作网络文件系统NFS是一种分布式文件系统协议可让您通过网络共享远程目录。使用NFS您可以在系统上挂载远程目录并像对待本地文件一样使用远程文件。在Linux和UNIX操作系统上可以使用mount命令将共享的NFS目录挂载在本地目录树中的指定挂载点上。在虚拟机配置的时候Configuring_ubuntu.sh里面有如下命令安装NFS服务sudo apt-get install nfs-kernel-server然后还得修改/etc/exports添加类似以下的内容下面的例子里允许开发板通过NFS访问Ubuntu的/home/book、/work两个目录/home/book *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)/work *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)最后重启NFS服务在Ubuntu上执行以下命令sudo /etc/init.d/nfs-kernel-server restart启动QEMU后它的文件系统中并没有触摸屏的操作程序tslib需要挂载NFS、复制tslib到根文件系统后才能测试。假设在Ubuntu的/home/book/nfs_rootfs目录下有rootfs_test。在开发板上执行以下命令mount -t nfs -o nolock,vers3 10.0.2.2:/home/book/nfs_rootfs /mntcp /mnt/* -rfd /QEMU给Ubuntu分配的IP是10.0.2.2ubuntu是Host即宿主机。mx6ull板子是Guest即客户机它会自动获取IP这里为10.0.2.15Guest可以通过10.0.2.2访问HostHost不能访问Guest。使用触摸屏要先校准再测试。可以执行以下命令测试[rootqemu_imx6ul:~]# ts_calibrate // 校准[rootqemu_imx6ul:~]# ts_test // 测试操作LED执行下面操作命令[rootqemu_imx6ul:~]# cd led_driver_qemu/[rootqemu_imx6ul:~/led_driver_qemu]# insmod 100ask_led.ko[rootqemu_imx6ul:~/led_driver_qemu]# ./ledtest /dev/100ask_led0 off[rootqemu_imx6ul:~/led_driver_qemu]# ./ledtest /dev/100ask_led0使用按键来控制LED[rootqemu_imx6ul:~]# cd led_driver_qemu/[rootqemu_imx6ul:~/led_driver_qemu]# insmod 100ask_led.ko[rootqemu_imx6ul:~/led_driver_qemu]# cd ../button_driver_qemu/[rootqemu_imx6ul:~/button_driver_qemu]# insmod button_drv.ko[rootqemu_imx6ul:~/button_driver_qemu]# insmod board_100ask_qemu_imx6u[rootqemu_imx6ul:~/button_driver_qemu]# ./button_led_test读写I2C EEPROM AT24C02已经实现了对I2C设备AT24C02的模拟AT24C02芯片工作原理 - OFweek电子工程网首先在“QEMU 设备管理器”中打开at24c02的界面然后执行以下命令测试// 0x50是AT24C02的I2C设备地址[rootqemu_imx6ul:~]# i2c_usr_test /dev/i2c-0 0x50 r 0 // 读地址0data: , 0, 0x00[rootqemu_imx6ul:~]# i2c_usr_test /dev/i2c-0 0x50 w 1 0x58 // 写地址1写入0x58绿色表示读红色表示写操作3. QEMU进行嵌入式Linux开发完整的嵌入式Linux系统包含bootloader、Linux内核、设备树、根文件系统。QEMU可以略过bootloader而直接启动内核这给开发带来了便利。3.1 代码下载类别国外国内linux kernelhttps://github.com/100askTeam/qemu_imx6ull_kernel.githttps://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.gitqemu 源码https://github.com/100askTeam/qemu.githttps://gitee.com/weidongshan/qemu.gitbuildroothttps://git.dev.tencent.com/weidongshan/imx6ul_buildroot.git这里下载国内服务器上放的所有的代码//安装reposudo apt-get install repobook100ask:~$ mkdir -p 100ask_imx6ull-qemu cd 100ask_imx6ull-qemubook100ask:~/100ask_imx6ull-qemu$ repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verifybook100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j43.2 内核及设备树编译在~/.bashrc中添加环境变量export ARCHarmexport CROSS_COMPILEarm-linux-gnueabihf-export PATH$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin100ask_imx6ull-qemu是代码下载的路径如不一致需要修改执行source .bashrc生效编译内核及设备树执行如下命令book100ask:~/100ask_imx6ull-qemu$ cd linux-4.9.88book100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make mrproperbook100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make 100ask_imx6ull_qemu_defconfigbook100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make zImage -j4book100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make dtbs //编译设备树文件编译成功后可以得到如下文件arch/arm/boot/zImage // 内核arch/arm/boot/dts/100ask_imx6ul_qemu.dtb // 设备树可以替换下载的ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image文件夹下的文件之后运行就可以生效了。3.3 文件系统修改文件系统的位置在ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image/rootfs.imgUbuntu下直接修改rootfs.imgsudo mount -o loop rootfs.img /mnt然后就可以在/mnt下面修改文件系统的内容了。注意修改完毕后要执行以下命令sudo umount /mnt3.4 其他开发qemu上的设备硬件程序修改qemu代码让qemu支持某个硬件参考百闻网资料。4. linux内核使用qemu调试4.1 gdb命令调试1. 修改运行qemu的脚本加上 -s -S会使嵌入式ARM Linux系统运行后等待GDB远程连入。2. 然后在代码根目录使用编译器对应的gdb进行调试命令为arm-linux-gnueabihf-gdb ./vmlinux然后设置断点打印值例如4.2 vscode调试1. 修改运行qemu的脚本加上 -s -S会使嵌入式ARM Linux系统运行后等待GDB远程连入。2. 用vscode打开linux根目录就是有vmlinux文件的目录新建launch.json文件内容为{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid830387version: 0.2.0,configurations: [{name: kernel debug,type: cppdbg,request: launch,program: ${workspaceFolder}/vmlinux,cwd: ${workspaceFolder},MIMode: gdb,miDebuggerPath:arm-linux-gnueabihf-gdb,miDebuggerServerAddress: :1234}]}1. program调试的符号文件2. miDebuggerPathgdb工具3. miDebuggerServerAddressip和端口参数然后在代码里面打断点然后按F5 启动调试就可以了VS中的调试图标按钮1运行/继续 F5真正的一步一步运行按钮2单步跳过(又叫逐过程)F10按语句单步执行。当有函数时不会进入函数。按钮3单步调试又叫逐语句F11当有函数时点击这个按钮会进入这个函数内。按钮4单步跳出⇧F11:如果有循环点击该按钮会执行到循环外面的语句。按钮5重启⇧⌘F5按钮5停止⇧F54.3 printk调试printk这种方法很原始但是一般可以解决工程中95%以上的问题。因此具体何时打印以及打印什么东西需要工程师逐步建立敏锐的嗅觉。加深对内核的认知深入理解自己正在调试的模块这才是快速解决问题的“王道”。工具只是一个辅助手段无法代替工程师的思维。后记Linux设备驱动知识很多封面这个**马**的图片是一个书的封面是驱动必看书可以自己在网上找一个pdf书学习下作为入门。配上韦东山的**qemu环境**和**左盟主**的驱动讲解基本差不多了。 Talk is cheapshow me the code后续会继续更新纯干货分析无广告不打赏欢迎分享给好友“那路谈OS与SoC嵌入式软件”欢迎关注个人文章汇总https://thatway1989.github.io

更多文章