【驱动篇】龙芯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.mfbz.cn/a/766148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode语言模式

1.背景 写vue3ts项目的时候&#xff0c;用到了volar插件&#xff0c;在单文件使用的时候&#xff0c;鼠标悬浮在代码上面会有智能提示&#xff1b; 但是最近volar插件提示被弃用了&#xff0c;然后我按照它的官方提示&#xff0c;安装了Vue-official扩展插件&#xff0c;但是…

Vue3 特点以及优势-源码解剖

Vue3 特点以及优势-Vue3.4源码解剖 Vue3 特点以及优势 1.声明式框架 命令式和声明式区别 早在 JQ 的时代编写的代码都是命令式的&#xff0c;命令式框架重要特点就是关注过程声明式框架更加关注结果。命令式的代码封装到了 Vuejs 中&#xff0c;过程靠 vuejs 来实现 声明式代…

剑神诀_单机架设_无需虚拟机_小白专用

前言 今天给大家带来一款单机游戏的架设&#xff1a;剑神诀&#xff0c;一键端 无需虚拟机 如今市面上的资源参差不齐&#xff0c;大部分的都不能运行&#xff0c;本人亲自测试&#xff0c;运行视频如下&#xff1a; 剑神诀 搭建教程 此游戏架设不需要安装虚拟机&#xff0c;…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie&#xff0c;网络爬虫是一种自动化程序&#xff0c;用于在互联网上收集信息并进行索引&#xff0c;这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统&#xff1a;Windows10系统、Dell G3电脑。 “爬虫…

SpringBoot 项目整合 MyBatisPlus 框架,附带测试示例

文章目录 一、创建 SpringBoot 项目二、添加 MyBatisPlus 依赖三、项目结构和数据库表结构四、项目代码1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisPlusTest 五、浏览器测试…

新鲜出炉!恭喜这 5 位同学中选 NebulaGraph 社区 2024 开源之夏项目!

开源之夏是中国科学院软件研究所发起的“开源软件供应链点亮计划”系列暑期活动&#xff0c;旨在鼓励高校学生积极参与开源软件的开发维护&#xff0c;促进优秀开源软件社区的蓬勃发展。活动联合各大开源社区&#xff0c;针对重要开源软件的开发与维护提供项目开发任务&#xf…

stm32学习笔记---USART串口外设(理论部分)

目录 USART简介 USART的框图 串口的引脚 USART的基本结构 数据帧 起始位侦测 数据采样 波特率发生器 USD转串口模块的原理图 声明&#xff1a;本专栏是本人跟着B站江科大的视频的学习过程中记录下来的笔记&#xff0c;我之所以记录下来是为了方便自己日后复习。如果你…

个人微信二次开发

​ 由于自身在机器人方面滚爬多年&#xff0c;现在收藏几个宝藏机器人 推荐一下自己常用的机器人&#xff1a; 适合有技术开发的公司&#xff0c;可以自主开发所需要的功能&#xff01;十分齐全 测试问文档&#xff1a;https://www.wkteam.cn/ 有需要的兄弟可以看一下&#…

手写一个基于SpringBoot的MVC架构,默认实现CRUD和导入导出功能

文章目录 前言正文一、项目结构二、技术点三、部分核心代码3.1 core-tool 中的核心代码3.1.1 所有实体的通用父类 SuperEntity3.1.2 所有枚举的父接口 BaseEnum3.1.3 所有业务异常的父接口 BaseException 3.2 mvc-tool 中的核心代码3.2.1 CrudController 接口定义3.2.2 默认的C…

手写一个类似@RequestParam的注解(用来接收请求体的参数)

一、本文解决的痛点 按照大众认为的开发规范&#xff0c;一般post类型的请求参数应该传在请求body里面。但是我们有些post接口只需要传入一个字段&#xff0c;我们接受这种参数就得像下面这样单独创建一个类&#xff0c;类中再添加要传入的基本类型字段&#xff0c;配合Reques…

清爽一夏,羊大师伴你健康运动,引领活力生活!

在这个绚烂多彩的夏日&#xff0c;让我们携手踏上一段清爽与健康并行的旅程。阳光炽热&#xff0c;万物生长&#xff0c;正是释放活力、追求健康的最佳时节。“清爽一夏&#xff0c;健康运动引领活力生活&#xff01;”这不仅是一句口号&#xff0c;更是我们向美好生活发出的诚…

模电-运放的供电

模电-运放的供电 Fang XS.1452512966qq.com如果有错误&#xff0c;希望被指出&#xff0c;学习技术的路难免会磕磕绊绊量的积累引起质的变化注&#xff1a;本文章为唐老师讲电赛视频的个人笔记 运放的供电 所有的运放都可以单电源和双电源供电&#xff1b;采用双电源供电的运…

Linux_fileio实现copy文件

参考韦东山老师教程&#xff1a;https://www.bilibili.com/video/BV1kk4y117Tu?p12 目录 1. 通过read方式copy文件2. 通过mmap映射方式copy文件 1. 通过read方式copy文件 copy文件代码&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <…

012-GeoGebra基础篇-构造圆的切线

前边文章对于基础内容已经悉数覆盖了&#xff0c;这一篇我就不放具体的细节&#xff0c;若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…

Java日期时间

java.util包提供Date类&#xff0c;该类有两个构造函数&#xff1a; Date()使用当前日期和时间初始化对象Date(long millisec)从1970年1月1日起的毫秒数 获取当前日期时间 import java.util.Date;public class DateDemo{public static void main(String[] args){//初始化Date…

开发笔记:vue3+ts+vant 卡片数据分页,下拉加载,卡片左滑可删除

效果&#xff1a; 实现 使用vantui组件 van-swipe-cell van-card &#xff08;商品卡片&#xff09; 核心代码 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

Java 微信小程序自建平台开发票保存到微信卡包

Java 微信小程序自建平台开发票保存到微信卡包 1 获取Access token2 获取自身的开票平台识别码3 设置商户联系方式4 获取授权页ticket5 获取授权页链接6 小程序打开授权页7 收取授权完成事件推送8 创建发票卡券模板9 上传PDF10 将电子发票卡券插入用户卡包 1 获取Access token …

shopify后台设置为中文

shopify官网&#xff1a;https://link.juejin.cn/?targethttps%3A%2F%2Fshopify.dev%2F 1、点击右上角头像 2、选择个人资料 3、找到Language设置 开发者 1、创建开发商店 2、 3、点击左侧导航在线商店&#xff0c;点击右上角查看你的商店。在线商店链接为https://[商店名…

RK3568驱动指南|第十五篇 I2C-第181章使用GPIO模拟I2C驱动

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

阿里云再次突发故障,高可用形同虚设?

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…