“100ask imx6ul qemu”的版本间的差异

来自百问网嵌入式Linux wiki
 
(未显示2个用户的63个中间版本)
第1行: 第1行:
 +
<div style="width:500px;height:20px;margin:auto;margin-top:1px">
 +
<span style="font-size:1.3rem;color:#ff0000;margin:auto; "> imx6ul-qemu交流群 QQ群号:542662930</span>
 +
</div>
 +
 +
大家对qemu有任何好的建议或者问题欢迎在Github上提交 issuse  https://github.com/100askTeam/qemu/issues
 +
=百问网QEMU路线图=
 +
 +
[[File:100ask_imx6ul_qemu_002.png|thumb|right|frameless|500px|百问网100ask qemu]]
 +
[[File:100ask_imx6ul_qemu_003.png|thumb|right|frameless|500px|野火imx6ul pro板]]
 +
[[File:100ask_imx6ul_qemu_004.png|thumb|right|frameless|500px|正点原子 imx6ul alpha板]]
 +
{{Redtext|'''增加设备管理器'''}}
 +
*我们的目的是给每个外设添加GUI显示,<br>
 +
*估计有{{Redtext|'''近百个外设'''}},<br>
 +
*怎么管理这近百个GUI?<br>
 +
*使用一个<code>设备管理器</code>,<br>
 +
*在里面可以打开、关闭某个设备的GUI。<br>
 +
*完成时间:2019.11.10之前<br>
 +
{{Redtext|'''公开源码'''}}
 +
*完成<code>设备管理器</code>的功能后,<br>
 +
*我们改造的QEMU源码将全部公开
 +
*公开时间:2019.11.10<br>
 +
 +
{{Redtext|'''编写文档'''}}<br>
 +
:编写这几个文档: <br>
 +
#QEMU架构
 +
#QEMU中如何模拟设备
 +
#QEMU中的GUI操作
 +
#QEMU如何处理鼠标键盘事件
 +
#如何编写IMX6ULL裸机程序操作模拟的硬件
 +
#如何编写IMX6ULL Linux驱动程序操作模拟的硬件
 +
 +
:这几个文档可以让你深入理解QEMU,掌握模拟外设的原理<br>
 +
:如果你编程能力可以,那就能模拟出一些简单设备:单线的传感器、I2C/SPI设备、定时器、LCD、触摸屏等<br>
 +
 +
{{Redtext|'''发布有偿项目'''}}<br>
 +
*对于每个外设,都会涉及两方面: QEMU中对它的模拟,你写的裸机/驱动/app对它的操作。<br>
 +
*我们会发布{{Redtext|'''近百个'''}}外设的项目, 比如有红外传感器、ADC、DAC等等<br>
 +
*你可以选择你擅长的,完成某个即可获得酬劳<br>
 +
*你可以找人合作,比如你擅长写裸机,别人擅长写QEMU的GUI,你们一起合作就可以实现对某个外设的模拟。<br>
 +
 
=qemu简介=
 
=qemu简介=
QEMU(Quick EMUlator的缩写)是一个免费开源模拟器。<br>
+
QEMU的英文单词是:Quick Emulator,它是一个精巧的模拟器。<br>
可以模拟x86,也可以模拟各种ARM板子<br>
+
还有很多模拟器,比如VMWare、Virtual Box等。但是VMWare、Virtual Box只能模拟x86、AMD64/Intel64等PC系统;<br>
 +
而QEMU可以模拟更多硬件:ARM、MIPS、PPC、x86、AMD64/Intel64。<br>
 +
QEMU用途广泛,比如Xen、Android模拟器等都是基于QEMU的。<br>
 +
在嵌入式领域,很多人使用QEMU来深研Linux,比如研究文件系统、优化等等。<br>
 +
QEMU有两种模式:<br>
 +
<br>
 +
==用户模式(User Mode)==
 +
简单地说,一个使用arm-xxx-gcc编译出来的程序,是给ARM板子使用的,它无法在PC机上运行,只能放到ARM板子上去运行。<br>
 +
但是使用qemu,可以在PC机上运行这个程序。比如:<br>
 +
<syntaxhighlight lang="bash">
 +
$ gcc -o hello hello.c -static
 +
$ ./hello    // 这个hello程序是使用gcc给PC机编译的,可以直接运行
 +
Hello, world!
 +
$ arm-linux-gnueabihf-gcc -o hello hello.c -static  // 它是给ARM板子编译的
 +
$ ./hello                                      // 所以无法在PC上运行
 +
bash: ./hello: cannot execute binary file: Exec format error
 +
$ ./qemu-arm ./hello                          // 我们可以用QEMU在PC上运行它
 +
Hello, world!
 +
</syntaxhighlight>
 +
==系统模式(System Mode)==
 +
很多时候我们并不满足于在PC上运行单个ARM程序,我们想模拟出整个ARM单板:<br>
 +
在这个模拟出来的虚拟ARM单板上,运行Linux系统,在其中运行各种APP。<br>
 +
这时候需要使用QEMU的系统模式。<br>
 +
我们就是使用QEMU的系统模式来模拟IMX6ULL开发板,具体的使用请看下章。<br>
 +
<br>
 +
 
 +
==我们做的改进==
 +
QEMU可以模拟x86,也可以模拟各种ARM板子,还可以模拟各种外设。<br>
 
百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,支持更方便的调试<br>
 
百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,支持更方便的调试<br>
 
*100ask-qemu特点
 
*100ask-qemu特点
第10行: 第77行:
 
#增加逻辑分析仪显示功能
 
#增加逻辑分析仪显示功能
 
#后续会逐渐增加更多的模拟硬件模块
 
#后续会逐渐增加更多的模拟硬件模块
##温湿度传感器
+
::6.1 温湿度传感器
##红外
+
::6.2 红外
##超声波模块
+
::6.3 超声波模块
##ADC,DAC模块
+
::6.4 ADC,DAC模块
##I2C接口的传感器
+
::6.5 I2C接口的传感器
##SPI接口的OLED
+
::6.6 SPI接口的OLED
##你想加啥,跟我们说
+
::6.7 你想加啥,跟我们说
  
 
=快速使用=
 
=快速使用=
 +
使用apt-get当然也可以安装QEMU,但是它版本太低,也不支持IMX6ULL。<br>
 +
我们修改了QEMU的源码,新版本已经支持IMX6ULL,我们在此基础上添加了更多功能,也修改了一些BUG。<br>
 +
所以,请参考本文安装我们定制的QEMU。<br>
 +
<br>
 
==准备工作==
 
==准备工作==
 
*'''必须'''
 
*'''必须'''
 
**一台可以上网的windows电脑
 
**一台可以上网的windows电脑
 
**一个可以正常使用Ubuntu虚拟机系统
 
**一个可以正常使用Ubuntu虚拟机系统
*'''可选'''
+
*'''可选(注意,如果想要有更快效果,ubuntu下可以安装KVM)'''
**MobaXterm_Portable_v12.0.zip
 
 
**安装kvm加速qemu运行,在终端下执行如下命令
 
**安装kvm加速qemu运行,在终端下执行如下命令
 
  $ sudo apt update
 
  $ sudo apt update
 
  $ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
 
  $ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
 +
 +
  
 
==获取镜像==
 
==获取镜像==
 
{{Redtext|点击如下链接下载<br>}}
 
{{Redtext|点击如下链接下载<br>}}
[[download_ubuntu-18.04_imx6ul_qemu | ubuntu-18.04环境下系统下载页面]]<br>
+
[[download_ubuntu-18.04_imx6ul_qemu | ubuntu-18.04开发环境下qemu imx6ul系统镜像下载页面]]<br>
[[download_ubuntu-16.04_imx6ul_qemu | ubuntu-16.04环境下系统下载页面]]<br>
+
[[download_ubuntu-16.04_imx6ul_qemu | ubuntu-16.04开发环境下qemu imx6ul系统镜像下载页面]]<br>
  
 
下载完成后上传到Ubuntu虚拟机中,执行如下命令进行解压缩操作。<br>
 
下载完成后上传到Ubuntu虚拟机中,执行如下命令进行解压缩操作。<br>
第38行: 第110行:
  
 
  $ tar -xvf weidongshan-ubuntu-16.04_imx6ul_qemu_system-release.tgz  
 
  $ tar -xvf weidongshan-ubuntu-16.04_imx6ul_qemu_system-release.tgz  
让后进入<code>ubuntu-16.04_imx6ul_qemu_system</code>目录执行具体使用
+
然后进入<code>ubuntu-16.04_imx6ul_qemu_system</code>目录执行后文介绍的命令
  
 
<span style=" font-size:1.0rem; ">'''ubuntu-18.04解压操作步骤'''<br></span>
 
<span style=" font-size:1.0rem; ">'''ubuntu-18.04解压操作步骤'''<br></span>
  
 
  $ tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz  
 
  $ tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz  
让后进入<code>ubuntu-18.04_imx6ul_qemu_system</code>目录执行具体使用
+
然后进入<code>ubuntu-18.04_imx6ul_qemu_system</code>目录执行后文介绍的命令
 +
 
 +
 
  
 
==运行qemu系统==
 
==运行qemu系统==
 +
{{Redtext | 运行qemu系统前需先按照上一步下载镜像文件 }}<br>
 
打开终端,在解压后的当前目录下执行如下命令
 
打开终端,在解压后的当前目录下执行如下命令
  
第52行: 第127行:
 
  $ ./install_sdl.sh          // 提示输入用户密码,等待安装完成
 
  $ ./install_sdl.sh          // 提示输入用户密码,等待安装完成
  
 +
 +
 +
'''{{Redtext | 注意qemu系统默认登录用户名为root 无密码 }}<br>'''
 
2.运行带GUI的imx6ul模拟器<br>
 
2.运行带GUI的imx6ul模拟器<br>
 
:2.1 模拟百问网imx6ul-qemu开发板:
 
:2.1 模拟百问网imx6ul-qemu开发板:
  $ ./qemu-imx6ul-gui.sh
+
  $ ./qemu-imx6ul-gui.sh // 启动后,登录名是root,无需密码
  
 
:2.2 模拟野火imx6ul-pro开发板:
 
:2.2 模拟野火imx6ul-pro开发板:
  $ ./qemu-imx6ul-gui.sh fire
+
  $ ./qemu-imx6ul-gui.sh fire   // 启动后,登录名是root,无需密码
  
 
:2.3 模拟正点原子imx6ul-alpha开发板:
 
:2.3 模拟正点原子imx6ul-alpha开发板:
  $ ./qemu-imx6ul-gui.sh atk
+
  $ ./qemu-imx6ul-gui.sh atk   // 启动后,登录名是root,无需密码
  
 
3.运行不带GUI的imx6ul模拟器<br>
 
3.运行不带GUI的imx6ul模拟器<br>
  $ ./qemu-imx6ul-nogui.sh
+
  $ ./qemu-imx6ul-nogui.sh   // 启动后,登录名是root,无需密码
 +
 
 
4.如何退出qemu模拟器<br>
 
4.如何退出qemu模拟器<br>
 
:在终端下按住<code>Ctrl</code>和<code>a</code>键的同时按<code>c</code>即进入 '''qemu monitor'''模式, 再输入 <code>q</code>命令即可退出QEMU
 
:在终端下按住<code>Ctrl</code>和<code>a</code>键的同时按<code>c</code>即进入 '''qemu monitor'''模式, 再输入 <code>q</code>命令即可退出QEMU
第87行: 第166行:
 
:QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2
 
:QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2
 
:QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置
 
:QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置
:Guest可以通过10.0.0.2访问Host,Host不能访问Guest
+
:Guest可以通过10.0.2.2访问Host,Host不能访问Guest
 
:Guest中可以使用ifconfig命令查看IP,如果没有IP,可以如下设置:
 
:Guest中可以使用ifconfig命令查看IP,如果没有IP,可以如下设置:
 
  ifconfig eth0 10.0.2.15
 
  ifconfig eth0 10.0.2.15
第115行: 第194行:
 
=高级玩法=
 
=高级玩法=
 
==获取源码==
 
==获取源码==
 +
{{Redtext| 大家有发现问题或者有好的建议,欢迎在git相关仓库提 '''Issues''' }}
 
{|  class="wikitable" style="text-align: left;  background-color: rgba(255,255,255,0.2)"
 
{|  class="wikitable" style="text-align: left;  background-color: rgba(255,255,255,0.2)"
 
|-
 
|-
! 类别 !! 国内coding仓库 !! 国外github仓库
+
! 类别 !! 国外github仓库  !! 国内Git仓库
 
|-
 
|-
|linux kernel|| https://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.git || https://github.com/100askTeam/qemu_imx6ull_kernel.git
+
|linux kernel ||https://github.com/100askTeam/qemu_imx6ull_kernel.git || https://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.git
 
|-
 
|-
|qemu 源码 || ||
+
|qemu 源码 || https://github.com/100askTeam/qemu.git  || https://gitee.com/weidongshan/qemu.git
 
|-
 
|-
|buildroot || ||
+
|buildroot || ||https://git.dev.tencent.com/weidongshan/imx6ul_buildroot.git
 
|}
 
|}
  
==编译运行源码==
+
git邮箱账号和用户名配置
编译imx6ul qemu内核源码
+
<syntaxhighlight lang="bash">
  make 100ask_imx6ul_qemu_defconfig
+
book@100ask:~$  git config --global user.email "you@example.com"
arch/arm/boot/zImage
+
book@100ask:~$ git config --global user.name "Your Name"
make dtbs
+
</syntaxhighlight>
arch/arm/boot/dts/100ask_imx6ul_qemu.dtb
+
初次使用GIT时,需要配置邮箱帐号和用户名,可以随意指定。
  
==制作文件系统==
+
考虑到代码仓库过多,特使用repo工具管理代码<br>
 +
*repo工具获取sdk
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
$ dd if=/dev/zero of=rootfs.img bs=1M count=300
+
book@100ask:~$ git clone  https://git.dev.tencent.com/codebug8/repo.git
$ mkfs.ext4 rootfs.img 
+
book@100ask:~$  mkdir -p 100ask_imx6ull-qemu  && cd 100ask_imx6ull-qemu
$ mkdir ./tmp
+
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo init -u https://dev.tencent.com/u/weidongshan/p/manifests/git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
$ sudo mount -o loop rootfs.img  ./tmp
+
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j4
 +
</syntaxhighlight>
 +
上面使用的repo管理的是国内coding仓库,从国内仓库下载会快很多。
 +
 
 +
==设置工具链==
 +
交叉编译工具链主要是用于在ubuntu主机上编译可以在其它平台上运行的系统,比如在PC上为ARM板子编译程序。<br>
 +
设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量,下面介绍具体设置方法。
 +
 
 +
* 永久生效
 +
如需永久修改,请修改用户配置文件, Ubuntu系统下,修改如下:
 +
<syntaxhighlight lang="bash">
 +
vim ~/.bashrc
 +
</syntaxhighlight>
 +
在行尾添加或修改:
 +
export ARCH=arm
 +
export CROSS_COMPILE=arm-linux-gnueabihf-
 +
export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
 +
 
 +
* 临时生效
 +
执行完“export”命令后,该设置只对当前终端有效
 +
<syntaxhighlight lang="bash">
 +
book@100ask:~$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
 +
book@100ask:~$ export ARCH=arm
 +
book@100ask:~$ export CROSS_COMPILE=arm-linux-gnueabihf-
 +
</syntaxhighlight>
 +
* 手动指定
 +
Make编译时指定ARCH架构 CROSS_COMPILE交叉编译工具链
 +
<syntaxhighlight lang="bash">
 +
book@100ask:~$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
 +
book@100ask:~$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
 
</syntaxhighlight>
 
</syntaxhighlight>
拷贝源码到挂载的tmp目录下,等待拷贝完成
 
  
执行 sync 同步更新
+
==编译内核及设备树==
 +
*编译百问网imx6ull-qemu开发板内核
 +
<syntaxhighlight lang="bash">
 +
book@100ask:~/100ask_imx6ull-qemu$ cd linux-4.9.88
 +
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make mrproper
 +
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make 100ask_imx6ul_qemu_defconfig
 +
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make zImage -jN //编译zImage 内核镜像,其中N参数可以根据CPU个数,来加速编译系统。
 +
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make dtbs  //编译设备树文件
 +
</syntaxhighlight>
 +
*编译内核模块
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
$ umount ./tmp
+
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
 
</syntaxhighlight>
 
</syntaxhighlight>
  
==kgdb调试内核源码==
+
*安装内核模块到相应的nfs目录,以便后面挂载使用。
===编译内核镜像===
+
<syntaxhighlight lang="bash">
 +
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ sudo make ARCH=arm INSTALL_MOD_PATH=<nfs目录>  modules_install
 +
</syntaxhighlight>
  
等待编译生成的 vmlinux 带符号表的文件,以及zImage 和设备树文件
+
: 将编译成功的'''zImage'''文件和设备树'''100ask_imx6ul_qemu.dtb'''文件拷贝到相应的目录 以便启动使用。
  
===运行qemu===
+
==修改文件系统==
 +
{{Redtext| 注意 文件系统使用我们提供的 rootfs.img  文件即可,如下是修改文件系统方法}}
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
qemu-system-arm -M mcimx6ul-evk    -m 512M -kernel zImage \
+
$ dd if=/dev/zero of=rootfs.img bs=1M count=300
-dtb  -display sdl -serial mon:stdio \
+
$ mkfs.ext4 rootfs.img 
-drive  file=rootfs.img,format=raw,id=mysdcard -device sd-card,drive=mysdcard \
+
$ mkdir ./tmp
-append "console=ttymxc0,115200 rootfstype=ext4 root=/dev/mmcblk1 rw rootwait init=/sbin/init  loglevel=8" \
+
$ sudo mount -o loop rootfs.img ./tmp
-nic user -S -s
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
拷贝源码到挂载的tmp目录下,等待拷贝完成
  
===运行gdb程序调试===
+
执行 sync 同步更新,让后取消挂载,即可使用此文件系统镜像启动。
  
$ arm-linux-gnueabihf-gdb -tui vmlinux
+
<syntaxhighlight lang="bash">
连接到qemu模拟的系统
+
$ umount ./tmp
(gdb) target remote localhost:1234
+
</syntaxhighlight>
  
 
=其它相关=
 
=其它相关=

2019年11月30日 (六) 18:28的最新版本

imx6ul-qemu交流群 QQ群号:542662930

大家对qemu有任何好的建议或者问题欢迎在Github上提交 issuse  https://github.com/100askTeam/qemu/issues

百问网QEMU路线图

百问网100ask qemu
野火imx6ul pro板
正点原子 imx6ul alpha板

增加设备管理器

  • 我们的目的是给每个外设添加GUI显示,
  • 估计有近百个外设
  • 怎么管理这近百个GUI?
  • 使用一个设备管理器
  • 在里面可以打开、关闭某个设备的GUI。
  • 完成时间:2019.11.10之前

公开源码

  • 完成设备管理器的功能后,
  • 我们改造的QEMU源码将全部公开
  • 公开时间:2019.11.10

编写文档

编写这几个文档:
  1. QEMU架构
  2. QEMU中如何模拟设备
  3. QEMU中的GUI操作
  4. QEMU如何处理鼠标键盘事件
  5. 如何编写IMX6ULL裸机程序操作模拟的硬件
  6. 如何编写IMX6ULL Linux驱动程序操作模拟的硬件
这几个文档可以让你深入理解QEMU,掌握模拟外设的原理
如果你编程能力可以,那就能模拟出一些简单设备:单线的传感器、I2C/SPI设备、定时器、LCD、触摸屏等

发布有偿项目

  • 对于每个外设,都会涉及两方面: QEMU中对它的模拟,你写的裸机/驱动/app对它的操作。
  • 我们会发布近百个外设的项目, 比如有红外传感器、ADC、DAC等等
  • 你可以选择你擅长的,完成某个即可获得酬劳
  • 你可以找人合作,比如你擅长写裸机,别人擅长写QEMU的GUI,你们一起合作就可以实现对某个外设的模拟。

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,比如研究文件系统、优化等等。
QEMU有两种模式:

用户模式(User Mode)

简单地说,一个使用arm-xxx-gcc编译出来的程序,是给ARM板子使用的,它无法在PC机上运行,只能放到ARM板子上去运行。
但是使用qemu,可以在PC机上运行这个程序。比如:

$ gcc -o hello hello.c -static
$ ./hello     // 这个hello程序是使用gcc给PC机编译的,可以直接运行
Hello, world!
$ arm-linux-gnueabihf-gcc -o hello hello.c -static  // 它是给ARM板子编译的
$ ./hello                                      // 所以无法在PC上运行
bash: ./hello: cannot execute binary file: Exec format error
$ ./qemu-arm ./hello                          // 我们可以用QEMU在PC上运行它
Hello, world!

系统模式(System Mode)

很多时候我们并不满足于在PC上运行单个ARM程序,我们想模拟出整个ARM单板:
在这个模拟出来的虚拟ARM单板上,运行Linux系统,在其中运行各种APP。
这时候需要使用QEMU的系统模式。
我们就是使用QEMU的系统模式来模拟IMX6ULL开发板,具体的使用请看下章。

我们做的改进

QEMU可以模拟x86,也可以模拟各种ARM板子,还可以模拟各种外设。
百问网对QEMU做了很多改进,支持更多硬件,支持更多GUI现实,支持更方便的调试

  • 100ask-qemu特点
  1. 模拟网卡
  2. 模拟LCD显示功能
  3. 模拟增加led灯
  4. 模拟at24cxx i2c存储芯片,直接可以通过用户态操作看到效果
  5. 增加逻辑分析仪显示功能
  6. 后续会逐渐增加更多的模拟硬件模块
6.1 温湿度传感器
6.2 红外
6.3 超声波模块
6.4 ADC,DAC模块
6.5 I2C接口的传感器
6.6 SPI接口的OLED
6.7 你想加啥,跟我们说

快速使用

使用apt-get当然也可以安装QEMU,但是它版本太低,也不支持IMX6ULL。
我们修改了QEMU的源码,新版本已经支持IMX6ULL,我们在此基础上添加了更多功能,也修改了一些BUG。
所以,请参考本文安装我们定制的QEMU。

准备工作

  • 必须
    • 一台可以上网的windows电脑
    • 一个可以正常使用Ubuntu虚拟机系统
  • 可选(注意,如果想要有更快效果,ubuntu下可以安装KVM)
    • 安装kvm加速qemu运行,在终端下执行如下命令
$ sudo apt update
$ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager


获取镜像

点击如下链接下载
ubuntu-18.04开发环境下qemu imx6ul系统镜像下载页面
ubuntu-16.04开发环境下qemu imx6ul系统镜像下载页面

下载完成后上传到Ubuntu虚拟机中,执行如下命令进行解压缩操作。
ubuntu-16.04解压操作步骤

$ tar -xvf weidongshan-ubuntu-16.04_imx6ul_qemu_system-release.tgz 

然后进入ubuntu-16.04_imx6ul_qemu_system目录执行后文介绍的命令

ubuntu-18.04解压操作步骤

$ tar -xvf weidongshan-ubuntu-18.04_imx6ul_qemu_system-release.tgz 

然后进入ubuntu-18.04_imx6ul_qemu_system目录执行后文介绍的命令


运行qemu系统

运行qemu系统前需先按照上一步下载镜像文件
打开终端,在解压后的当前目录下执行如下命令

1.首次运行需要安装SDL环境以及解压文件系统镜像:

使用脚本自动解压安装
$ ./install_sdl.sh           // 提示输入用户密码,等待安装完成


注意qemu系统默认登录用户名为root 无密码
2.运行带GUI的imx6ul模拟器

2.1 模拟百问网imx6ul-qemu开发板:
$ ./qemu-imx6ul-gui.sh  // 启动后,登录名是root,无需密码
2.2 模拟野火imx6ul-pro开发板:
$ ./qemu-imx6ul-gui.sh fire    // 启动后,登录名是root,无需密码
2.3 模拟正点原子imx6ul-alpha开发板:
$ ./qemu-imx6ul-gui.sh atk    // 启动后,登录名是root,无需密码

3.运行不带GUI的imx6ul模拟器

$ ./qemu-imx6ul-nogui.sh   // 启动后,登录名是root,无需密码

4.如何退出qemu模拟器

在终端下按住Ctrla键的同时按c即进入 qemu monitor模式, 再输入 q命令即可退出QEMU

5.如何退出qemu的GUI窗口

Ctrl + Alt + G


参数讲解

-M mcimx6ul-evk 指定需要模拟的单板型号。
-m 512M 指定模拟使用的内存大小。
-kernel zImage指定使用的内核镜像文件。
-dtb 指定使用的设备树文件。
-display sdl指定使用那种显示输出。
-serial mon:stdio指定串口信息输出。
-drive file=rootfs.img,format=raw,id=mysdcard -device sd-card,drive=mysdcard \
-append "console=ttymxc0,115200 rootfstype=ext4 root=/dev/mmcblk1 rw rootwait init=/sbin/init loglevel=8" \
-nic user指定使用NAT共享主机网络方式上网。

操作示例

获取IP地址

QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2
QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置
Guest可以通过10.0.2.2访问Host,Host不能访问Guest
Guest中可以使用ifconfig命令查看IP,如果没有IP,可以如下设置:
ifconfig eth0 10.0.2.15

挂载主机nfs目录

QEMU模拟的imx6ull开发板,可以去访问10.0.2.2,比如使用NFS挂载:
mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt

测试lcd显示

  • 画同心圆
myfb-test  /dev/fb0
  • 测试LCD
fb-test 
  • 显示文字
show_font 

编写并测试led驱动

  • 安装编译好的led模块驱动
insmod 100ask_led.ko
  • 打开并关闭led显示
ledtest  /dev/100ask_led0  on
ledtest  /dev/100ask_led0  off

测试i2c驱动

不需要写I2C驱动,可以通过用户态使用内核里自带的I2C接口访问外设:
假设I2C存储芯片AT24C02接在IMX6UL的I2C0总线上,AT24C02的地址是0x50,
可以执行下面的命令写AT24C02的0地址,读其0地址:
i2c_usr_test   /dev/i2c-0  0x50  w 0  0x12
i2c_usr_test   /dev/i2c-0  0x50  r 0

高级玩法

获取源码

大家有发现问题或者有好的建议,欢迎在git相关仓库提 Issues

类别 国外github仓库 国内Git仓库
linux kernel https://github.com/100askTeam/qemu_imx6ull_kernel.git https://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.git
qemu 源码 https://github.com/100askTeam/qemu.git https://gitee.com/weidongshan/qemu.git
buildroot https://git.dev.tencent.com/weidongshan/imx6ul_buildroot.git

git邮箱账号和用户名配置

book@100ask:~$  git config --global user.email "you@example.com"
book@100ask:~$  git config --global user.name "Your Name"

初次使用GIT时,需要配置邮箱帐号和用户名,可以随意指定。

考虑到代码仓库过多,特使用repo工具管理代码

  • repo工具获取sdk
book@100ask:~$  git clone  https://git.dev.tencent.com/codebug8/repo.git
book@100ask:~$  mkdir -p 100ask_imx6ull-qemu  && cd 100ask_imx6ull-qemu
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo init -u https://dev.tencent.com/u/weidongshan/p/manifests/git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
book@100ask:~/100ask_imx6ull-qemu$ ../repo/repo sync -j4

上面使用的repo管理的是国内coding仓库,从国内仓库下载会快很多。

设置工具链

交叉编译工具链主要是用于在ubuntu主机上编译可以在其它平台上运行的系统,比如在PC上为ARM板子编译程序。
设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量,下面介绍具体设置方法。

  • 永久生效

如需永久修改,请修改用户配置文件, Ubuntu系统下,修改如下:

 vim ~/.bashrc

在行尾添加或修改:

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
  • 临时生效

执行完“export”命令后,该设置只对当前终端有效

book@100ask:~$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
book@100ask:~$ export ARCH=arm
book@100ask:~$ export CROSS_COMPILE=arm-linux-gnueabihf-
  • 手动指定

Make编译时指定ARCH架构 CROSS_COMPILE交叉编译工具链

book@100ask:~$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
book@100ask:~$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

编译内核及设备树

  • 编译百问网imx6ull-qemu开发板内核
book@100ask:~/100ask_imx6ull-qemu$ cd linux-4.9.88
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make mrproper
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make 100ask_imx6ul_qemu_defconfig
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make zImage -jN //编译zImage 内核镜像,其中N参数可以根据CPU个数,来加速编译系统。 
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make dtbs   //编译设备树文件
  • 编译内核模块
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
  • 安装内核模块到相应的nfs目录,以便后面挂载使用。
book@100ask:~/100ask_imx6ull-qemu/linux-4.9.88$ sudo make ARCH=arm INSTALL_MOD_PATH=<nfs目录>  modules_install
将编译成功的zImage文件和设备树100ask_imx6ul_qemu.dtb文件拷贝到相应的目录 以便启动使用。

修改文件系统

注意 文件系统使用我们提供的 rootfs.img 文件即可,如下是修改文件系统方法

$ dd if=/dev/zero of=rootfs.img bs=1M count=300
$ mkfs.ext4 rootfs.img   
$ mkdir ./tmp
$ sudo mount -o loop rootfs.img  ./tmp

拷贝源码到挂载的tmp目录下,等待拷贝完成

执行 sync 同步更新,让后取消挂载,即可使用此文件系统镜像启动。

$ umount ./tmp

其它相关

QQ交流群
100ask imx6ul qemu board.png
imx6ul-qemu交流群

QQ群号:542662930

Roc-rk3399-pc wiki HomeLocation.png
roc-rk3399-pc开发板交流群

QQ群号893369799

Firefly-rk3288 wiki HomeLocation.png
firefly rk3288开发板讨论群

QQ群号664397968

100ask-am335x wiki HomeLocation.png
100ask am335x开发板交流群

QQ群号904101325

Fire-imx6ull pro HomeLocation.png
野火imx6ull-pro开发板交流群

QQ群号:738136869