“100ask imx6ul qemu”的版本间的差异
(→操作示例) |
|||
第43行: | 第43行: | ||
==操作示例== | ==操作示例== | ||
− | + | '''获取IP地址'''<br> | |
− | QEMU运行时,主机即给Ubuntu的IP是10.0.2.2 | + | :QEMU运行时,主机即给Ubuntu的IP是10.0.2.2 |
ifconfig eth0 10.0.2.15 | ifconfig eth0 10.0.2.15 | ||
− | + | '''挂载主机nfs目录''' | |
− | QEMU模拟的开发板,可以去访问10.0.2.2,比如使用NFS挂载: | + | :QEMU模拟的开发板,可以去访问10.0.2.2,比如使用NFS挂载: |
mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt | mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt | ||
− | + | '''测试lcd显示''' | |
− | + | *画同心圆 | |
myfb-test /dev/fb0 | myfb-test /dev/fb0 | ||
− | + | *测试LCD | |
fb-test | fb-test | ||
− | + | *显示文字 | |
show_font | show_font | ||
− | + | '''编写并测试led驱动''' | |
− | + | *安装编译好的led模块驱动 | |
insmod 100ask_led.ko | insmod 100ask_led.ko | ||
− | + | *打开并关闭led显示 | |
ledtest /dev/100ask_led0 on | ledtest /dev/100ask_led0 on | ||
ledtest /dev/100ask_led0 off | ledtest /dev/100ask_led0 off | ||
− | + | '''编写并测试i2c驱动''' | |
− | + | :不需要写I2C驱动,可以通过用户态使用内核里自带的I2C接口访问外设:<br> | |
− | + | :假设AT24C02接在IMX6UL的I2C0总线上,AT24C02的地址是0x50,<br> | |
− | + | :可以执行下面的命令写AT24C02的0地址,读其0地址:<br> | |
− | 可以执行下面的命令写AT24C02的0地址,读其0地址: | + | i2c_usr_test /dev/i2c-0 0x50 w 0 0x12 |
− | i2c_usr_test /dev/i2c-0 0x50 w 0 0x12 | + | i2c_usr_test /dev/i2c-0 0x50 r 0 |
− | i2c_usr_test /dev/i2c-0 0x50 r 0 | ||
=高级玩法= | =高级玩法= |
2019年11月1日 (五) 11:13的版本
目录
qemu简介
QEMU(Quick EMUlator的缩写)是执行硬件虚拟化的免费开源模拟器。
它通过动态二进制转换来模拟计算机的处理器,并为计算机提供一组不同的硬件和设备模型,从而使其能够运行各种来宾操作系统。
它还可以与KVM一起使用,以接近自然的速度运行虚拟机(通过利用诸如IntelVT-x之类的硬件扩展)。QEMU还可以对用户级进程进行仿真,从而允许针对一种架构编译的应用程序可以在另一种架构上运行。
快速使用
准备工作
-
必须
- 一台可以上网的windows电脑
- 一个可以正常使用Ubuntu虚拟机系统
-
可选
- MobaXterm_Portable_v12.0.zip
- 安装kvm加速qemu运行,在终端下执行如下命令
$ sudo apt update $ sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
获取镜像
点击如下链接下载
下载完成后上传到Ubuntu虚拟机中,并解压缩,解压缩后执行如下命令
运行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
等待运行
参数讲解
-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的IP是10.0.2.2
ifconfig eth0 10.0.2.15
挂载主机nfs目录
- QEMU模拟的开发板,可以去访问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接口访问外设:
- 假设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
高级玩法
获取源码
类别 | 国内coding仓库 | 国外github仓库 |
---|---|---|
linux kernel | https://git.dev.tencent.com/weidongshan/qemu_imx6ull_kernel.git | https://github.com/100askTeam/qemu_imx6ull_kernel.git |
qemu 源码 | ||
buildroot |
编译运行源码
制作文件系统
$ 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
其它相关
- 参考资料
-
QEMU user manual
https://qemu.weilnetz.de/doc/qemu-doc.html -
QEMU
https://wiki.archlinux.org/index.php/QEMU
-