搭建Linux下QT开发环境与Android开发环境(嵌入式与PC机)

举报
DS小龙哥 发表于 2022/10/10 15:05:27 2022/10/10
【摘要】 Qt 是一个跨平台的 C++图形用户界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发 GUI 程序,也可用于开发非 GUI 程序。Qt 是完全面向对象的,很容易扩展,并且允许真正地组件编程。

学习的知识点总结

Linux驱动:

驱动学习的知识点:

0. Uboot配置、编译、命令学习、内核引导、环境变量设置

Linux内核配置、编译、裁剪、驱动静态编译、动态编译

根文件系统制作: 实现NFS远程挂载、本地挂载

1. 字符设备框架模型(杂项、早期、标准)

(ioctl\mmap\fasync\proc文件系统)

2. 内核中断处理、工作队列、内核微线程

3. 阻塞IO与非阻塞IO、等待队列

(select、poll、epoll、signal驱动编写)

4. 内核定时器、内核高精度时间获取

5. 帧缓冲设备框架模型、LCD应用编程、编写OLED屏驱动

(图片编码截屏、图片解码、视频播放)

6. 平台设备框架模型

7. Linux内核下SPI子系统框架模型

8. Linux内核下IIC子系统框架模型

9. Linux内核下RTC子系统框架模型

10. 红外线编码\解码驱动

11. 搭建NFS服务器、FTP服务器、HTTP服务器

12. 块设备框架模型、编写SD卡驱动

13. 网络设备框架模型、编写ENC28J60网卡驱动

14. USB无线网卡原厂驱动源码移植(雷凌MT7601无线网卡)、编译无线网卡工具套件

15. Linux下V4L2框架模型、实现USB摄像头编程、实现网页视频监控。

16. Linux下串口应用编程: 实现串口蓝牙、串口WIFI、GPS编程。

17. 搭建QT5.6嵌入式运行环境、实现QT基本程序编写

18. 搭建Android嵌入式运行环境

19. 移植Mplayer、FFmpeg、X264视频编解码库: 实现视频播放、录制、保存。

20. 输入子系统框架模型: 触摸屏驱动编写、标准按键驱动编写

21. Linux内核下USB子系统框架模型: 编写USB鼠标驱动。




驱动动手编写的实际驱动

1. LED、按键、蜂鸣器驱动。

2. OLED显示屏驱动: 底层时序使用SPI子系统接口、加入帧缓冲框架模型。

3. FT5X06多点电容触摸屏驱动: 底层使用IIC子系统接口、加入输入子系统和tslib框架。

4. DS1302 RTC实时时钟驱动: 加入RTC子系统模型框架。

5. (24AA025E48)EEPROM存储器驱动: 底层使用IIC子系统接口。

6. 飞思卡尔MMA7660三轴加入速度计驱动:底层使用IIC子系统接口,加入输入子系统框架。

7. NEC红外线编码/解码驱动: 实现NEC协议红外线编解码。

8. ENC28J60有线网卡驱动编写: 加入网络驱动框架,实现DHCP(自动IP分配)功能和应用层socket编程调用。

9. SD卡驱动编写: 加入块设备驱动框架,实现应用层mount挂载,文件创建读写对接。

10. USB无线网卡原厂驱动源码移植(雷凌MT7601无线网卡)、编译无线网卡工具套件,实现DHCP功能。




应用层结合的项目:

1. Linux下搭建物联网IOT云服务器,实现手机APP、PC机软件、嵌入式硬件、服务器之间远程交互。

适用于: 智能家居、物联网、车联网、智能手环等领域。

2. 视频广告机项目(应用于公交车站台、地铁、高速路等地方广告宣传):

(1) 嵌入mplayer视频播放器(管道方式与mplayer通信,实现从模式控制)

(2) 实现视频文件自动从远程服务器下载更新

(3) 实现视频自动播放、自动切换

3. 网页视频监控(应用于智能家居、智能摄像头、监控领域):

(1) 采集USB摄像头图像,添加水印,编码为JPG格式,TCP协议方式传输给云端服务器

(2) 搭建云端HTTP服务器,采用多线程与浏览器实现交互,完成视频画面刷新

(3) 实现跨平台、跨网段远程视频监控




4. 倒车影像系统

(1) 采集摄像头数据实时显示在LCD屏上,辅助车主泊车。

(2) 加入超声波测距模块,实时测量距离

(3) 加入蜂鸣器驱动,实现PWM控制,根据超声波测量距离调整PWM频率,控制蜂鸣器频率。

(提示障碍物)

额外:

5. 行车记录仪项目

(1) 嵌入FFMPEG\X264视频解码库接口函数

(2) 捕获摄像头数据加入时间水印,编码为MP4格式视频存放本地

 M3知识点:

1.​ IIC、SPI、UART、485、CAN总线

2.​ 红外线编码、解码

3.​ BLE低功耗蓝牙、ESP8266 WiFi

4.​ OLED显示屏

5.​ RC522射频模块

6.​ LCD屏—8080时序

7.​ DS18B20温度传感器、DS18B20组网多点测温运用

8.​ AT24C02—eeprom芯片

9.​ ADC(配合DMA实现多通道循环采集)、DAC




​ RC522射频模块: 校园超市-食堂,超市-门店会员系统,加油卡、公交地铁。

​ 物联网系统: WIFI控制、蓝牙控制、OLED显示屏、RC522

智能楼宇系统: 主要目的--远程控制,对讲、开锁、摄像头采集。

​ UCOSII实时操作系统、FreeRTOS操作系统

​ FATFS文件系统: 保存数据,开机读取一些初始化需要使用的文件。


任务1: 搭建QT嵌入式开发环境

1.1 源码编译

QT源码文件: qt-everywhere-opensource-src-5.6.0.tar.gz

将该文件拷贝到Linux系统下(/work/QT),进行解压、配置、编译。

参考教程文档:嵌入式linux之QT5.6移植.pdf

(1)​ 修改配置文件: gedit qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf

(2)​ 删除一些目录: rm qt3d qtcanvas3d qtweb* -fr

(3)​ 生成Makefile文件: ./configure -release -opensource -xplatform linux-arm-gnueabi-g++ -prefix $PWD/tmp -no-c++11 -no-opengl -no-dbu

(4)​ 编译: make

(5)​ 安装: make install


1.2 在ubuntu系统下搭建QT嵌入式环境

1. 将资料解压(windows): 项目:移植QT框架到嵌入式平台.7z 压缩包

2. 将解压的压缩包里的 qt5.6_tmp.tar 包拷贝到ubuntu系统根目录下解压。

注意: 登录ubuntu系统之后,先切换权限为超级用户在拷贝、解压: sudo su root

3. make -v

4. 创建文件

[root@wbyq bin]# mkdir /work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0/ -p

5. 重新解压文件到指定路径下

[root@wbyq ]# cd /work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0

[root@wbyq ]# cp qt5.6_tmp.tar ./

[root@wbyq ]#tar xvf qt5.6_tmp.tar


1.3 安装QT软件

1. 将安装包qt-opensource-linux-x86-android-5.5.1.run拷贝到ubuntu系统下。

2. 运行安装包进行安装: ./ qt-opensource-linux-x86-android-5.5.1.run

3. 找到软件的安装路径: [root@wbyq bin]# cd /opt/Qt5.5.1/Tools/QtCreator/bin/

4. 运行软件: [root@wbyq bin]# ./qtcreator

1.4 Android对应的内核 ----HAL

#QT相关的路径
export QTDIR=/qt5.6_lib

#设置共享库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib

#键盘
export QT_QPA_ENABLE_TERMINAL_KEYBOARD=/dev/input/event1

#鼠标节点
export QT_QPA_FB_HIDECURSOR=/dev/input/event4

#触摸屏的节点
export QT_QPA_FB_TSLIB=/dev/input/event2
	
#字体库目录
export QT_QPA_FONTDIR=$QTDIR/lib/fonts

#图形插件平台
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0   

#平台插件
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins

export LD_PRELOAD=$QTDIR/lib/preloadable_libiconv.so

练习:

1.​ 搭建QT嵌入式开发环境: 在开发板上运行QT程序。

2.​ 搭建QTonAndroid开发环境,编写一个LED或者蜂鸣器驱动,在Android下安装,

自己使用QT编写一个Android APP 测试自己的驱动。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>  /*杂项设备头文件*/
#include <linux/fs.h>

#include <linux/gpio.h>
#include <mach/gpio.h>
#include <plat/gpio-cfg.h>

#define DEVICE_NAME "tiny4412_beep"
#define BEEP_GPIO EXYNOS4_GPD0(0)

static int beep_open(struct inode *inode, struct file *file)
{
	printk("beep_open调用成功!\n");
	return 0;
}

static ssize_t beep_read(struct file *file, char __user *buf, size_t size, loff_t *loff)
{
	gpio_set_value(BEEP_GPIO,0); /*控制GPIO口输出低电平*/
	printk("beep_read调用成功!\n");
	return 0;
}

static ssize_t beep_write(struct file *file, const char __user *buf, size_t size, loff_t *loff)
{
	gpio_set_value(BEEP_GPIO,1); /*控制GPIO口输出高电平*/
	printk("beep_write调用成功!\n");
	return 0;
}

static int beep_release(struct inode *inode, struct file *file)
{
	gpio_set_value(BEEP_GPIO,0); /*控制GPIO口输出低电平*/
	printk("beep_release调用成功!\n");
	return 0;
}

static struct file_operations fops_beep=
{
	.open=beep_open,
	.read=beep_read,
	.write=beep_write,
	.release=beep_release
};


static struct miscdevice misc_beep=
{
	.minor=MISC_DYNAMIC_MINOR, /*次设备号: 0~255*/
	.name=DEVICE_NAME,         /*设备节点的名称*/
	.fops=&fops_beep          /*虚拟文件操作集合*/
};

static int __init tiny4412_beep_init(void)
{
	gpio_request(BEEP_GPIO, "LED"); /*声明GPIO的功能*/
	s3c_gpio_cfgpin(BEEP_GPIO, S3C_GPIO_OUTPUT); /*配置GPIO为输出*/
	gpio_set_value(BEEP_GPIO,0); /*控制GPIO口输出高低电平*/
	
   /*1. 注册杂项设备*/
	misc_register(&misc_beep);
    printk("提示: 驱动安装成功!\n");
    return 0;
}

static void __exit tiny4412_beep_exit(void)
{
	gpio_free(BEEP_GPIO); /*释放占用的GPIO*/

 	/*2. 注销杂项设备*/
	misc_deregister(&misc_beep);
    printk("提示: 驱动卸载成功!\n");
}

module_init(tiny4412_beep_init);  /*指定驱动的入口函数*/
module_exit(tiny4412_beep_exit);  /*指定驱动的出口函数*/
MODULE_LICENSE("GPL");             /*指定驱动许可证*/


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。