嵌入式驱动开发详解11(INPUT子系统)
文章目录
- 前言
- input子系统简介
- 主要结构体
- API函数
- input子系统驱动框架
- 上报事件
- 后续
- 设备树配置方式
- 参考文献
前言
按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input 子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了 input 框 架,用户只需要负责上报输入事件,比如按键值、坐标等信息,input 核心层负责处理这些事件。
input子系统简介
input 就是输入的意思,因此 input 子系统就是管理输入的子系统,和 pinctrl、gpio 子系统 一样,都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息, 鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心 应用层的事情,我们只需要按照要求上报这些输入事件即可。为此 input 子系统分为 input 驱动 层、input 核心层、input 事件处理层,最终给用户空间提供可访问的设备节点,input 子系统框 架如图 58.1.1.1 所示:
主要结构体
- 由drivers/input/input.c 这个文件内容可知,系统启动以后就会在/sys/class 目录下有一个 input 子 目录,input 子系统的所有设备主设备号都为 13,我们在使用 input 子系统处理输入设备 的时候就不需要去注册字符设备了,我们只需要向系统注册一个 input_device 即可。
input_dev 结构体表示 input 设备,此结构体定义在 include/linux/input.h 文件中。
evbit 表示输入事件类型,可选的事件类型定义在 include/uapi/linux/input.h 文件中,keybit、relbit 等等都是存放不同事件对应的值。struct input_dev { const char *name; const char *phys; const char *uniq; struct input_id id; unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)]; unsigned long evbit[BITS_TO_LONGS(EV_CNT)]; /* 事件类型的位图 */ unsigned long keybit[BITS_TO_LONGS(KEY_CNT)]; unsigned long relbit[BITS_TO_LONGS(REL_CNT)]; unsigned long absbit[BITS_TO_LONGS(ABS_CNT)]; unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)]; unsigned long ledbit[BITS_TO_LONGS(LED_CNT)]; unsigned long sndbit[BITS_TO_LONGS(SND_CNT)]; unsigned long ffbit[BITS_TO_LONGS(FF_CNT)]; unsigned long swbit[BITS_TO_LONGS(SW_CNT)]; …… }
- Linux 内核使用 input_event 这个结构体来表示所有的输入事件,input_envent 结构体定义在 include/uapi/linux/input.h 文件中,结构体内容如下:
time:时间结构体,里面有tv_sec 和 tv_usec 两个成员变量都为 long 类型。struct input_event { struct timeval time; __u16 type; __u16 code; __s32 value; };
type:事件类型,比如 EV_KEY,表示此次事件为按键事件,此成员变量为 16 位。
code:事件码,比如在 EV_KEY 事件中 code 就表示具体的按键码,如:KEY_0、KEY_1 等等这些按键。此成员变量为 16 位。
value:值,比如 EV_KEY 事件中 value 就是按键值,表示按键有没有被按下。
API函数
在编写 input 设备驱动的时候我们需要先申请一个 input_dev 结构体变量,使用 input_allocate_device 函数来申请一个 input_dev,此函数原型如下所示:
struct input_dev *input_allocate_device(void)
注销的 input 设备的话需要使用 input_free_device 函数来释放掉前面申请到的 input_dev,input_free_device 函数原型如下:
void input_free_device(struct input_dev *dev)
申请好一个 input_dev 以后就需要初始化这个 input_dev,需要初始化的内容主要为事件类 型(evbit)和事件值(keybit)这两种。input_dev 初始化完成以后就需要向 Linux 内核注册 input_dev 了,需要用到 input_register_device 函数,此函数原型如下:
int input_register_device(struct input_dev *dev)
注销 input 驱动的时候也需要使用 input_unregister_device 函数来注销掉前面注册 的 input_dev,input_unregister_device 函数原型如下:
void input_unregister_device(struct input_dev *dev)
input子系统驱动框架
struct input_dev *inputdev; /* input 结构体变量 */
/* 驱动入口函数 */
static int __init xxx_init(void) {
......
inputdev = input_allocate_device(); /* 申请 input_dev */
inputdev->name = "test_inputdev"; /* 设置 input_dev 名字 */ /*********第一种设置事件和事件值的方法***********/
__set_bit(EV_KEY, inputdev->evbit); /* 设置产生按键事件 */
__set_bit(EV_REP, inputdev->evbit); /* 重复事件 */
__set_bit(KEY_0, inputdev->keybit); /*设置产生哪些按键值 */
/*********第二种设置事件和事件值的方法***********/
keyinputdev.inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
keyinputdev.inputdev->keybit[BIT_WORD(KEY_0)] |= BIT_MASK(KEY_0);
/*********第三种设置事件和事件值的方法***********/
keyinputdev.inputdev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_REP);
input_set_capability(keyinputdev.inputdev, EV_KEY, KEY_0);
/* 注册 input_dev */
input_register_device(inputdev);
......
return 0;
}
/* 驱动出口函数 */
static void __exit xxx_exit(void){input_unregister_device(inputdev); /* 注销 input_dev */ input_free_device(inputdev); /* 删除 input_dev */
}
上报事件
-
input_event 函数用于上报指定的事件以及对应的值,函数原型如下:
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
函数参数和返回值含义如下:
dev:需要上报的 input_dev。
type: 上报的事件类型,比如 EV_KEY。
code:事件码,也就是我们注册的按键值,比如 KEY_0、KEY_1 等等。
value:事件值,比如 1 表示按键按下,0 表示按键松开。 -
Linux 内核也提供了其他的针对具体事件的上报函数,这些函数其实都用到了 input_event 函数。比如上报按键所使用的 input_report_key 函数,上传坐标用到的input_report_abs函数等等。
-
我们上报事件以后还需要使用 input_sync 函数来告诉 Linux 内核 input 子系统上报结束, input_sync 函数本质是上报一个同步事件,此函数原型如下所示:
void input_sync(struct input_dev *dev)
此处所上报的信息会以前面所提到的 input_event 结构体类型进行上传。
后续
这里只讲解了有关 input 子系统相关的结构体和注册API函数以及上报API函数,具体的例程实现没有分析,有关将 input 框架和上报结合起来使用的代码可参照参考文献中所提到的正点原子例程,因为本人是直接通过设备树配置的方式实现按键的上报的。
设备树配置方式
-
使能内核驱动
Linux 内核自带的 KEY 驱动文件为 drivers/input/keyboard/gpio_keys.c,gpio_keys.c 采用了 platform 驱动框架,在 KEY 驱动上使用了 input 子系统实现。
-
要使用 Linux 内 核 自 带 的 按 键 驱 动 程 序 很 简 单 , 只 需 要 根 据 Documentation/devicetree/bindings/input/gpio-keys.txt 这个文件在设备树中添加指定的设备节点 即可,节点要求如下:
①、节点名字为“gpio-keys”。
②、gpio-keys 节点的 compatible 属性值一定要设置为“gpio-keys”。
③、所有的 KEY 都是 gpio-keys 的子节点,每个子节点可以用如下属性描述自己:
gpios:KEY 所连接的 GPIO 信息。
interrupts:KEY 所使用 GPIO 中断信息,不是必须的,可以不写。
label:KEY 名字 linux,code:KEY 要模拟的按键。
④、如果按键要支持连按的话要加入 autorepeat。gpio-keys{ compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; autorepeat; key0 {label = "GPIO Key Enter";linux,code = <KEY_ENTER>;gpios = <&gpio1 18 GPIO_ACTIVE_LOW>; };
-
重新移植内核和设备树后即可让按键实现跟Enter键一样的效果。系统启 动以后查看/dev/input 目录,可以看出存在 event1 这个文件,这个文件就是 KEY 对应的设备文件,使用 hexdump 命令来查看/dev/input/event1 文件,输入如下命令终端即可出现下图所示的效果:
hexdump /dev/input/event1
参考文献
- 个人专栏系列文章
- 正点原子嵌入式驱动开发指南
- 对代码有兴趣的同学可以查看链接https://github.com/NUAATRY/imx6ull_dev
相关文章:
嵌入式驱动开发详解11(INPUT子系统)
文章目录 前言input子系统简介主要结构体API函数input子系统驱动框架上报事件后续设备树配置方式参考文献 前言 按键、鼠标、键盘、触摸屏等都属于输入(input)设备,Linux 内核为此专门做了一个叫做 input 子系统的框架来处理输入事件。输入设备本质上还是字符设备&…...
动态规划解决目标和问题
代码随想录链接:代码随想录 思路: 可以将数组分为两部分,其中一部分记作left,其中数字的符号全为,而另外一部分记作right,其中数字的符号全为-。这里全为-的意思不是真正的符号为-,而表示这一堆数字在计算时取值为负 因此有如下…...
【漏洞分析】UDF提权漏洞——CVE-2016-6662-MySQL ‘malloc_lib’变量重写命令执行
0x00 前言 最近在做渗透笔记,其中有一个靶机在getshell后,需要进行提权。发现靶机使用root启动的mysql服务,那么尝试使用UDF提权。于是在提权成功后,花了一天时间特意搜了一下整个UDF提权的漏洞原理和利用,加深理解。…...
特种设备安全管理人员免费题库限时练习(判断题)
56.(判断题)特别重大事故、重大事故、较大事故和一般事故,负责事故调查的人民政府应当自收到事故调查报告之日起15日内做出批复。 A.正确 B.错误 答案:错误 57.(判断题)每一类事故灾难的应急救援措施可能千差万别,因此其基本应急模式是不一致的。 A.正确 B.错误 答案:错…...
linux-25 文件管理(三)复制、移动文件,cp,mv
命令cp是copy的简写,而mv则是move的简写。那既然copy是用于实现复制文件的,那通常一般我们要指定其要复制的是谁?而且复制完以后保存在什么地方,对吧?那因此它的使用格式很简单,那就是cp srcfile dest&…...
中国科技统计年鉴EXCEL版(2021-2023年)-社科数据
中国科技统计年鉴EXCEL版(2021-2023年)-社科数据https://download.csdn.net/download/paofuluolijiang/90028724 https://download.csdn.net/download/paofuluolijiang/90028724 中国科技统计年鉴提供了从2021至2023年的详尽数据,覆盖了科技…...
Idea(中文版) 项目结构/基本设置/设计背景
目录 1. Idea 项目结构 1.1 新建项目 1.2 新建项目的模块 1.3 新建项目模块的包 1.4 新建项目模块包的类 2. 基本设置 2.1 设置主题 2.2 设置字体 2.3 设置注释 2.4 自动导包 2.5 忽略大小写 2.6 设置背景图片 3. 项目与模块操作 3.1 修改类名 3.2 关闭项目 1. I…...
jenkins入门--安装jenkins
下载地址https://www.jenkins.io/ jdk 安装 :Jenkins需要安装对应版本的jdk,我在安装过程中显示需要21,17 Java Downloads | Oracle jenkins安装过程参考全网最清晰Jenkins安装教程-windows_windows安装jenkins-CSDN博客 安装完成后,浏览器输入127.0.…...
基于Springboot + vue实现的小型养老院管理系统
🥂(❁◡❁)您的点赞👍➕评论📝➕收藏⭐是作者创作的最大动力🤞 💖📕🎉🔥 支持我:点赞👍收藏⭐️留言📝欢迎留言讨论 🔥🔥&…...
shell基础使用及vim的常用快捷键
一、shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 / b in/ b a s h ,流行的shell…...
Mac 安装psycopg2出错:Error:pg_config executable not found的解决
在mac 上执行pip3 install psycopg2-binary出现如下错误: Error:pg_config executable not found然后我又到终端里执行 brew install postgresql16 显示 Warning: You are using macOS 15. We do not provide support for this pre-release version. It is expe…...
UniApp | 从入门到精通:开启全平台开发的大门
UniApp | 从入门到精通:开启全平台开发的大门 一、前言二、Uniapp 基础入门2.1 什么是 Uniapp2.2 开发环境搭建三、Uniapp 核心语法与组件3.1 模板语法3.2 组件使用四、页面路由与导航4.1 路由配置4.2 导航方法五、数据请求与处理5.1 发起请求5.2 数据缓存六、样式与布局6.1 样…...
Kafka3.x KRaft 模式 (没有zookeeper) 常用命令
版本号:kafka_2.12-3.7.0 说明:如有多个地址,用逗号分隔 创建主题 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1删除主题 bin/kafka-topics.sh --delete --boots…...
【竞技宝】CS2:NertZ离队Liquid光速加盟!
2025年1月7日,目前CS2的赛事正处于空窗期中,很多队伍在近期都在进行阵容上的调整,其中出现了很多震惊观众的转会消息。今日凌晨,HEROIC官宣队内的NertZ选手正式离队,此后Liquid很快发布消息宣布了NertZ的加盟。 今日凌…...
PDFMathTranslate: Star13.8k,一款基于AI的PDF文档全文双语翻译PDF文档全文双语翻译,保留格式神器,你应该需要它
嗨,大家好,我是小华同学,关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 PDFMathTranslate是一个开源项目,旨在为用户提供便捷的PDF科学论文翻译解决方案。它不仅能够翻译文本,还能保留公式、图表、目…...
滑动窗口——最小覆盖子串
一.题目描述 76. 最小覆盖子串 - 力扣(LeetCode) 二.题目解析 题目还是很好理解的,就是在字符串s中找到一个子串,该子串包含字符串t的所有字符。返回最短的子串。如果s中不包含这样的子串就返回一个空串。 需要注意的是&#…...
2012mfc,几种串
串,即是由符组成的串,在标准C,标准C,MFC中串这一功能的实现是不相同的,C完全兼容了C. 1.标准C中的串 在标准C中没有串数据类型,C中的串是有符类型的符数组或符类型的符指针来实现的.如: char name[26]"This is a Cstyle string"; //或char *name"This is a…...
基于SpringBoot的乐器商城购物推荐系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维
Jurgen提出的Highway Networks:LSTM时间维方法应用到深度维 具体实例与推演 假设我们有一个离散型随机变量 X X X,它表示掷一枚骰子得到的点数,求 X X X 的期望。 步骤: 列出 X X X 的所有可能取值 x i x_i xi(…...
asp.net core中的 Cookie 和 Session
在 Web 开发中,用户会话管理是非常重要的,尤其是在需要保持用户状态和身份验证的应用中。ASP.NET Core 提供了多种状态管理技术,如 Cookie 和 Session,它们可以帮助你管理用户会话、存储数据并实现用户身份验证等功能。下面将详细…...
【STM32+CubeMX】 新建一个工程(STM32F407)
相关文章: 【HAL库】 STM32CubeMX 教程 1 --- 下载、安装 目录 第一部分、新建工程 第二部分、工程文件解释 第三部分、编译验证工程 友情约定:本系列的前五篇,为了方便新手玩家熟悉CubeMX、Keil的使用,会详细地截图每一步Cu…...
IO进程day1
一、思维导图...
剧本字幕自己看
Hello English learners! Welcome back to my channel! My name is Ethan, and today we’re diving into a topic we deal with every day—traffic. 大家好,英语学习者们!欢迎回到我的频道!我是Ethan,今天我们要聊一个每天都会遇到的话题——交通。 When I drive somewh…...
Java排序
Map Stream 排序 最簡單的排序方式 Map<String,String> _lineMap = _itRow.next();_lineMap = _lineMap.entrySet().stream().sorted((i1,i2)>i1.getKey().compareTo(i2.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,(e1,e2)->e…...
Geoserver修行记-后端调用WMS/WMTS服务无找不到图层Could not find layer
项目场景 调用geoserver地图服务WMS,找不到图层 我在进行地图服务调用的时候,总是提示我找不多图层 Could not find layer,重点是这个图层我明明是定义了,发布了,且还能够正常查看图层的wms的样式,但是在调用后端调用…...
JavaScript代码片段二
见过不少人、经过不少事、也吃过不少苦,感悟世事无常、人心多变,靠着回忆将往事串珠成链,聊聊感情、谈谈发展,我慢慢写、你一点一点看...... JavaScript统计文字个数、特殊字符转义、动态插入js代码、身份证验证 统计文字个数 f…...
Opencv图片的旋转和图片的模板匹配
图片的旋转和图片的模板匹配 目录 图片的旋转和图片的模板匹配1 图片的旋转1.1 numpy旋转1.1.1 函数1.1.2 测试 1.2 opencv旋转1.2.1 函数1.2.2 测试 2 图片的模板匹配2.1 函数2.2 实际测试 1 图片的旋转 1.1 numpy旋转 1.1.1 函数 np.rot90(kl,k1),k1逆时针旋转9…...
ebpf 笔记
eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能 https://zhuanlan.zhihu.com/p/712220029 eBPF技术简介 - 阅读清单 - 腾讯云开发者社区-腾讯云 从石器时代到成为“神”,一文讲透eBPF技术发展演进史 …...
C++编程基础之override关键字
在C中,override关键字用于显式地标识派生类中的成员函数是对基类中虚函数的重写,具有以下重要作用和使用说明: 作用 增强代码可读性:通过使用override关键字,能够清晰地向阅读代码的人表明该函数是有意重写基类中的虚…...
自动化之数据库:docker部署mongo,为下一步的使用打下基础
以下是一个详细的Docker Compose配置示例,用于设置一个包含三个节点的MongoDB副本集,并确保安全性(使用账号密码进行认证)。所有节点都将设置在同一个Docker网络( py-mongo )下,以便于未来的扩…...
VR+智慧消防一体化决策平台
随着科技的飞速发展,虚拟现实(VR)技术与智慧城市建设的结合越来越紧密。在消防安全领域,VR技术的应用不仅能够提升消防训练的效率和安全性,还能在智慧消防一体化决策平台中发挥重要作用。本文将探讨“VR智慧消防一体化…...
新能源网站提升用户体验的关键
新能源网站的用户体验对于吸引和留住访问者至关重要。一个优秀的用户体验可以增加用户的满意度,提高他们对网站的忠诚度。在设计新能源网站时,关键在于简洁明了的界面和易于导航的布局。用户应该能够轻松找到他们需要的信息,而不会感到困惑或…...
【12_多数元素】
问题 给定一个大小为 n 的数组 nums ,返回其中的多数元素。 多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。 思路 使用摩尔投票算法来解决。该算法的基本思想是维护一个候选人和一个…...
深入理解 Android 中的 ActivityInfo
深入理解 Android 中的 ActivityInfo 在 Android 开发中,ActivityInfo 是一个非常重要的类,它包含了关于 Activity 的元信息。这些信息通常是从 AndroidManifest.xml 文件中提取的,开发者可以通过 ActivityInfo 类来获取和操作这些信息。本文…...
【通识安全】煤气中毒急救的处置
1.煤气中毒的主要症状与体征一氧化碳中毒,其中毒症状一般分为轻、中、重三种。 (1)轻度:仅有头晕、头痛、眼花、心慌、胸闷、恶心等症状。如迅速打开门窗,或将病人移出中毒环境,使之吸入新鲜空气和休息,给些热饮料&am…...
windows从0开始配置llamafactory微调chatglm3-6b
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、准备工作1、创建python虚拟环境(annoconda)2、配置pytorch傻瓜版3、llamafactory配置4、微调数据准备 一、准备工作 1、创建python虚拟环境(annoconda) 本篇文…...
IM-Magic Partition Resizer(分区调整软件) v7.5.0 多语便携版
IM-Magic Partition Resizer是一款功能强大的分区调整软件,允许用户调整并重新分配硬盘分区空间,从而在不丢失数据的情况下改变分区的大小和位置。 软件功能 支持调整和重新分配硬盘分区的空间大小。能够将分区扩大或缩小而不会导致数据丢失。可以改变分…...
matlab中高精度计算函数vpa与非厄米矩阵本征值的求解
clear;clc;close all tic %并行设置% delete(gcp(nocreate));%关闭之前的并行 cparcluster(local); c.NumWorkers50;%手动设置线程数(否则默认最大线程为12) parpool(c, c.NumWorkers); %并行设置%w1; u2.5;N30;valstozeros(2*N2,100); v10linspace(-3,3,100).;parfor jj1:leng…...
流程图(四)利用python绘制漏斗图
流程图(四)利用python绘制漏斗图 漏斗图(Funnel Chart)简介 漏斗图经常用于展示生产经营各环节的关键数值变化,以较高的头部开始,较低的底部结束,可视化呈现各环节的转化效率与变动大小。一般重…...
Elasticsearch:索引mapping
这里写目录标题 一、介绍二、动态mapping三、mapping属性(1)analyzer(分析器)(2) coerce(强制类型转换)(3)copy_to(合并参数) 一、介绍 二、动态mapping 三…...
AI赋能跨境电商:魔珐科技3D数字人破解出海痛点
跨境出海进入狂飙时代,AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节,迎来了发展的高光时刻。生成式AI时代的大幕拉开,AI工具快速迭代,为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…...
计算机网络之---信号与编码
信号 在物理层,信号是用来传输比特流的物理量,它可以是电压、电流、光强度等形式,通常通过电缆、光纤或者无线信道等媒介传播。 信号主要分为以下两种类型: 模拟信号(Analog Signal):信号在时间…...
腾讯云AI代码助手编程挑战赛-FinChat
作品简介 FinChat 是一款极具创新性的智能股票分析工具,依托国内顶尖大语言模型打造而成。它专为日常忙碌、无暇顾及金融市场,却又手握闲钱渴望投资的人群量身定制。核心功能包括: 自动剖析股票数据:迅速生成深度专业研报。实时…...
2025年PMP考试最新报名通知
经PMI和中国国际人才交流基金会研究决定,中国大陆地区2025年第一期PMI认证考试定于3月15日举办。在基金会网站报名参加本次PMI认证考试的考生须认真阅读下文,知悉考试安排及注意事项,并遵守考试有关规定。 一、时间安排 (一&#…...
蓝凌EIS智慧协同平台 fi_message_receiver.aspx SQL注入漏洞复现(CVE-2025-22214)
0x01 产品简介 蓝凌EIS智慧协同平台是一款专为成长型企业打造的沟通、协同、社交的移动办公平台,旨在提升企业内部沟通、协作和信息共享的效率。该平台集成了各种协同工具和功能,全面满足企业的办公需求。具体来说,它覆盖了审批、流程、财务、行政、人事、客户等全在线业务…...
我用AI学Android Jetpack Compose之入门篇(2)
我跑成功了第一个Compose应用,但我还是有很多疑问,请人工智能来解释一下吧。答案来自 通义千问 文章目录 1.请解释一下Compose项目的目录结构。根目录模块目录(通常是app)app/build.gradleapp/src/mainapp/src/main/uiapp/src/ma…...
确认2D Tilemap Editor安装后仍然没有基础的Tile
Create > 2D 新建里面什么Tile类型都有,就是没有最基础的Tile。 在Assets文件夹中,点击右键 > Create > C# Script,新建一个脚本,代码内容复制粘贴进去 using UnityEngine; using UnityEngine.Tilemaps;[CreateAssetMe…...
flutter 独立开发之笔记
1、# use: - [flutter_launcher_icons:] 每次修改完icon后,都需要执行一遍 dart run flutter_launcher_icons 2、开启混淆并打包apk flutter build apk --obfuscate --split-debug-info./out/android/app.android-arm64.symbols 3、开启windows支持 flutter con…...
234.回文链表
234.回文链表 思路1:双指针 1.一次遍历记录链表的值到数组中 2.数组头尾双指针开始判断 复杂度: 时间O(n),空间O(n) 代码: class Solution { public:bool isPalindrome(ListNode* head) {vector<int>nums;while(head){nums.push…...
02、Redis的安装与配置
一、安装配置CentOS7 第一步:安装虚拟机 这个步比较简单,直接安装好VMware和使用CentOS7的镜像安装操作系统 相关资源如果有需要可以在如下位置下载: VMare虚拟机:VMare工具 CentOS7镜像:CentOS7镜像 JDK17_linux-x64:JDK17_linux-x64 linux服务器连接工具:MobaX…...