一.Qemu镜像下载
准备环境 vmware ubuntu18.04 git工具
下载镜像文件
root@ubuntu:/home/mf/Desktop# git clone /weidongshan/ubuntu-18.04_imx6ul_qemu_system.git
成功后可以得到一个名为“ubuntu-18.04_imx6ul_qemu_system”的目录,里面有以下内容:
二.运行QEMU系统
1.首次运行需要安装SDL环境
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system# ./install_sdl.sh // 提示输入用户密码,等待安装完成
2.运行带GUI的imx6ul模拟器–模拟百问网imx6ul-qemu开发板
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system# ./qemu-imx6ull-gui.sh // 启动后,登录名是root,无需密码
输入以上命令启动开发板,进入如下界面,在login处输入用户名:root
成功进入到qemu模拟的imx6ul开发板的界面,如下:
三.获取源码
1.先用git clone下载repo工具,再用repo工具下载源码(repo工具管理代码)
(1)下载repo工具
root@ubuntu:~# git clone /codebug8/repo.git
(2)repo命令克隆由 -u 参数提供的 manifest Git 库 -b的linux-sdk分支 -m的imx6ull/100ask-imx6ull_qemu_release_v1.0.xml这个文件
root@ubuntu:~# ../repo/repo init -u /weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
(3)下载最新本地工作文件,更新成功,这本地文件和repository 中的代码是一样的。这里指定更新-j4这个project
root@ubuntu:~#../repo/repo sync -j4
如果一切正常,你在/root目录下创建了一个100ask_imx6ull-qemu目录,里有如下内容:
2.配置交叉编译环境
设置交叉编译工具主要是设置PATH, ARCH和CROSS_COMPILE三个环境变量
如需永久修改,请修改用户配置文件。在Ubuntu系统下,修改如下:
root@ubuntu:~# vi ~/.bashrc
在行尾添加或修改:
export ARCH=armexport CROSS_COMPILE=arm-linux-gnueabihf-export PATH=$PATH:/root/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-.11-x86_64_arm-linux-gnueabihf/bin
使环境变量生效
root@ubuntu:~#source ~/.bashrc
四.编译内核和设备树
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make mrproperroot@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu_defconfigroot@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make zImage //编译zImage内核镜像root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu.dtb //编译设备树
编译内核如果出现如下报错
解决方法如下,然后在重新编译内核
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#sudo apt-get install lzoproot@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#apt --fix-broken install
查看生成的内核和设备树的位置
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# find -name zImage./arch/arm/boot/zImageroot@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# find -name 100ask_imx6ull_qemu.dtb./arch/arm/boot/dts/100ask_imx6ull_qemu.dtb
四.修改源码,添加新的驱动
准备环境vscode通过ssh服务连接虚拟机,方便代码的修改
举例:添加新的gpio的驱动,操作如下:
(1)在/root/100ask_imx6ull-qemu/linux-4.9.88/drivers/char路径下面添加驱动文件user_gpio.c和驱动头文件user_gpio.h
user_gpio文件是驱动操控gpio的所有的接口函数的实现
(2)修改/root/100ask_imx6ull-qemu/linux-4.9.88/drivers/char路径下的Makefile文件
在Makefile文件的结尾添加
obj-$(CONFIG_USER_GPIO)+= user_gpio.o
(3)修改/root/100ask_imx6ull-qemu/linux-4.9.88/drivers/char目录下的Kconfig文件
添加如下内容
config USER_GPIOtristate "Support users to use GPIO"default yhelpUsers can set up or get GPIO by character device
(4)修改设备树文件,本项目使用到的设备树100ask_imx6ull_qemu.dtb和其中引用到的imx6ull.dtsi
在100ask_imx6ull_qemu.dtb中添加如下代码
user_gpio {compatible = "user_gpio";pinctrl-names = "default";pinctrl-0 = <&pinctrl_gpio>;input {trigger {label = "Trigger Button";gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;wakeup-source;linux,code = <1>;};in1 {label = "in 1";gpios = <&gpio1 1 GPIO_ACTIVE_HIGH>;wakeup-source;linux,code = <2>;};in2 {label = "in 2";gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;wakeup-source;linux,code = <3>;};};output {5v {label = "5v";gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;};24v {label = "24v";gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;};output1 {label = "output1";gpios = <&gpio1 7 GPIO_ACTIVE_LOW>;};output2 {label = "output2";gpios = <&gpio1 8 GPIO_ACTIVE_LOW>;};output3 {label = "output3";gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;};output4 {label = "output4";gpios = <&gpio5 10 GPIO_ACTIVE_LOW>;};};};
pinctrl_gpio: gpios_grp {fsl,pins = <MX6UL_PAD_GPIO1_IO00__GPIO1_IO00 0x80000000MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x80000000MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0x80000000MX6UL_PAD_GPIO1_IO05__GPIO1_IO05 0x80000000MX6UL_PAD_GPIO1_IO06__GPIO1_IO06 0x80000000MX6UL_PAD_GPIO1_IO07__GPIO1_IO07 0x80000000MX6UL_PAD_GPIO1_IO08__GPIO1_IO08 0x80000000MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x80000000MX6UL_PAD_BOOT_MODE0__GPIO5_IO10 0x80000000>;};
关于gpio口管脚的说明,由于没有有效的硬件原理图,所有的gpio是在头文件/root/100ask_imx6ull-qemu/linux-4.9.88/arch/arm/boot/dts/imx6ul-pinfunc.h中选取没有用到的gpio口和引脚
根据排除status = "disabled"找出其余的所有已经占用的gpio口(status = "okay"和没有赋值的默认的,都是已经占用的gpio)
(5)将user_gpio.c编译到模块user_gpio.ko修改/root/100ask_imx6ull-qemu/linux-4.9.88目录下的.config文件
CONFIG_USER_GPIO=m
(6)编译
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make zImage //编译zImage内核镜像root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu.dtb //编译设备树root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make modules //编译模块
查看生成的模块的目录,内核和设备树的目录如上
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# find -name user_gpio.ko./drivers/char/user_gpio.ko
(7)将新编译出来的新内核和设备树拷贝到模拟开发板的镜像目录/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image下
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# cp ./arch/arm/boot/zImage /home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-imageroot@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# cp ./arch/arm/boot/dts/100ask_imx6ull_qemu.dtb /home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image
五.模拟开发板加载新内核和设备树
(1)搭建ubuntu的nfs环境
ubuntu主机启动nfs
sudo apt-get install nfs-kernel-server
修改/etc/exports,添加类似以下的内容—允许开发板通过NFS访问Ubuntu的/home/mf/pemu_fv100目录
/home/mf/pemu_fv100 *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
ubuntu主机 重启nfs
sudo /etc/init.d/nfs-kernel-server restart
ubuntu主机 测试nfs
可以在Ubuntu上通过NFS挂载自己,验证一下NFS可用:
在/home/mf/pemu_fv100目录下新建一个test.c文件在 /mnt下可以看到,挂在成功
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/mf/pemu_fv100 /mnt
ls /mnt
(2)模拟开发板配置网络
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,可以如下设置:
[root@qemu_imx6ul:~]#ifconfig eth0 10.0.2.15[root@qemu_imx6ul:~]#mount -t nfs -o nolock,vers=3 10.0.2.2:/home/mf/pemu_fv100 /mnt
如果一切正常,在开发板上就可以通过/mnt目录访问Ubuntu的/home/mf/pemu_fv100目录了
(3)将测试脚本可执行文件user_gpio_test放在ubuntu的/home/mf/pemu_fv100目录下,在模拟开发板的/mnt目录下就可以访问啦
六.模拟开发板加载新的文件系统
因为我们将新添加的驱动编译成了user_gpio.ko模块,我们现在需要将这个文件添加到模拟开发板的镜像目录下/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image的rootfs.img这个根文件系统中
(1)挂在rootfs.img到设备的/mnt目录下,ubuntu下执行下面的命令:
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image#sudo mount -o loop rootfs.img /mntroot@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image# cd /mntroot@ubuntu:/mnt# lsbin dev fat lib linuxrc mnt proc run sbin tmp varboot etc home lib32 media opt root samba sys usr
这时候可以在模拟开发板的/mnt目录下操作根文件系统
(2)将新编译出来的驱动模块user_gpio.ko拷贝到/mnt下面去
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88# cp ./drivers/char/user_gpio.ko /mnt/mnt
操作完毕一定要取消挂载,不然启动内核会因为根文件系统挂死
root@ubuntu:/# sudo umount /mnt
(3)进入模拟开发板的/mnt目录加载新驱动
[root@qemu_imx6ul:/mnt]# lsuser_gpio.ko[root@qemu_imx6ul:/mnt]# insmod user_gpio.ko [root@qemu_imx6ul:/mnt]#lsmod //查看加载情况
一切正常
七.测试新驱动模块–user_gpio.ko
(1)测试脚本编译
root@ubuntu:/home/mf/pemu_fv100#arm-linux-gnueabihf-gcc user_gpio_test.c -o user_gpio_test
(2)在模拟开发板的/mnt目录下执行user_gpio_test
[root@qemu_imx6ul:/mnt]#./user_gpio_test
如果觉得《基于Qemu搭建imx6l模拟开发板环境+添加驱动+驱动测试》对你有帮助,请点赞、收藏,并留下你的观点哦!