当前位置: 首页 > news >正文

rk3288-android8-IR-mouse

IR问题:

mouse按键使用不了

然后排查:

1.排查上报

	ir_key6{ rockchip,usercode = <0xbf00>;rockchip,key_table =<0xff KEY_POWER>,<0xfe KEY_MUTE>,		<0xfd KEY_1>, <0xfc KEY_2>, <0xfb KEY_3>, <0xfa KEY_4>, <0xf9 KEY_5>, <0xf8 KEY_6>,<0xf7 KEY_7>, <0xf6 KEY_8>, <0xf5 KEY_9>, <0xf3 KEY_0>,		<0xb5 KEY_CHANNELUP>,      //pin+<0xb4 KEY_CHANNELDOWN>, //pin-			<0xb7 KEY_VOLUMEUP>,<0xb6 KEY_VOLUMEDOWN>,		<0x9e KEY_HOME>,		<0xec KEY_UP>,<0xeb KEY_DOWN>,<0xee KEY_LEFT>,<0xed KEY_RIGHT>,	<0xef  KEY_ENTER>,//KEY_ENTER>,   <0xe8 KEY_ENTER>,//KEY_ENTER>, <0xe9   KEY_MENU>,	<0xbf KEY_SCREENLOCK>,//mouse switch	pinxian<0xf0 388>,//mouse switch	xinhao	<0xea KEY_BACK>,	<0xae KEY_PLAYPAUSE>, <0xb2 KEY_CLOSE>, 	//3d	<0xad KEY_STOPCD>,	<0xa9 KEY_REWIND>, <0xa8 KEY_FASTFORWARD>, <0xab KEY_PREVIOUSSONG>,<0xaa KEY_NEXTSONG>; };	

可以知道<0xf0 388>,使我们这个博客的主角

//插播一下,IR就三个引脚,检查硬件接好后按动遥控器

echo 1 > /sys/module/rockchip_pwm_remotectl/parameters/code_print

可以在串口打印上看到键码值

rk3288:/ # cat proc/kmsg
<6>[  753.280233] USERCODE=0xbf00
<6>[  753.307258] RMC_GETDATA=ec

然后先获取到你的遥控器的CODE值和键码值

这时候硬件是好的

然后,

rk3288:/ # getevent
add device 1: /dev/input/event2name:     "rk29-keypad"
add device 2: /dev/input/event1name:     "SIGMACHIP Usb Mouse"
add device 3: /dev/input/event0name:     "ff680020.pwm"
/dev/input/event0: 0001 0067 00000001
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0001 0067 00000000
/dev/input/event0: 0000 0000 00000000
^C
130|rk3288:/ #
130|rk3288:/ # getevent -l
add device 1: /dev/input/event2name:     "rk29-keypad"
add device 2: /dev/input/event1name:     "SIGMACHIP Usb Mouse"
add device 3: /dev/input/event0name:     "ff680020.pwm"
/dev/input/event0: EV_KEY       KEY_UP               DOWN
/dev/input/event0: EV_SYN       SYN_REPORT           00000000
/dev/input/event0: EV_KEY       KEY_UP               UP
/dev/input/event0: EV_SYN       SYN_REPORT           00000000

"ff680020.pwm"这个是映射表

#$_FOR_ROCKCHIP_RBOX_$
#$_rbox_$_modify_$_chenzhi_20120220: add for IR remotekey 28    ENTER
key 116   POWER             
key 158   BACK              
key 139   MENU         
key 217   SEARCH             
key 232   DPAD_CENTER       
key 108   DPAD_DOWN         
key 103   DPAD_UP           
key 102   HOME              
key 105   DPAD_LEFT         
key 106   DPAD_RIGHT        
key 115   VOLUME_UP 
key 114   VOLUME_DOWN
key 143   NOTIFICATION      
key 113   VOLUME_MUTE
key 388   TV_KEYMOUSE_MODE_SWITCH
key 164   MEDIA_PLAY_PAUSE
key 141   SETTINGSkey 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 14    DELkey 407   MEDIA_NEXT
key 412   MEDIA_PREVIOUS#key 400   TV_MEDIA_MULT_BACKWARD
#key 401   TV_MEDIA_MULT_FORWARD
#key 402   TV_MEDIA_PLAY_PAUSE
#key 64    TV_MEDIA_PLAY
#key 65    TV_MEDIA_PAUSE
#key 66    TV_MEDIA_STOP
#key 67    TV_MEDIA_REWIND
#key 68    TV_MEDIA_FAST_FORWARD
#key 87    TV_MEDIA_PREVIOUS
#key 88    TV_MEDIA_NEXT

key 388   TV_KEYMOUSE_MODE_SWITCH

就是驱动映射到android的键值

rk3288-8.1/sdk$ grep -rnH "AKEYCODE_TV_KEYMOUSE_MODE_SWITCH" ./frameworks/
./frameworks/native/include/android/keycodes.h:777:    AKEYCODE_TV_KEYMOUSE_MODE_SWITCH = 289
./frameworks/native/services/inputflinger/InputReader.cpp:2478:    if (keyCode == AKEYCODE_TV_KEYMOUSE_MODE_SWITCH) {

android会再把TV_KEYMOUSE_MODE_SWITCH映射成AKEYCODE_TV_KEYMOUSE_MODE_SWITCH=289

然后我发现遥控按键并没有反应

然后查阅资料发现这一段是关于遥控鼠标和遥控按键

 

 查询log

374   446 D WindowManager: interceptKeyTq keycode=0 interactive=true keyguardActive=false policyFlags=22000000

发现这个按键的keycode=0

问题已经找到了,哪里回事导致=0呢

然后追查到

03-02 10:16:19.061   370   443 D InputReader: BatchSize: 2 Count: 2
03-02 10:16:19.061   370   443 D InputReader: Input event: device=3 type=0x0001 code=0x0184 value=0x00000000 when=189219995000
03-02 10:16:19.061   370   443 I InputReader: KeyboardInputMapper::processKey key= keyCode=0
03-02 10:16:19.061   370   443 I InputReader: InputDevice::process key= keyCode=388
03-02 10:16:19.062   370   443 D InputReader: Input event: device=3 type=0x0000 code=0x0000 value=0x00000000 when=189219995000
03-02 10:16:19.062   370   443 I InputReader: InputDevice::process key= keyCode=0

经过排查发现

 这里上报的code=0x0184不就是我们的键值388吗?

 

 然后我发现这里都上报到了,但是到

 到这里就变成keycode=0了,我强行吧keycode拉到289发现功能正常,果然就是这中间丢失了keycode导致的,于是我在上面设置一个变量让num作为标志位,388上报的时候让num=1;

然后keycode=0的时候判断一下是不是388的上报,如果num==1,则手动keycode=289;强行到按键值后发现功能正常;

Index: InputReader.cpp
===================================================================
--- InputReader.cpp     (revision 101)
+++ InputReader.cpp     (working copy)
@@ -89,7 +89,8 @@static const int KEYCODE_ENTER = 28;static const int KEYCODE_DPAD_CENTER = 232;
-
+static const int KEYCODE_KEYMOUSE_MODE_SWITCH = 289;
+static int num=0; // --- Static Functions ---template<typename T>
@@ -1208,6 +1209,10 @@ALOGD("Input event: device=%d type=0x%04x code=0x%04x value=0x%08x when=%lld",rawEvent->deviceId, rawEvent->type, rawEvent->code, rawEvent->value,rawEvent->when);
+               if(rawEvent->code==0x0184)
+               {
+               num=1;
+               }#endifif (mDropUntilNextSync) {
@@ -2448,7 +2453,7 @@uint32_t policyFlags;if (getEventHub()->mapKey(getDeviceId(), scanCode, usageCode, mMetaState,
-                              &keyCode, &keyMetaState, &policyFlags)) {
+                              &keyCode, &keyMetaState, &policyFlags)) {                                          keyCode = AKEYCODE_UNKNOWN;keyMetaState = mMetaState;policyFlags = 0;
@@ -2463,6 +2468,12 @@sprintf(mID,"%d",getDeviceId());property_set("sys.ID.mID",mID);+                       if(keyCode==0&&num==1)
+                       {
+                               num=0;
+                               keyCode=289;
+                       }
+if (down) {if (keyCode == AKEYCODE_TV_KEYMOUSE_MODE_SWITCH) {if (strcmp(mKeyMouseState, "on")==0) {
@@ -3760,28 +3771,8 @@newViewport.setNonDisplayViewport(rawWidth, rawHeight);}bool viewportChanged = mViewport != newViewport;
-       char value_private[PROP_VALUE_MAX];if (viewportChanged) {mViewport = newViewport;
-               property_get("persist.sys.displayrot", value_private, "0");
-               int cmpRet = atoi(value_private);
-               ALOGD("tp persist.sys.displayrot~~~~~~~~~~~~~~~~~~~~~~~~~ = %d",cmpRet);    
-               if (cmpRet == 0)    
-               {        
-                       mViewport.orientation = DISPLAY_ORIENTATION_0;
-               }  
-               else if(cmpRet == 90)    
-               {
-                       mViewport.orientation = DISPLAY_ORIENTATION_90;  
-               }
-               else if(cmpRet == 180)
-               {
-                       mViewport.orientation = DISPLAY_ORIENTATION_180;  
-               }
-               else if(cmpRet == 270)
-               {
-                       mViewport.orientation = DISPLAY_ORIENTATION_270;  
-               }if (mDeviceMode == DEVICE_MODE_DIRECT || mDeviceMode == DEVICE_MODE_POINTER) {// Convert rotated viewport to natural surface coordinates.
@@ -6380,6 +6371,8 @@mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_X, x);mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, y);mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);} else if (currentFingerCount == 0) {// Case 3. No fingers down and button is not pressed. (NEUTRAL)if (mPointerGesture.lastGestureMode != PointerGesture::NEUTRAL) {
@@ -6538,6 +6531,10 @@mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y, y);mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE,down ? 1.0f : 0.0f);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(
+                AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+        mPointerGesture.currentGestureCoords[0].setAxisValue(
+                AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);if (lastFingerCount == 0 && currentFingerCount != 0) {mPointerGesture.resetTap();
@@ -6784,6 +6781,10 @@mPointerGesture.referenceGestureX);mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_Y,mPointerGesture.referenceGestureY);
+            mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X,
+                    commonDeltaX);
+            mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y,
+                    commonDeltaY);mPointerGesture.currentGestureCoords[0].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f);} else if (mPointerGesture.currentGestureMode == PointerGesture::FREEFORM) {// FREEFORM mode.
@@ -6880,6 +6881,10 @@AMOTION_EVENT_AXIS_Y, mPointerGesture.referenceGestureY + deltaY);mPointerGesture.currentGestureCoords[i].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 1.0f);
+                mPointerGesture.currentGestureCoords[i].setAxisValue(
+                        AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);
+                mPointerGesture.currentGestureCoords[i].setAxisValue(
+                        AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);}if (mPointerGesture.activeGestureId < 0) {
@@ -7002,6 +7007,8 @@mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, y);mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_PRESSURE,hovering ? 0.0f : 1.0f);
+        mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, x);
+        mPointerSimple.currentCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, y);mPointerSimple.currentProperties.id = 0;mPointerSimple.currentProperties.toolType =mCurrentCookedState.cookedPointerData.pointerProperties[currentIndex].toolType;

 

  

大概补丁就这样,仅供参考!

相关文章:

rk3288-android8-IR-mouse

IR问题: mouse按键使用不了 然后排查: 1.排查上报 ir_key6{ rockchip,usercode <0xbf00>;rockchip,key_table <0xff KEY_POWER>,<0xfe KEY_MUTE>, <0xfd KEY_1>, <0xfc KEY_2>, <0xfb KEY_3>, <0xfa KEY_4>, <0xf9 KEY_5>…...

2023-03-01干活小计

昨天组会&#xff0c;元气大伤&#xff0c;拖更直接。今天继续&#xff0c;三月加油&#xff01; python魔术方法&#xff1a; __repr__:print()时候调用&#xff0c;注意函数返回值就是打印值。 __len__:len()时候调用 __call__:实例()时候调用 __getitem__:self[i]时候调…...

客户服务软件推荐榜:28款!

在这个竞争激烈的时代&#xff0c;做到服务对企业的存亡有着深刻的意义。改善客户服务&#xff0c;做好客户服务工作&#xff0c;是关键&#xff0c;因为客户服务团队代表着企业的形象&#xff0c;面孔&#xff0c;客户有可能 不大会记得企业的某个东西&#xff0c;但是他们将会…...

Spring注入和注解实现IOC

标题注入依赖注入的方式通过Set方法注入通过构造方法注入自动注入依赖注入的数据类型注入Bean对象注入基本数据类型和字符串注入List注入Set注入Map注入Properties注解实现IOCComponentRepository、Service、Controller注入 依赖注入的方式 在使用依赖注入时&#xff0c;如果…...

Python统计Labelme标注文件信息并绘制散点图

Python统计Labelme标注文件信息并绘制散点图前言前提条件相关介绍实验环境Python统计Labelme标注文件信息并绘制散点图前言 本文是个人使用Python处理文件的电子笔记&#xff0c;由于水平有限&#xff0c;难免出现错漏&#xff0c;敬请批评改正。更多精彩内容&#xff0c;可点击…...

远程接入方案 OpenText Exceed TurboX(ETX) 客户案例——ET Innovations

远程接入方案 OpenText Exceed TurboX&#xff08;ETX) 客户案例——ET Innovations ET Innovations GmbH 助力奥地利各地的医疗保健专业人员提升患者体验 医疗保健信息系统开发商利用 OpenText™ Exceed™ TurboX 将远程访问其软件的稳定性提高了 95% 公司&#xff1a;ET I…...

Django4.1.7通过djongo1.3.6链接mongoDB6.0.4

网上中文版的djongo链接mongoDB基本都是抄袭州的先生大哥的文章。 文章成文比较久&#xff0c;至少是2019年成文的了&#xff0c;有一些情况发生了变化&#xff0c;今天就自己测试的情况做一些记录。 本文成文日期为&#xff1a;2023年3月2日&#xff0c;请注意参考 废话不多说…...

如何使用FindFunc在IDA Pro中寻找包含指定代码模式的函数代码

关于FindFunc FindFunc是一款功能强大的IDA Pro插件&#xff0c;可以帮助广大研究人员轻松查找包含了特定程序集、代码字节模式、特定命名、字符串或符合其他各种约束条件的代码函数。简而言之&#xff0c;FindFunc的主要目的就是在二进制文件中寻找已知函数。 使用规则过滤 …...

【C++】讲的最通透最易懂的关于结构体内存对齐的问题

目录1. 内存对齐规则2. 简单易懂的内存对齐示例2.1 简单结构体2.2 含位域的结构体2.3 空类的大小2.4 嵌套结构体3. 为什么需要内存对齐&#xff1f;4. 类型在不同系统下所占字节数1. 内存对齐规则 第一个成员在与结构体变量偏移量为0的位置处。其他成员变量要对齐到某个数字&a…...

Stochastic Approximation 随机近似方法的详解之(一)

随机近似的定义&#xff1a;它指的是一大类随机迭代算法&#xff0c;用于求根或者优化问题。 Stochastic approximation refers to a broad class of stochastic iterative algorithms solving root finding or optimization problems. temporal-difference algorithms是随机近…...

软件自动化测试工程师面试题集锦

以下是部分面试题目和我的个人回答&#xff0c;回答比较简略&#xff0c;仅供参考。不对之处请指出 1.自我介绍 答&#xff1a;姓名&#xff0c;学历专业&#xff0c;技能&#xff0c;近期工作经历等&#xff0c;可以引导到最擅长的点&#xff0c;比如说代码或者项目 参考&a…...

智合同丨教你做一个懂AI的法律人

作为一名法律人&#xff0c;合同审核工作是日常工作中最基本也是必不可少的一项事务。我们知道&#xff0c;一般在企业&#xff0c;合同审批会涉及到众多部门和职务角色&#xff0c;最关键的一环其实在法务或者律师建议&#xff0c;其他部门给出的审批意见基本上都是基于自己部…...

如何判断自己使用的IP是独享还是共享?

在互联网上&#xff0c;我们常常听到独享IP和共享IP这两个概念。独享IP指的是一个IP地址只被一个用户或一个网站所使用&#xff0c;而共享IP则是多个用户或多个网站共用一个IP地址。那么&#xff0c;如何分辨IP是不是独享呢?接下来&#xff0c;我们将从几个方面来看。在这之前…...

跳石头

题目描述 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳…...

上传gitee教程,Gitee怎么上传代码到仓库

目录 第一步&#xff1a;配置git的用户名和邮箱 第二步&#xff1a;上传到远程仓库 第三步&#xff1a;将仓库的master分支拉取过来和本地的当前分支进行合并 第四步&#xff1a;将修改的所有代码添加到暂存区 第五步&#xff1a;将缓存区内容添加到本地仓库&#xff08;…...

netstat命令详解

1、下载netstat命令对应的软件包 yum install net-tools -y2、netsta命令介绍 [rootvm01 ~]# man netstatNETSTAT(8) Linux System Administrators Manual NETSTAT(8)NAMEnetstat - Print network connections, routing t…...

数据库三范式

文章目录数据库三范式1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;数据库三范式 第一范式&#xff1a;有主键&#xff0c;具有原子性&#xff0c;字段不可分割第二范式&#xff1a;完全依赖&#xf…...

K8S 1.20 弃用 Docker 评估之 Docker 和 OCI 镜像格式的差别

背景 2020 年 12 月初&#xff0c;Kubernetes 在其最新的 Changelog 中宣布&#xff0c;自 Kubernetes 1.20 之后将弃用 Docker 作为容器运行时。 弃用 Docker 带来的&#xff0c;可能是一系列的改变&#xff0c;包括不限于&#xff1a; 容器镜像构建工具容器 CLI容器镜像仓…...

Vue2和Vue3响应式的区别

数据响应式是什么&#xff1f; ​所谓 数据响应式 就是建立 响应式数据 与 依赖&#xff08;调用了响应式数据的操作&#xff09;之间的关系&#xff0c;当响应式数据发生变化时&#xff0c;可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作&#xff0c;可以是DOM…...

模型实战(6)之Alex实现图像分类:模型原理+训练+预测(详细教程!)

Alex实现图像分类:模型原理+训练+预测 图像分类或者检索任务在浏览器中的搜索操作、爬虫搜图中应用较广,本文主要通过Alex模型实现猫狗分类,并且将可以复用的开源模型在文章中给出!!!数据集可以由此下载:Data本文将从以下内容做出讲述: 1.模型简介及环境搭建2.数据集准…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

git: early EOF

macOS报错&#xff1a; Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...