基于Qemu搭建imx6l模拟开发板环境+添加驱动+驱动测试
一.Qemu镜像下载
准备环境 vmware ubuntu18.04 git工具
下载镜像文件
root@ubuntu:/home/mf/Desktop# git clone https://e.coding.net/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 https://e.coding.net/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 https://e.coding.net/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=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/root/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
使环境变量生效
root@ubuntu:~#source ~/.bashrc
四.编译内核和设备树
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make mrproper
root@ubuntu:~/100ask_imx6ull-qemu/linux-4.9.88#make 100ask_imx6ull_qemu_defconfig
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#sudo apt-get install lzop
root@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/zImage
root@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 0x80000000 MX6UL_PAD_GPIO1_IO01__GPIO1_IO01 0x80000000 MX6UL_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 0x80000000 MX6UL_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-image
root@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 /mnt
root@ubuntu:/home/mf/Desktop/ubuntu-18.04_imx6ul_qemu_system/imx6ull-system-image# cd /mnt
root@ubuntu:/mnt# ls
bin dev fat lib linuxrc mnt proc run sbin tmp var
boot 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]# ls
user_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模拟开发板环境+添加驱动+驱动测试相关推荐
- 学内核之二:基于QEMU搭建Linux内核运行调试环境
目录 一 接续上文 二 编译根文件系统 三 构建完善根文件系统 四 内核中指定根文件系统 五 带根文件系统启动内核 一 接续上文 在上一篇文章中,我们展示了通过QEMU仿真软件来运行Linux内核的过 ...
- 基于QEMU的ARM Cortex-A9开发板Vexpress-ca9的Linux内核的编译和运行
宿主机:Ubuntu16.04 x64(Linux内核4.4.0) 交叉编译工具链:gcc-arm-linux-gnueabi arm-linux-gcc:4.4.3 QEMU:2.5.0 Linux ...
- QEMU imx6ul开发板环境搭建
QEMU imx6ul开发板环境搭建 文章目录 QEMU imx6ul开发板环境搭建 0. 前言 1. 基本环境 2. 安装KVM 3. 下载开发板的QEMU镜像文件 4. 运行QEMU系统 4.1 ...
- Linux利器:QEMU!用它模拟开发板能替代真开发板?
不想错过我的推送,记得右上角-查看公众号-设为星标,摘下星星送给我! QEMU,搞嵌入式开发的一定不陌生,最近各大群里都讨论疯了,说它是Linux利器一点也不夸张.它是一款知名的而且开源的模拟器(官网 ...
- c语言模拟32u4单片机,一种基于Atmega32u4的教学型Arduino开发板的制作方法
本实用新型涉及一种教学型Arduino开发板,具体是基于Atmega32u4芯片的教学型Arduino开发板. 背景技术: 近些年来,互联网和物联网高速发展,在推动社会生产力快速发展的同时,也对我们的 ...
- 【 RA4M2开发板环境搭建之串口下载1】
[ RA4M2开发板环境搭建1] 1. 前言 1.1 活动来源 1.2 开发环境 1.3 RA4M2开发板 2. MDK环境准备 2.1 keil 5下载安装 2.2 安装RA4M2的软件支持包 2. ...
- 超级便宜的鸿蒙开发板环境搭建-编译-烧录
超级便宜的鸿蒙开发板环境搭建-编译-烧录 1.下载代码.编译工具和烧写工具 打开https://gitee.com/hihopeorg/Neptune-HarmonyOS-IOT下载代码 打开http ...
- (二)海思3519av100开发:开发板环境搭建
海思文档+nfsAxe+SecureCRT 8.1破解版资源网盘链接提取码:pzxg 2 开发板环境设置 本文省去kernel.uboot.文件系统烧写步骤,详见海思文档. 工具:开发板.usb转串口 ...
- 龙芯linux开发板,龙芯1b开发板环境及系统搭建
建立交叉编译环境 交叉编译工具包:gcc-4.3-ls232-softfloat.tar.gz 1.解压到/opt文件夹 sudo tar zxvf gcc-4.3-ls232-softfloat.t ...
最新文章
- RIP 数据包类型 路由中毒
- javaScript字符串应用
- matlab按某一列排序
- Mysql 的一些基本用法
- shell中的括号(小括号,中括号,大括号/花括号)
- 提升逻辑!APP数据可视化界面设计灵感
- ASP.NET AJAX 首部曲 - 迈向解密之路
- 【技巧】LeetCode 86. Partition List
- Nginx伪静态配置和常用Rewrite伪静态规则
- java 产生无重复的随机数,Java程序生成无重复的随机数
- 深圳移动 神州行(大众卡/轻松卡/幸福卡)套餐资费(含香港日套餐)信息及使用方法
- 如何恢复Windows默认共享
- 金融与python-基于Python的金融分析与风险管理
- 知名云计算厂商云宏加入龙蜥社区,共同打造信息安全坚实“地基”
- Cisco Packet Tracer 超网(CIDR)设置实验
- C++的4种智能指针剖析使用
- OpenStack 2014 用户调查解析——中国部署规模仅次于美国
- ThinkPHP5.0商城项目目录搭建(菜鸟)
- 域名系统中的本地域名服务器根域名服务器,本地域名服务器 根域名服务器区别...
- 【map】百度地图离线化V1.3