失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 基于Qemu搭建imx6l模拟开发板环境+添加驱动+驱动测试

基于Qemu搭建imx6l模拟开发板环境+添加驱动+驱动测试

时间:2019-05-01 10:12:38

相关推荐

基于Qemu搭建imx6l模拟开发板环境+添加驱动+驱动测试

一.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模拟开发板环境+添加驱动+驱动测试》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。