写点什么

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

作者:DS小龙哥
  • 2022-10-15
    重庆
  • 本文字数:3709 字

    阅读完需:约 1 分钟

知识点总结

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
复制代码



  1. 创建文件


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


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


[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"); /*指定驱动许可证*/
复制代码


发布于: 刚刚阅读数: 3
用户头像

DS小龙哥

关注

之所以觉得累,是因为说的比做的多。 2022-01-06 加入

熟悉C/C++、51单片机、STM32、Linux应用开发、Linux驱动开发、音视频开发、QT开发. 目前已经完成的项目涉及音视频、物联网、智能家居、工业控制领域

评论

发布
暂无评论
搭建Linux下QT开发环境与Android开发环境(嵌入式与PC机)_10月月更_DS小龙哥_InfoQ写作社区