百问网全志D1h开发板红外控制LVGL界面切换

红外控制LVGL界面切换

1. 测试红外功能

1.1 配置设备树

查看原理图:
image-20240619094740276

可以看到红外对应的引脚号是PG16

进入目录:

cd /home/ubuntu/tina-d1-h/device/config/chips/d1-h/configs/nezha/linux-5.4

修改board.dts

vim board.dts

修改引脚:

image-20240619095122322

以下节点是红外接收的设备树节点,没有使能的话,需要使能:

image-20240619095309642

1.2 配置内核配置文件

执行ckernel,进入内核目录。

打开内核配置界面:

m kernel_menuconfig

红外有很多种协议,NEC红外协议是最常用的一种,默认选上:

image-20240619102048624
添加红外接收驱动:

image-20240619102320611

保存,回到SDK根目录,编译make、打包pack和烧录。

1.3 验证红外功能

开发板上,执行cat proc/bus/input/devices:

root@TinaLinux:/# cat proc/bus/input/devices
I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-keyboard"
P: Phys=sunxikbd/input0
S: Sysfs=/devices/virtual/input/input0
U: Uniq=
H: Handlers=kbd event0
B: PROP=0
B: EV=3
B: KEY=100000000 0 0 100000000800 4000000000000 10000000I: Bus=0019 Vendor=0001 Product=0001 Version=0100
N: Name="sunxi-ir"
P: Phys=sunxi-ir/input0
S: Sysfs=/devices/platform/soc@3000000/7040000.s_cir/rc/rc0/s_cir_rx
U: Uniq=
H: Handlers=kbd event1
B: PROP=20
B: EV=100017
B: KEY=2
B: REL=3
B: MSC=10I: Bus=0000 Vendor=0000 Product=0000 Version=0000
N: Name="audiocodec sunxi Audio Jack"
P: Phys=ALSA
S: Sysfs=/devices/platform/soc@3000000/2030340.sound/sound/card0/input2
U: Uniq=
H: Handlers=kbd event2
B: PROP=0
B: EV=23
B: KEY=40 0 0 0 0 0 400000000 0 c000000000000 0
B: SW=14I: Bus=0018 Vendor=0000 Product=0000 Version=0000
N: Name="fts_ts"
P: Phys=
S: Sysfs=/devices/platform/soc@3000000/sunxi-i2c2/i2c-2/2-0038/input/input3
U: Uniq=
H: Handlers=event3
B: PROP=2
B: EV=b
B: KEY=400 0 0 0 0 0
B: ABS=661800000000000

可以看到/dev/input/event1就是红外接收的设备节点了。

执行:

hexdump /dev/input/event1

查看是否接收正常:

root@TinaLinux:/# hexdump /dev/input/event1
0000000 0d07 0000 0000 0000 4ab4 000c 0000 0000
0000010 0004 0004 0007 0000 0d07 0000 0000 0000
0000020 4ab4 000c 0000 0000 0000 0000 0000 0000
0000030 0d08 0000 0000 0000 4a1b 000e 0000 0000
0000040 0004 0004 0009 0000 0d08 0000 0000 0000
0000050 4a1b 000e 0000 0000 0000 0000 0000 0000
0000060 0d0a 0000 0000 0000 5968 0009 0000 0000
0000070 0004 0004 0007 0000 0d0a 0000 0000 0000
0000080 5968 0009 0000 0000 0000 0000 0000 0000
0000090 0d0b 0000 0000 0000 cf50 0004 0000 0000
00000a0 0004 0004 0009 0000 0d0b 0000 0000 0000
00000b0 cf50 0004 0000 0000 0000 0000 0000 0000

收到数据就是接收正常的现象。下面可以编写测试程序了。

1.4 编写红外接收测试程序

以下编写的测试文件:

ubuntu@ubuntu1804:~/C_Source/C_IRTest$ tree -L 2
.
├── bin
│   └── main
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   └── Makefile
├── build.sh
├── CMakeLists.txt
├── inc
│   └── ir_test.h
├── main.c
├── src
│   └── ir_test.c
└── toolchain.cmake5 directories, 10 files

主函数main.c如下:

#include <stdio.h>#include "ir_test.h"int main(int argc,char ** argv)
{int rang_low = 0, rang_high = 0;return test_keyboard(DEV_PATH);
}

红外模块测试程序/src/ir_test.c如下:

#include "ir_test.h"static const int key_exit = 102;
static int keys_fd = 0;unsigned int test_keyboard(const char * event_file)
{int code = 0, i;struct input_event data={0};keys_fd=open(DEV_PATH, O_RDONLY);if(keys_fd <= 0){printf("open %s error!\n", DEV_PATH);return -1;}fcntl(keys_fd,F_SETFL,O_NONBLOCK);for(;;){read(keys_fd, &data, sizeof(data));if(data.value){printf("%d\r\n",data.value);code = data.value;}}close(keys_fd);return 0;
}

所用到的头文件/inc/ir_test.h如下:

#ifndef IR_TEST_H
#define IR_TEST_H#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <limits.h>
#include <unistd.h>
#include <signal.h>#define DEV_PATH "/dev/input/event1" //difference is possibleunsigned int test_keyboard(const char * event_file);#endif

使用CMake来构建工程会更加方便一些,CMakeLists.txt如下:

cmake_minimum_required(VERSION 3.10)
project(ir)set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)include_directories(${PROJECT_SOURCE_DIR}/inc)file(GLOB SRC_FILES "src/*.c")add_executable(main main.c ${SRC_FILES})#target_link_libraries(target_name lib1 lib2 ...)

指定交叉编译工具,toolchain.cmake如下:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv)set(tools "/home/ubuntu/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702")
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-g++)

为了更加方便编译,编写一个脚本。build.sh如下:

rm -rf build
mkdir -p build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchain.cmake" ..
make -j8

执行./build.sh,生成的可执行程序在bin/文件下。

使用adb来推送到开发板上:

adb push bin/main /mnt/UDISK/

在开发板上执行/mnt/UDISK/main,即可验证红外接收:

root@TinaLinux:/mnt/UDISK# ./main
7
9
7
9

为后面实现红外切换LVGL界面做准备。

2. lvgl9移植

lvgl的界面准备使用9.0版本去实现,在这之前,需要先移植lvgl9.0版本例程到开发板上,为后面移植界面做准备。

2.1 准备移植资源

以下文件是从LVGL官方仓库,下载两个仓库:

注意:都要选择v9.0版本!!

名称仓库地址描述
lvglGitHub - lvgl/lvgl: Embedded graphics library to create beautiful UIs for any MCU, MPU and display type.包含了LVGL图形界面控件源码、驱动接口源代码以及例程
lv_port_linuxGitHub - lvgl/lv_port_linux: LVGL configured to work with a standard Linux framebuffer适配有framebuffer的linux系统的接口

由于版本更新,直接在ubuntu上克隆是最新版本的,编译会出现问题。

建议在window上都选择V9.0版本下载上面两个仓库,最后用lvgl仓库代替lv_port_linux_frame_buffer的lvgl文件夹。

lv_port_linux
image-20240624164131544

lvgl
image-20240624164340846

2,2 移植步骤

替换好工程后,上传到ubuntu,新建一个目录用于存放该工程。

可以看到目录结构如下:

ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$ tree -L 1
.
├── CMakeLists.txt
├── LICENSE
├── lv_conf.h
├── lvgl
├── main.c
├── Makefile
├── mouse_cursor_icon.c
└── README.md1 directory, 7 files

如果需要支持触摸功能,修改lv_conf.h

888 /*Driver for evdev input devices*/
889 #define LV_USE_EVDEV    1

mian.c中添加触摸输入:

需要确定设备的触摸节点(可以使用cat /dev/input/event3测试)

int main(void)
{lv_init();/*Linux frame buffer device init*/lv_display_t * disp = lv_linux_fbdev_create();lv_linux_fbdev_set_file(disp, "/dev/fb0");/*input touch device init*/lv_indev_t *touch;touch = lv_evdev_create(LV_INDEV_TYPE_POINTER,"/dev/input/event3");/*Create a Demo*/lv_demo_widgets();//lv_demo_widgets_start_slideshow();/*Handle LVGL tasks*/while(1) {lv_timer_handler();usleep(5000);}return 0;
}

2.3 编译

指定交叉编译工具,编写一个toolchain.cmake如下:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR riscv)set(tools "/home/ubuntu/tina-d1-h/prebuilt/gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702")
set(CMAKE_C_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/riscv64-unknown-linux-gnu-g++)

为了方便编译,编写一份脚本build.sh

rm -rf build
mkdir -p build
cd build/
cmake -DCMAKE_TOOLCHAIN_FILE="../toolchain.cmake" ..
make -j8

编译:

ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$ ls
bin  build  build.sh  CMakeLists.txt  LICENSE  lv_conf.h  lvgl  main.c  Makefile  mouse_cursor_icon.c  README.md  toolchain.cmake
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux$ sudo chmod +x build.sh
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$ ./build.sh 
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
...
[ 99%] Linking C static library liblvgl_examples.a
[ 99%] Built target lvgl_examples
[ 99%] Building C object CMakeFiles/main.dir/main.c.o
[ 99%] Building C object CMakeFiles/main.dir/mouse_cursor_icon.c.o
[100%] Linking CXX executable /home/ubuntu/lvgl_demo/lv_port_linux-release-v9.0/bin/main
[100%] Built target main
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0$

编译成功后,可执行程序保存在bin/目录下:

ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0/bin$ file main 
main: ELF 64-bit LSB executable, UCB RISC-V, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-riscv64xthead-lp64d.so.1, for GNU/Linux 4.15.0, with debug_info, not stripped
ubuntu@ubuntu1804:~/lvgl_demo/lv_port_linux-release-v9.0/bin$

3. lvgl输入设备适配

通过前面的测试,可以确认红外功能是可以使用的,为了方便控制lvgl的界面切换,需要把红外绑定到lvgl的输入设备框架里。

3.1 移植红外输入设备

参考官方文档:

Input device interface(输入设备接口) — LVGL 文档 (100ask.net)

可以看到,要创建输入设备,需要使用以下:

/*Register at least one display before you register any input devices*/
lv_indev_t * indev = lv_indev_create();
lv_indev_set_type(indev, LV_INDEV_TYPE_...);   /*See below.*/
lv_indev_set_read_cb(indev, read_cb);  /*See below.*/

其中LV_INDEV_TYPE_成员可以是:

  • LV_INDEV_TYPE_POINTER:触摸屏或鼠标
  • LV_INDEV_TYPE_KEYPAD:键盘或键垫
  • LV_INDEV_TYPE_ENCODER:具有左右旋转及按下选项的编码器
  • LV_INDEV_TYPE_BUTTON:外部按钮虚拟按压屏幕

read_cb 是一个函数指针,它将定期被调用以报告输入设备当前的状态。

每种类型,官网都简单写了一个read_cb所指向的函数的用法。可以参考它的,把红外适配上去。

在这里,红外使用的是LV_INDEV_TYPE_BUTTON类型,官网中的read_cb指向的函数是这样使用的:

void button_read(lv_indev_t * indev, lv_indev_data_t*data){static uint32_t last_btn = 0;   /*Store the last pressed button*/int btn_pr = my_btn_read();     /*Get the ID (0,1,2...) of the pressed button*/if(btn_pr >= 0) {               /*Is there a button press? (E.g. -1 indicated no button was pressed)*/last_btn = btn_pr;           /*Save the ID of the pressed button*/data->state = LV_INDEV_STATE_PRESSED;  /*Set the pressed state*/} else {data->state = LV_INDEV_STATE_RELEASED; /*Set the released state*/}data->btn_id = last_btn;         /*Save the last button*/
}

这里需要把my_btn_read修改成上一章验证过的红外测试接口 ,加以修改,如下:

static int ir_pressed(void)
{struct input_event data={0};int cnt = 0;read(keys_fd, &data, sizeof(data));if(data.value == 7){cnt = 0;return cnt;}else if(data.value == 9){cnt = 1;return cnt;}return -1;
}

这样,read_cb所指向的函数就变成:

static void read_cb(lv_indev_t * indev, lv_indev_data_t*data)
{static uint32_t last_btn = 0;                       /*Store the last pressed button*/int btn_pr = ir_pressed();                                  /*Get the ID (0,1,2...) of the pressed button*/if(btn_pr >= 0) {                                   /*Is there a button press? (E.g. -1 indicated no button was pressed)*/last_btn = btn_pr;                              /*Save the ID of the pressed button*/data->state = LV_INDEV_STATE_PRESSED;    /*Set the pressed state*/printf("last_btn : %d\n",last_btn);} else {data->state = LV_INDEV_STATE_RELEASED;   /*Set the released state*///printf("RELEASED\n");}data->btn_id = last_btn;                                /*Save the last button*///printf("data->btn_id : %d\n",data->btn_id);
}

ir_pressed返回的每个索引都分配了相应的坐标,使用了lv_indev_set_button_points(my_indev, points_array)points_array 应该看起来像 const lv_point_t points_array[] = { {12,30},{60,90}, ...}

添加上初始化,就可以用红外控制lvgl界面切换了(界面需要在lvgl9移植的工程上额外编写):

static const lv_point_t points_array[] = {{20,20},{120,20}};void ir_init(void)
{keys_fd = open(DEV_PATH, O_RDONLY);if(keys_fd <= 0){printf("open %s error!\n", DEV_PATH);return;}fcntl(keys_fd,F_SETFL,O_NONBLOCK);lv_indev_t * indev = lv_indev_create();lv_indev_set_type(indev,LV_INDEV_TYPE_BUTTON);lv_indev_set_read_cb(indev,read_cb);lv_indev_set_button_points(indev,points_array);
}

整个工程的目录结构如下:

ubuntu@ubuntu1804:~/C_Source/lvgl_v9_demo_irtest$ tree -L 2
.
├── bin
│   └── main
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── lib
│   ├── lvgl
│   └── Makefile
├── build.sh
├── CMakeLists.txt
├── inc
│   ├── anim.h
│   ├── calendar.h
│   ├── ir_test.h
│   └── my_lvgl_demo_irtest.h
├── lv_conf.h
├── lvgl
│   ├── CMakeLists.txt
│   ├── component.mk
│   ├── demos
│   ├── docs
│   ├── env_support
│   ├── examples
│   ├── idf_component.yml
│   ├── Kconfig
│   ├── library.json
│   ├── library.properties
│   ├── LICENCE.txt
│   ├── lv_conf_template.h
│   ├── lvgl.h
│   ├── lvgl.mk
│   ├── lvgl.pc.in
│   ├── README.md
│   ├── SConscript
│   ├── scripts
│   ├── src
│   └── tests
├── main.c
├── Makefile
├── mouse_cursor_icon.c
├── src
│   ├── anim.c
│   ├── calendar.c
│   ├── ir_test.c
│   └── my_lvgl_demo_irtest.c
└── toolchain.cmake15 directories, 32 files

执行./build.sh可以直接编译程序,可执行程序main放在bin/文件里。

推送到开发板上:

adb push bin/main /mnt/UDISK/

3.2 测试

开发板上执行:

root@TinaLinux:/mnt/UDISK# ./main
last_btn : 0
last_btn : 0
last_btn : 1
last_btn : 1
last_btn : 0
last_btn : 1
last_btn : 0
last_btn : 1

界面如下:

image-20240620103617224

0是往前返回上一个界面,1是往下一个界面走,搞定。

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

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

相关文章

MUNIK解读ISO26262:安全计划

前言 当我们进行功能安全开发时&#xff0c;由于整个项目周期和内容较多&#xff0c;因此需要在项目前期对一些问题提前进行规划&#xff1a;比如功能安全开发具体分为几个阶段&#xff0c;应该怎么去做&#xff1f;对于不同的环节&#xff0c;有哪些人员来执行&#xff1f;资…

在网上申请流量卡审核失败,可能是你的年龄有问题!

在网上申请流量卡审核失败&#xff0c;可能是你的年龄有问题&#xff01; 先上个图&#xff1a; ​ 网上的流量卡并不是随意申请的&#xff0c;而是填写申请信息后由运营商进行审核&#xff0c;审核通过后才会发卡&#xff0c;如果你提交的订单没有审核通过&#xff0c;那么大…

体积大的快递怎么寄便宜?如何寄件寄包裹更省钱?

大学毕业了&#xff0c;面对即将到来的工作生活&#xff0c;小李不得不把宿舍里的大包小包打包寄回家。可是&#xff0c;当他真正开始打包行李时&#xff0c;才发现这可不是一件简单的事&#xff1a;衣服、被子、书籍、杂物……这些东西加起来体积不小&#xff0c;想要省钱寄快…

HippoRAG如何从大脑获取线索以改进LLM检索

知识存储和检索正在成为大型语言模型(LLM)应用的重要组成部分。虽然检索增强生成(RAG)在该领域取得了巨大进步&#xff0c;但一些局限性仍然没有克服。 俄亥俄州立大学和斯坦福大学的研究团队推出了HippoRAG&#xff0c;这是一种创新性的检索框架&#xff0c;其设计理念源于人类…

强化学习实战1:OpenAI Gym 实验环境介绍

环境配置 我的 torch 版本是 2.3.0&#xff0c;然后 gym 版本是 0.22.0&#xff0c;python 版本是 3.8 &#xff0c;pygame 版本是 2.6.0 。 首先安装一下 gym&#xff1a; pip install gym0.22.0 -i https://pypi.tuna.tsinghua.edu.cn/simple然后安装一下 pygame&#xff…

Linux服务器CPU占用率达到100%排查思路

1、找到最耗CPU的进程pid&#xff0c;执行命令 top 2、找到最耗CPU的线程tid // 执行 top -Hp [pid] 定位应用进程对应的线程 tid // 按shift p 组合键&#xff0c;按照CPU占用率排序 > top -Hp 14246 3、将线程pid转化为16进制 // printf "%x\n" [tid] 将tid…

Sharding-JDBC分库分表之SpringBoot主从配置

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 前言 在开发中&#xff0c;如果对数据库的读和写都在一个数据服务器中操作&#xff0c;面对日益增加的访问量&#x…

无法找到模块“@wangeditor/editor-for-vue”的声明文件

vue3项目中使用wangeditor/editor遇到的问题 开发环境不管红线报错正常使用 打包的时候就会报错了 1.安装依赖 pnpm install --save wangeditor/editor wangeditor/editor-for-vuenext 2.遇到的问题 3.解决方法 在src目录下面创建 wangeditor-types.d.ts 文件 代码如下 de…

【ai_agent】从零写一个agent框架(五)基于egui制作一个agent/workflow在线编辑器

前言 上篇我们实现了基础节点&#xff0c;并暴露出grpc服务&#xff0c;但是手动编辑文本制作一个workflow实在强人所难。 所以本文我们做个webui自动生成workflow。 开搞之前先看看别人怎么做的。 Dify 的ui 效果如下图示&#xff1a; 支持多种功能节点 但只能打开一个节…

【线性表,线性表中的顺序表和链表】

目录 1、线性表的定义和基本操作1.1、线性表的定义1.2、线性表的基本操作 2、顺序表和链表的比较2.1、顺序表2.1.1、顺序表的定义和特点2.1.2、顺序表的实现&#xff08;1&#xff09;顺序表的静态分配&#xff1a;&#xff08;2&#xff09;顺序表的动态分配 2.1.3、顺序表的基…

基于正点原子的FreeRTOS笔记——队列

一、什么是队列 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制。 在队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做“队列项目”&#xff0c;队列能够存储“队列项目”的最大数量称为队列的长度。 在创建队列时要指定队列长度以及队列项目…

蹭一个围棋亚军!不要和低维的人说话——早读(逆天打工人爬取热门微信文章解读)

熬夜后需要补什么呢&#xff1f; 引言Python 代码第一篇 洞见 不要和低维的人说话&#xff08;深度好文&#xff09;第二篇 冲冲冲结尾 引言 昨晚真的是熬夜又想不出东西 真的头大 最近下围棋 这个棋感很好呀 我是K级选手 目前是8级 套几个buff 纯自学 为什么决定学围棋呢? 是…

翰德恩咨询赋能材料行业上市公司,共筑IPD管理体系新篇章

赋能背景概览 坐落于江苏的某材料行业领军企业&#xff0c;作为国内无机陶瓷膜元件及成套设备领域的佼佼者&#xff0c;以其庞大的生产规模、丰富的产品系列及卓越的研发实力&#xff0c;屹立行业之巅二十余年。公司不仅在新材料研发、技术创新、工艺设计、设备制造及整体解决…

swift与Internvl下的多模态大模型分布式微调指南(附代码和数据)

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 基于Dify的智能分类方案&#xff1a;大模型结合KNN算法&#xff08;附代码&#xff…

InavFlight飞控固件学习-1《开发环境搭建》

目录 文章目录 目录摘要1.官网2.形成Linux开发环境工具2.1 简介2.2 相关工具2.2.1 Ubuntu / Debian系统配置命令2.2.2 Fedora系统配置命令2.2.3 Fedora系统配置命令 2.3 克隆存储库2.4 构建工具2.5 使用cmake2.6 构建固件2.7 清除2.8 cmake 缓存维护2.9 编译通过ninja2.10 更新…

小程序跳企业微信教程

来别急&#xff0c;我说几个点&#xff0c;你先记着&#xff0c; 必须真机才能测必须要企业微信里头去配置下关联到对应的小程序&#xff08;文章底部有图&#xff09;要同一个公司主体&#xff01; 说说几个报错&#xff0c; 一、代码其实就这么一个&#xff0c;你别在微信…

virtuoso:layout如何做flat修drc

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 有些drc在virtuoso layout中修更节省时间&#xff0c;比如遇到一些via array需要做删改时&#xff0c;发现工具把via array做成了一个cell&#xff0c;如图。 去改cell可能会影…

高考志愿怎么选专业,哪些是热门专业?

选专业看上去非常简单&#xff0c;但是真正做起来的时候确实不容易&#xff0c;因为对于很多结束高考的学生来说&#xff0c;选专业就意味着他们选择自己的未来&#xff0c;这可是直接关系到未来的学习和职业发展&#xff0c;关系到将来的就业方向&#xff0c;再加上现在的社会…

逆向案例十一——华强北登录逆向

网址&#xff1a;aHR0cHM6Ly9wYXNzcG9ydC5ocWV3LmNvbS9sb2dpbg 登陆页面&#xff1a; 打开开发者工具会出现debugger调试&#xff1a; 直接使用一律不再此处暂停即可。点击登录&#xff0c;找到登录包。 发现有三个参数进行了加密&#xff0c;分别是Password,UserName和Devic…