【驱动篇】龙芯LS2K0300之红外驱动

实验目标

编写HX1838红外接收器驱动,根据接收的波形脉冲解码红外按键键值

模块连接

模块连接:VCC接Pin 2,GND接Pin1,DATA接Pin16

在这里插入图片描述

驱动代码

HX1838 GPIO初始化,申请中断,注意:GPIO48默认是给i2c0使用的,使用前记得注释掉i2c0设备树节点

#define CODE_SIZE 4
#define HX1838_IO 48
#define TIME_UNIT 140
#define GPIO_VALUE gpio_get_value(HX1838_IO)static int __init hx1838_init(void)
{int ret;int irq = gpio_to_irq(HX1838_IO);printk("irq : %d\n", irq);gpio_request(HX1838_IO, "hx1838-gpio");gpio_direction_input(HX1838_IO);ret = request_irq(irq, irq_callback, IRQF_TRIGGER_FALLING, "hx1838-irq", NULL);if (ret < 0)goto LABEL;return 0;LABEL:gpio_free(HX1838_IO);return ret;
}

中断处理函数,解码格式:地址码 + 地址码反码 + 数据码 + 数据码反码,13.5ms为前导波形信号,第56行需要注意数据取反默认是32位的(需要强制转换)

typedef unsigned char uchar;static uchar array[CODE_SIZE];irqreturn_t irq_callback(int irqno, void *arg)
{unsigned char j,k,N=0;udelay(15 * TIME_UNIT);if (GPIO_VALUE == 1){// printk("111\n");return IRQ_HANDLED;}while (!GPIO_VALUE)  {udelay(TIME_UNIT);}                                       for (j=0; j < 4; j++)                                          {for (k = 0; k < 8; k++)                                {while (GPIO_VALUE)                                  {udelay(TIME_UNIT);}while (!GPIO_VALUE)                                {udelay(TIME_UNIT);}while (GPIO_VALUE)                                  {udelay(TIME_UNIT);N++;           if (N >= 30){// printk("222\n");return IRQ_HANDLED;}                                              } array[j] = array[j] >> 1;                            if(N >= 8){array[j] = array[j] | 0x80;                     }  N = 0;}}      if(array[2] != (unsigned char)(~array[3])){// printk("333\n");return IRQ_HANDLED;}printk("%d,%d,%d,%d\n", array[0], array[1], array[2], array[3]);return IRQ_HANDLED;
}

完整驱动代码

#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/gpio.h>#define CODE_SIZE 4
#define HX1838_IO 48
#define TIME_UNIT 140
#define GPIO_VALUE gpio_get_value(HX1838_IO)typedef unsigned char uchar;static uchar array[CODE_SIZE];irqreturn_t irq_callback(int irqno, void *arg)
{unsigned char j,k,N=0;udelay(15 * TIME_UNIT);if (GPIO_VALUE == 1){// printk("111\n");return IRQ_HANDLED;}while (!GPIO_VALUE)  {udelay(TIME_UNIT);}                                       for (j=0; j < 4; j++)                                          {for (k = 0; k < 8; k++)                                {while (GPIO_VALUE)                                  {udelay(TIME_UNIT);}while (!GPIO_VALUE)                                {udelay(TIME_UNIT);}while (GPIO_VALUE)                                  {udelay(TIME_UNIT);N++;           if (N >= 30){// printk("222\n");return IRQ_HANDLED;}                                              } array[j] = array[j] >> 1;                            if(N >= 8){array[j] = array[j] | 0x80;                     }  N = 0;}}      if(array[2] != (unsigned char)(~array[3])){// printk("333\n");return IRQ_HANDLED;}printk("%d,%d,%d,%d\n", array[0], array[1], array[2], array[3]);return IRQ_HANDLED;
}static int __init hx1838_init(void)
{int ret;int irq = gpio_to_irq(HX1838_IO);printk("irq : %d\n", irq);gpio_request(HX1838_IO, "hx1838-gpio");gpio_direction_input(HX1838_IO);ret = request_irq(irq, irq_callback, IRQF_TRIGGER_FALLING, "hx1838-irq", NULL);if (ret < 0)goto LABEL;return 0;LABEL:gpio_free(HX1838_IO);return ret;
}static void __exit hx1838_exit(void)
{free_irq(gpio_to_irq(HX1838_IO), NULL);gpio_free(HX1838_IO);
}module_init(hx1838_init);
module_exit(hx1838_exit);MODULE_LICENSE("GPL");

Makefile文件

obj-m += irda.o 
KDIR:=/home/asensing/loongson/linux-4.19
ARCH=loongarch 
CROSS_COMPILE=loongarch64-linux-gnu-
PWD?=$(shell pwd) 
all:make -C $(KDIR) M=$(PWD) modules 

构建脚本

export PATH=$PATH:/home/asensing/loongson/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1/bin
make -j8
# loongarch64-linux-gnu-gcc test.c -o test
FILE=$PWD/$(basename $PWD).ko
scp $FILE root@192.168.137.232:/home/root

实验效果

装载驱动模块,然后在红外遥控器下按下按键,可以看到打印的红外解码数据:地址及其反码,数据及其反码

在这里插入图片描述

参考

本次代码根据51单片机程序移植:HX1838红外无线遥控模块51单片机程序 - 51单片机 (51hei.com)

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

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

相关文章

部署最新版本elasticsearch 8.14.1和 kibana 8.14.1

部署最新版的elasticsearch和kibana&#xff0c;前提时已经部署docker 设置用户密码 export ELASTIC_PASSWORD"<ES_PASSWORD>" # 设置elastic用户密码 export KIBANA_PASSWORD"<KIB_PASSWORD>" # 设置kibana_system密码创建docker网络 保…

实用的网站

前端 精简CSS格式 Font Awesome 图标库 BootCDN 加速服务 LOGO U钙网 AI AI工具集 视频下载 B站视频解析下载

2023-2024华为ICT大赛中国区 实践赛网络赛道 全国总决赛 理论部分真题

Part1 数通模块(10题)&#xff1a; 1、如图所示&#xff0c;某园区部署了IPv6进行业务测试&#xff0c;该网络中有4台路由器&#xff0c;运行OSPFv3实现网络的互联互通&#xff0c;以下关于该OSPFv3网络产生的LSA的描述&#xff0c;错误的是哪一项?(单选题) A.R1的LSDB中将存在…

Appium adb 获取appActivity

方法一&#xff08;最简单有效的方法&#xff09; 通过cmd命令&#xff0c;前提是先打开手机中你要获取包名的APP adb devices -l 获取连接设备详细信息 adb shell dumpsys activity | grep mFocusedActivity 有时获取到的不是真实的Activity 方法二 adb shell monkey -p …

【瑞吉外卖 | day01】项目介绍+后台登录退出功能

文章目录 瑞吉外卖 — day011. 所需知识2. 软件开发整体介绍2.1 软件开发流程2.2 角色分工2.3 软件环境 3. 瑞吉外卖项目介绍3.1 项目介绍3.2 产品原型展示3.3 技术选型3.4 功能架构3.5 角色 4. 开发环境搭建4.1 数据库环境搭建4.2 Maven项目构建 5. 后台系统登录功能5.1 创建需…

会声会影2024破解版下载 让视频编辑更简单、更有趣

在数字时代&#xff0c;视频已经成为我们生活中不可或缺的一部分。无论是记录生活、分享快乐&#xff0c;还是宣传产品、传递信息&#xff0c;视频都扮演着重要的角色。然而&#xff0c;对于很多人来说&#xff0c;视频编辑却是一个让人望而却步的领域。复杂的软件操作、繁琐的…

容器安全:等保合规性的基石

随着云计算和微服务架构的蓬勃发展&#xff0c;容器技术已经成为现代IT基础设施不可或缺的一部分。在网络安全等级保护制度&#xff08;等保&#xff09;的框架下&#xff0c;容器安全的要求日益凸显&#xff0c;成为等保合规性的基石。本文将深入探讨容器安全在等保中的重要性…

【kneighborsclassifier 函数及其参数介绍】

文章目录 一、kneighborsclassifier是什么&#xff1f;二、使用步骤三、kneighborsclassifier函数及其参数详解1. 参数说明 一、kneighborsclassifier是什么&#xff1f; kneighborsclassifier 是 scikit-learn 库中 K-近邻算法的实现&#xff0c;用于分类任务。KNN 算法的基本…

爽!强化学习+注意力机制,吞吐量提升了10多倍!

通过引入注意力机制&#xff0c;强化学习模型不仅能够更加高效地处理复杂的环境和任务&#xff0c;还能在学习和决策过程中实现更高的精度和适应性。 因此这种结合迅速成为了各大领域的研究热点&#xff0c;而且已经在实际应用中有了显著的性能提升。比如分散式强化学习框架SA…

在嵌入式商用里面哪款RTOS(实时操作系统)比较多人用?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 传统的RTOS和嵌入式Linu…

JWT原理与在身份验证中的应用

JWT原理与在身份验证中的应用 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨JWT&#xff08;JSON Web Token&#xff09;的原理及其在身份验证中的广泛应用。 JWT简介 JWT是一种…

Qt中使用MySQL数据库详解,好用的模块类封装

本文将详细介绍如何在Qt应用程序中集成MySQL数据库&#xff0c;并封装实现好用的mysql数据库操作类。包括环境准备、连接数据库、执行查询及异常处理等关键步骤&#xff0c;同时包含mysql驱动的编译。分享给有需要的小伙伴&#xff0c;喜欢的可以点击收藏。 目录 环境准备 项…

javaSE期末练习题

文章目录 前言一、程序控制1.顺序结构问题描述解题思路题解 2.选择结构2.1 题1问题描述解题思路题解 2.1 题2问题描述解题思路题解 3.循环结构3.1 阶乘的求取问题描述解题思路题解 3.2 水仙花数问题描述解题思路题解 二、数组三、类与对象1.类与对象1.1圆类问题描述解题思路题解…

从云原生视角看 AI 原生应用架构的实践

本文核心观点&#xff1a; 基于大模型的 AI 原生应用将越来越多&#xff0c;容器和微服务为代表的云原生技术将加速渗透传统业务。API 是 AI 原生应用的一等公民&#xff0c;并引入了更多流量&#xff0c;催生企业新的生命力和想象空间。AI 原生应用对网关的需求超越了传统的路…

使用myCobot和OAK-D OpenCV DepthAI摄像头制作一个可以在眼前始终享受视频的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

电脑文件自动备份:构建坚不可摧的数据防护网

在数字化浪潮的推动下&#xff0c;电脑已成为我们日常生活和工作中不可或缺的一部分&#xff0c;它承载着海量的个人信息、工作文档、学习资料等重要数据。然而&#xff0c;随着数据量的不断膨胀&#xff0c;数据安全问题也日益严峻。硬盘故障、系统崩溃、病毒攻击、人为误操作…

Echarts-仪表盘

1.案例一 1.1代码 option = {"series": [{"type": "gauge", "startAngle": 180, "endAngle": 0, "min": 0, "max": 100, "radius": "100%","center": ["50%"…

【中项第三版】系统集成项目管理工程师 | 第 2 章 信息技术发展

前言 第2章对应的内容大概率仅考察选择题&#xff0c;通读教程&#xff0c;速战速决。选择题分值预计在2-5分&#xff0c;属于必考的知识点。 2.1 信息技术及其发展 信息技术是在信息科学的基本原理和方法下的关于一切信息的产生、信息的传输、信息的发送、信息的接收等应用技…

Python中函数参数的传递技巧

刚开始接触Python时&#xff0c;你可能会因为函数参数传递的问题而感到困惑。理解位置参数和关键字参数的区别&#xff0c;并学会如何限定参数传递方式&#xff0c;可以帮助你有效避免常见的错误。 在这篇文章中&#xff0c;我们将介绍一种特殊的语法——使用斜杠&#xff08;…

2Python的Pandas:读取数据

1.读取Excel文件 1.1.读取数据 import pandas as pd# Excel 文件的 URL 或本地路径 url "https://www.gairuo.com/file/data/dataset/team.xlsx"# 使用 Pandas 的 read_excel 函数读取数据 try:df pd.read_excel(url)print(df.head()) # 打印 DataFrame 的前几行…