100ask imx6ul qemu

来自百问网嵌入式Linux wiki
Wiki讨论 | 贡献2019年11月4日 (一) 09:06的版本

imx6ul-qemu交流群 QQ群号:542662930

qemu简介

QEMU(Quick EMUlator的缩写)是一个免费开源模拟器。

可以模拟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 你想加啥,跟我们说

100ask imx6ul qemu 002.png 100ask imx6ul qemu 003.png 100ask imx6ul qemu 004.png

快速使用

准备工作

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


获取镜像

点击如下链接下载
ubuntu-18.04环境下系统下载页面
ubuntu-16.04环境下系统下载页面

下载完成后上传到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系统

打开终端,在解压后的当前目录下执行如下命令

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

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

2.运行带GUI的imx6ul模拟器

2.1 模拟百问网imx6ul-qemu开发板:
$ ./qemu-imx6ul-gui.sh
2.2 模拟野火imx6ul-pro开发板:
$ ./qemu-imx6ul-gui.sh fire
2.3 模拟正点原子imx6ul-alpha开发板:
$ ./qemu-imx6ul-gui.sh atk

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

$ ./qemu-imx6ul-nogui.sh

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.0.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

高级玩法

获取源码

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

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

编译运行源码

编译imx6ul qemu内核源码

make 100ask_imx6ul_qemu_defconfig
arch/arm/boot/zImage
make dtbs
arch/arm/boot/dts/100ask_imx6ul_qemu.dtb

制作文件系统

$ 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

kgdb调试内核源码

编译内核镜像

等待编译生成的 vmlinux 带符号表的文件,以及zImage 和设备树文件

运行qemu

qemu-system-arm -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 -S -s

运行gdb程序调试

$ arm-linux-gnueabihf-gdb -tui vmlinux

连接到qemu模拟的系统

(gdb) target remote localhost:1234

其它相关

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