qt操作硬件(以imx6ull为例)

news2024/10/7 14:30:29

        下面用imx6ull的qt'点灯说明,这里要使用c++,c混合编程

一、完成ui界面位置

        构造一个这样的简单界面即可,主要是实现open和close的槽函数即可。我这里分别把两个按钮改名为为openbt closebt了

二、实现逻辑功能

2.1完成led类创建

        在主文件夹led中addnew,选择c++的类,记得把base class改成qobject,取个类的名字,其余保持默认即可。

                

完成创建后你会得到一个led.h和led.cpp

下面我们在led.h中的public加入我们led要用到的一些元素,我加入了fd(后面用于保存文件句柄),led灯的值,打开和关闭led的函数,

重点:c语言里面的头文件移植到c++中我们需要用extern “C”{ ……}将其括起来,然后为了标准我们通常将c语言里面的函数如open write 等调用之前加入::如::open()

下面我们去完成这两个函数即可,

在led的构造函数中我让其open,我们这里就是打开写入1,关闭写入0而已。

2.2在widget中调用led类

        我们在widget的头文件的public中声明一个led类

然后再去其cpp文件new一下,这时候会触发其构造函数即open对应设备节点,然后再去两个按钮的槽函数分别调用打开灯和关灯函数即可

这里注意widget的头文件中要include "led.h"否则调用会出错

2.3实现对应驱动函数

我们上面led的构造函数打开的设备节点是/dev/flyled,但是压根没这个设备节点啊,所以你要自己写驱动程序来驱动这个led

这里我们首先需要进行设备树添加

然后我们去实现对应的函数,记住我们要成功的对应compatible即可:

这里简略回忆一下驱动函数:

        1.入口函数,注册平台驱动程序,出口函数卸载平台驱动程序

        2.平台驱动程序:driver中的of_match_table来用于匹配设备树的compatible,probe用于匹配后进入,remove用于卸载probe的事情

        3.probe中:注册字符驱动设备,注册类,注册设备节点,注册file_operation结构体,在该结构体内再实现相应功能

        4.file_operation中open可以不写,owner是THIS_MODULE,然后实现写函数即可

        5.写函数使用copy_from_user进行数据交互

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/slab.h>
#include <linux/of.h>
#include <linux/gpio/consumer.h>
#include <media/i2c/adp1653.h>
#include <media/v4l2-device.h>
#include <linux/platform_device.h>

static int major = 0 ;
static struct gpio_desc *led_gpiod;
static struct class *ledclass;
static ssize_t led_write(struct file *file, const char __user *buf, size_t size, loff_t *loff)
{
    char value;
    copy_from_user(&value, buf, 1);
    if(value)
        gpiod_set_value(led_gpiod,0);
    else  
        gpiod_set_value(led_gpiod,1);

    return 0;
}

static const struct file_operations ledfops = {
    .owner = THIS_MODULE,
    .write = led_write,
};

//获得资源
static int led_dri_probe (struct platform_device *device)
{
    major = register_chrdev(0,"fly_led", &ledfops);
    ledclass = class_create(THIS_MODULE, "led_class");
    device_create(ledclass,NULL, MKDEV(major,0), NULL,"flyled");
    printk("%s,%s,%d\r\n",__FILE__,__FUNCTION__,__LINE__);
    led_gpiod = gpiod_get(&device->dev,NULL,GPIOD_OUT_HIGH);
    return 0;
}

static int led_dri_remove(struct platform_device *device)
{
    gpiod_put(led_gpiod);
    device_destroy(ledclass,MKDEV(major,0));
    class_destroy(ledclass);
    unregister_chrdev(major,"fly_led");
    return 0;
}
static const struct of_device_id led_dri_ofmatch[] = {
	{ .compatible = "fly,led", },
	{ },
};



static struct platform_driver led_dri =
{
    .probe  = led_dri_probe,
    .remove = led_dri_remove,
	.driver = {
		.name = "fly_led_dri",
		.of_match_table = led_dri_ofmatch,
	},
};




static int led_dri_init(void)
{
    platform_driver_register(&led_dri);
    return 0;
}


static void led_dri_exit(void)
{
    platform_driver_unregister(&led_dri);

}


module_init(led_dri_init);
module_exit(led_dri_exit);
MODULE_LICENSE("GPL");











2.4测试函数

        以防万一,我自己有编写了一个测试函数





#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

#include <stdio.h>
#include  <string.h>


int main(int argc,char **argv)
{
    int fd ;
    fd = open("/dev/flyled",O_RDWR);
    if(strcmp(argv[1],"open")==0)
    {
        char buf = 1;
        write(fd,&buf, 1);
        printf("led open\r\n");
    }
    else if(strcmp(argv[1],"close")==0) 
    {
        char buf = 0;
        write(fd,&buf, 1);
        printf("led close\r\n");
    }

    return 0;
}

三、结束

        最后需要先安装驱动程序,然后再下载qt程序否则会没用open到设备节点

        本次学习了如何使用qt操作硬件,其实也很简单就是把c代码移植到c++里面,主要记住面向对象的编程思想构造出led类,以及extern ”C“{ }引用头文件,以及c语言中的代码需要加::,如::open。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN

前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤&#xff08;裸光纤&#xff09;由运营商提供&#xff0c;是无中继的光纤线路&#xff0c;仅通过配线架连接。相比传统光纤&#xff0c;裸光纤提供纯粹的物理传输路径&#xff0c;无需额外网…

【C++】类与对象(类章节)

面向过程和面向对象 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。 一、类 1.类…

OpenBayes 一周速览|Apple 开源大模型 OpenELM 上线;字节发布 COCONut 首个全景图像分割数据集,入选 CVPR2024

公共资源速递 This Weekly Snapshots &#xff01; 5 个数据集&#xff1a; * COCONut 大规模图像分割数据集 * THUCNews 新闻数据集 * DuConv 对话数据集 * 安徽电信知道问答数据集 * Sentiment Analysis 中文情感分析数据集 2 个模型&#xff1a; * OpenELM-3B-Inst…

面试笔记——类加载器

基础 类加载器&#xff1a;用于装载字节码文件(.class文件)运行时数据区&#xff1a;用于分配存储空间执行引擎&#xff1a;执行字节码文件或本地方法垃圾回收器&#xff1a;用于对JVM中的垃圾内容进行回收 类加载器 &#xff1a;JVM只会运行二进制文件&#xff0c;类加载器的…

Python入门系列-02 pip的安装

目录 一、pip介绍二、pip安装检查三、pip安装 一、pip介绍 pip 是 Python 包管理工具&#xff0c;该工具提供了对Python 包的查找、下载、安装、卸载的功能。 二、pip安装检查 你可以通过以下命令来判断是否已安装。 pip --version # Python2.x 版本命令 pip3 --versio…

uniapp——弹出键盘遮挡住输入框 textarea,处理方法

案例 在写输入框的时候会遇见 键盘遮挡住部分textarea框的一部分&#xff0c;使用cursor-spacing处理即可 修改后&#xff1a; 其他问题&#xff1a; 调起键盘输入时&#xff0c;不希望上方的内容被顶上去 代码 <view class"commentBox" :style"botto…

蓝桥杯EDA常见电路原理图设计和分析

目录 前言 一、常见器件及其作用 二、原理图设计题目 1.蜂鸣器原理图 2.LCD背光控制电路 3.参考电压源 4.低通滤波器电路设计 5.5-3.3电源转换电路 6.3.3V-VDD_EXT电平转换电路 7.DS18B20原理图 8.供电输出控制接口电路 9.电源检测接口电路 10.USB转串口电路 三、…

微信小程序原生组件使用

1、video组件使用 <view class"live-video"><video id"myVideo" src"{{videoSrc}}" bindplay"onPlay" bindfullscreenchange"fullScreenChange" controls object- fit"contain"> </video&g…

每日两题 / 104. 二叉树的最大深度 102. 二叉树的层序遍历(LeetCode热题100)

104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 递归判断&#xff0c;当前节点的最大深度为1 max(左节点的最大深度&#xff0c;右节点的最大深度) /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

PowerPhotos for Mac:您的照片管理助手

PowerPhotos for Mac&#xff0c;作为一款专业的照片管理软件&#xff0c;为用户提供了全方位的照片管理解决方案。从照片的导入、整理到查找、编辑&#xff0c;PowerPhotos都能为您提供便捷的操作体验。 首先&#xff0c;PowerPhotos支持多库管理&#xff0c;用户可以根据需要…

Spark云计算平台Databricks使用,第一个scala程序

1) 创建Spark计算集群 Spark云计算平台Databricks使用&#xff0c;创建workspace和cluster-CSDN博客 2) 创建notebook Workspace -> Users&#xff0c;选择用户&#xff0c;点击Create -> Notebook 选择集群&#xff0c;可以修改notebook名字 修改了notebook名字 选择S…

triton之语法学习

一 基本语法 1 torch中tensor的声明 x = torch.tensor([[1,2, 1, 1, 1, 1, 1, 1],[2,2,2,2,2,2,2,2]],device=cuda) 声明的时候有的时候需要指出数据的类型,不然在kernel中数据类型无法匹配 x = torch.tensor([1,2,1,1,1,1,1,1],dtype = torch.int32,device=cuda) 2 idx id…

关于冯诺依曼体系结构 和 操作系统(Operator System)的概念讲解(冯诺依曼体系结构,操作系统的作用等)

目录 一、冯诺依曼体系结构 二、操作系统 1. 概念 2. 设计操作系统的目的 3.系统调用和库函数概念 4.总结 三、完结撒❀ 一、冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代&#xff0c;个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI&#xff0c;为消费者提供了精彩的内容推荐服务&#xff0c;更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好&#xff0c;能够快速识别其兴趣…

idea java 后缀补全

ArrayList<$EXPR$> enters new ArrayList<>();for (int i 0; i < enters.size(); i) {$EXPR$ enter enters.get(i);enter$END$} 让编程效率翻倍的IDEA快捷键—自定义后缀补全_哔哩哔哩_bilibili

Navicat 干货 | 探索 PostgreSQL 中不同类型的约束

PostgreSQL 的一个重要特性之一是能够对数据实施各种约束&#xff0c;以确保数据完整性和可靠性。今天的文章中&#xff0c;我们将概述 PostgreSQL 的各种约束类型并结合免费的 "dvdrental" 示例数据库 中的例子探索他们的使用方法。 1. 检查约束&#xff1a; 检查…

winform图书销售管理系统+mysql

winform图书销售管理系统mysql数据库说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 功能模块&#xff1a; 管理员:ttt 123 登陆可以操作我的 个人信息 修改密码 用户信息 添加删除用户 图书 添加删除图书信息 购物车 购买订单信息 充值 退出账户 …

JavaScript中的深拷贝与浅拷贝详解

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 &#x1f4da; 引言❓什么是拷贝&#x1f31f; 浅拷贝&#xff1a;表面功夫浅拷贝常用方法1. 扩展运算符 (...)2. Object.assign()3. 手动遍历对象属性 &#x1f320; 深拷贝&#xff1a;彻底分离深拷贝常用方法1. Lodash 的…

windows 10安装 docker desktop

升级 windows 10 windows 10 升级到 20H2&#xff0c;如 20H2 19045.4291。 注意&#xff1a;需返回更新&#xff0c;重启计算机&#xff0c;确保更新完整。 bios 开启虚拟化 开启cpu虚拟化功能。 windows 启用功能 启用hyper-v 启用 wsl 安装 wsl https://learn.microso…

大模型背后的秘密公式: Q*?

这麽说好像我是James Bond后面那个厉害的Q先生&#xff0c;Q是英文Quartermaster&#xff08;軍需官&#xff09;第1個英文字大寫&#xff0c;是007系列英國祕勤局虛構部門Q部門的領導。 Stanford大学的研究者最近发表了一篇名为"From r to Q*: Your Language Model is S…