100ask imx6ul qemu

来自百问网嵌入式Linux wiki
Weidongshan讨论 | 贡献2019年11月5日 (二) 08:51的版本

imx6ul-qemu交流群 QQ群号:542662930

百问网qemu路线图

  • 增加设备管理器

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

  • 公开源码

完成“设备管理器”的功能后,
我们改造的QEMU源码将全部公开

  • 编写文档

编写这几个文档:
1. QEMU架构 2. QEMU中的设备: 如何添加 3. QEMU中的GUI操作

  • 发布有偿项目

对于每个外设,都会涉及两方面: QEMU中对它的模拟,你写的裸机/驱动/app对它的操作。
我们会发布近百个外设的项目, 比如有红外传感器、ADC、DAC等待
你记忆选择你擅长的,完成某个即可获得报

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开发环境下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
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.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

高级玩法

获取源码

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

类别 国外github仓库 国内coding仓库
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
buildroot

编译运行源码

编译imx6ul qemu内核源码

make 100ask_imx6ul_qemu_defconfig
make zImage
得到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  100ask_imx6ul_qemu.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