King3399(ubuntu文件系统)wifi设备树分析

该文章仅供参考,编写人不对任何实验设备、人员及测量结果负责!!!

0 引言

文章主要介绍King3399(ubuntu)wifi设备树,涉及king-rk3399.dts、rp-wifi-sdio.dtsi内容修改与介绍

在使用wifi前本人遇到了一个比较奇怪的问题,即自行编译的镜像文件烧录后无法使用wifi功能,使用指令ip a查看时没有wlan这部分,配置界面也没有相关选项,具体情况如下图所示,摸索一周后不清楚修改了哪里wifi又可正常启用(非设备树问题,因为对比前后逆向生成设备树文件各项配置相同,故排除设备树)
 wifi or not
一开始我认为是设备树的问题,因为rp-wifi-sdio.dtsi中的属性为wifi_chip_type = "ap6210";,而板子的wifi型号为ap6354s,将该属性修改后重新编译boot.img并烧录,wifi依然无法正常启用,于是便想从官方的镜像中获取设备树,对比从SDK中自行编译的设备树之间的区别

这篇文章具有一定的局限性:需要一个完整且功能正常的镜像做为参考

1 wifi模块硬件分析

king3399可以通过有线网络、无线wifi与4G模块三种方式联网,在进行开发时,大多数情况下都是利用有线的方式,这种方式更为稳定且在软件层面配置也较为简单,硬件上仅仅是多一根网线,但这也有一定局限性,例如当下无线网的应用更为广泛,利用手机的热点就可以组成局域网,随时随地都可以进行开发,免去杂乱的布线困扰,前面的文章本人使用的是有线的方式,最近将wifi的部分研究后,对这部分进行总结

cdrom_king3399_new\03-硬件文档\底板硬件资料\KING3399-20180712原理图.pdf

在上述路径中可以找到板子的原理图,其中wifi部分硬件原理图如下图所示(该模块为wifi+BT,本文只涉及wifi部分),模块外围电路并不复杂,采用SDIO接口与主控通信
 wifi硬件接口
wifi模块使用型号为ap6354,这个模块在正基(AMPAK)官网已下架,但网上有大量相关资料,datasheet(ap6354/ap6210)可在文末链接中下载

2 设备树分析

建议在查看设备树文件前先对其进行备份,避免误修改!!!

wifi这部分涉及多个设备树文件与子系统,在节点中有大量有用/无用的属性,如果刚接触这块内容学习起来是比较困难的,这里分享一个方法:逆向分析设备树,学习过设备树知识的应该都知道设备树这部分内容其实并不难(仅看懂与会修改),子节点的配置类似于stm32硬件的初始化,个人觉得难点在于节点内部属性的引用以及属性的具体意义

首先是引用,设备树中为了便于修改与配置,会使用大量的“&”对变量名进行引用,相对于直接写一堆数字/地址确实有助于分析代码,但这也会导致同一个变量名可能会出现在多个文件中,当使用“&”对一个子节点引用时就要注意了,这可能是对其属性的初始化,也可能是对其属性修改,还有可能是添加某个属性,当涉及多个文件与属性时,很容易迷糊

其次是属性,每个子节点都是由大量的属性组成,部分属性是固有的,这些在修改前必须了解,还有部分是第三方自定义的,这部分非常重要,通常具有极强针对性,但这部分可查找资料有限,往往需要根据实际情况推测

cdrom_king3399_new\04-镜像文件\ubuntu2004\update-king3399-linux-ubuntu20-hdmi-xxx-xxx.img

这里详细记录一下前文提到的逆向分析设备树的方法,首先将官方提供的镜像烧录至板子中,(可参考上述路径选择性下载,建议选择的镜像版本与SDK生成的版本一致,不同版本的设备树会有些许差异,不便于分析具体的差异),板子成功启动后执行如下指令安装设备树编译器

sudo apt install device-tree-compiler

查看当前板子所用设备树文件内容

dtc -I fs -O dts /sys/firmware/devicetree/base # -I是大写的 i !!!

为便于查看可将上述指令结果输出到指定文件,该过程可能会产生大量警告日志,可不理会

touch /home/xxx/my_king3399_dts.dts # 创建一个空设备树文件

将设备树输出到该文件

dtc -I fs -O dts /sys/firmware/devicetree/base > /home/xxx/my_king3399_dts.dts

上述操作皆在板子上执行,随后打开主机进入目录~/ws/sdk/kernel/arch/arm64/boot/dts/rockchip/rk3399,打开king-rk3399.dts可以看到,

#include "rp-rk3399-board.dtsi"
......
#include "rp-audio-rt5651.dtsi"
#include "rp-pmu-rk808.dtsi"#include "rp-gpio-key.dtsi"
#include "rp-adc-key.dtsi"#include "rp-mipi-ov13850-camera.dtsi"#include "rp-wifi-sdio.dtsi"  // <----------目标文件
#include "rp-bt-uart0.dtsi" #include "rp-sdcard-mmc1.dtsi"
#include "rp-gmac.dtsi"
......

从头文件不难看出rp-wifi-sdio.dtsi是我们需要关注的文件,在同级目录下打开该文件,内容如下,内部共有三个子节点,其中wireless_wlan为新添加的节点,&sdio0&pinctrl为引用节点,为便于理解,对各属性添加必要注释

/ {wireless_wlan: wireless-wlan {# 兼容性匹配检查用compatible = "wlan-platdata";# grf: general register filerockchip,grf = <&grf>;# wifi模块型号,这里填写ap6354也可正常使用wifi_chip_type = "ap6210";# sdio_vref = <1800>;pinctrl-names = "default";pinctrl-0 = <&wifi_host_wake_irq>, <&wifi_enable_h>;# 中断控制引脚WIFI,host_wake_irq = <&gpio0 RK_PA3 GPIO_ACTIVE_HIGH>; # 电源控制引脚WIFI,poweren_gpio = <&gpio0 RK_PB2 GPIO_ACTIVE_HIGH>;# 节点状态可用status = "okay";};
};# sdio0 = "/mmc@fe310000";
&sdio0 {# SDIO最大运行频率max-frequency = <150000000>;# 在初始化时是否限制发送sd指令no-sd;# 在初始化时是否限制发送mmc指令no-mmc;# 线宽,不配置则默认为1,可选择参数只有1、4和8bus-width = <4>;# 是否禁用写保护disable-wp;# 是否为高速设备cap-sd-highspeed;# 是否支持中断cap-sdio-irq;# 是否支持睡眠不断电 keep-power-in-suspend;# 插槽不可移动non-removable;#num-slots = <1>;pinctrl-names = "default";pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;# 设备是否支持 SDIO3.0 模式(频率 < 208M)sd-uhs-sdr104;status = "okay";
};&pinctrl {wireless-wlan {wifi_host_wake_irq: wifi-host-wake-irq {rockchip,pins = <0 RK_PA3 RK_FUNC_GPIO &pcfg_pull_down>;};wifi_enable_h: wifi-enable-h {rockchip,pins = <0 RK_PB2 RK_FUNC_GPIO &pcfg_pull_up>;};};
};

与此同时打开前面逆向生成的设备树my_king3399_dts.dts,摘取部分与本文相关内容如下

	wireless-wlan {pinctrl-names = "default";pinctrl-0 = <0xeb 0xec>;WIFI,host_wake_irq = <0x40 0x03 0x00>;sdio_vref = <0x708>;wifi_chip_type = "ap6210";compatible = "wlan-platdata";status = "okay";rockchip,grf = <0x20>;# phandle : pointer handle,唯一标识符号,类似于地址/标签,便于调用phandle = <0x1ad>;WIFI,poweren_gpio = <0x40 0x0a 0x00>;};mmc@fe310000 {power-domains = <0x1f 0x1c>;fifo-depth = <0x100>;pinctrl-names = "default";pinctrl-0 = <0x25 0x26 0x27>;clock-names = "biu\0ciu\0ciu-drive\0ciu-sample";cap-sd-highspeed;no-mmc;bus-width = <0x04>;non-removable;resets = <0x08 0x79>;cap-sdio-irq;interrupts = <0x00 0x40 0x04 0x00>;clocks = <0x08 0x1ee 0x08 0x4d 0x08 0x9c 0x08 0x9d>;num-slots = <0x01>;keep-power-in-suspend;no-sd;compatible = "rockchip,rk3399-dw-mshc\0rockchip,rk3288-dw-mshc";status = "okay";disable-wp;reg = <0x00 0xfe310000 0x00 0x4000>;phandle = <0x100>;sd-uhs-sdr104;max-frequency = <0x8f0d180>;reset-names = "reset";};pinctrl {compatible = "rockchip,rk3399-pinctrl";rockchip,pmu = <0x9d>;ranges;rockchip,grf = <0x1f>;wireless-wlan {wifi-host-wake-irq {rockchip,pins = <0x00 0x03 0x00 0xd3>;phandle = <0xe7>;};wifi-enable-h {rockchip,pins = <0x00 0x0a 0x00 0xd2>;phandle = <0xe8>;};};};

不难看出,两个设备树文件的差别还是很大的,后者使用地址/数组来表示具体的属性值,并将设备树中该节点的所有属性列举出,结构上将所有设备节点存放在同一个根节点下,设备“树”名副其实

从模块/设备管理的角度来讲,后者显然是不可取的,各模块在设备树中的关联太强,在修改时很容易出错,但如果是进行分析比对,这无疑会提高效率,免去了在各文件中切换查找的繁琐的步骤,下图为本人wifi成功启用前后的区别,可以明显看出两者区别所在,第一处为模块的硬件地址,都是唯一的,不对wifi是否正常工作产生影响,第二处左侧为将“ap6210”修改为“ap6354”,,修改后重新编译也能够联网,通过上述分析能够得出wifi未能成功启动问题还在设备树上
dts区别对比

3 设备树属性及示例

上一小节提到设备树中存在大量属性,在分析/修改设备树时了解这些属性是必要的,网上关于这部分的资料很零散,本人对wifi进行调试时在这方面花费了不少精力,这里以wifi的部分属性为例,总结如何查看属性的用法

  1. 进入sdk内核设备树示例目录,该目录下有大量设备类型,常见的例如pinctrl、pwm、spi、iic等,我们的wifi使用的是sdio接口,属于mmc,除此之外有些wifi模块还可能使用usb或者pcie接口

    ~/ws/sdk/kernel/Documentation/devicetree/bindings/

  2. 找到mmc目录进入可以看到大量文件,从文件名不难猜测出文件与设备厂商相关,像atmel、hi、microchip、nvidia、ti等,大家应该都不陌生,我们所使用的wifi模块是正基(AMPAK)不在上述行列中,唯一与之有点关系的只有rockchip,打开rockchip-dw-mshc.yaml,可以看到如下这段话,大致内容是说rockchip使用的是synopsys(新思)控制器去操作mmc设备,该文件主要是添加了一些rockchip的特有属性,并给出了示例(能力有限,翻译的不准确,可自行查看该文件)

    title: 
    # 文件名“dw-mshc”与title缩写对应
    Rockchip designware mobile storage 
    host controller device tree bindingsdescription:
    # 文件内容简述
    Rockchip uses the Synopsys designware
    mobile storage host controllerto interface
    a SoC with storage medium such as eMMC or
    SD/MMC cards.This file documents the combined properties
    for the core Synopsys dw mshccontroller 
    that are not already included in the 
    synopsys-dw-mshc-common.yamlfile and 
    Rockchip specific extensions.
    
  3. 文件中提到了一个参考文件“ref: synopsys-dw-mshc-common.yaml#",在同级目录下,打开该文件,内容与上一个文件类似,从title: Synopsys Designware Mobile Storage Host Controller Common Properties这句话可以了解到,这个文件是synopsys的移动存储主机控制器通用属性,可以理解为这个文件中的属性是synopsys的一些特有属性

  4. 同理,文件中同样提到了一个参考文件ref: "mmc-controller.yaml#",打开这个文件,摘取部分内容如下所示,从描述中可以得知,这个文件的所有属性是mmc设备通用的,不局限于某个厂商或平台,在这个文件中可以找到大多数wifi子节点中的属性,

    # mmc设备通用控制器
    title: 
    MMC Controller Generic Bindingdescription: 
    These properties are common to 
    multiple MMC host controllers. 
    Any hostthat requires the respective 
    functionality should implement them 
    usingthese definitions.It is possible to assign a fixed index 
    mmcN to an MMC host controller(and the 
    corresponding mmcblkN devices) by defining 
    an alias in the/aliases device tree node.
    
  5. 在找到这些属性后还剩下最后的工作:修改与使用这些属性,下边列举了三个典型的属性,第一个是bus-width,该属性决定了mmc设备接口的通信硬线数量,类型为枚举,可选参数为1、4和8,如果未显示声明该属性则默认为是单线,king3399中该属性设置的为4

    第二个是max-frequency,该属性定义了总线的最大操作频率,数据类型为uint32,实际取值区间为(400000,200000000),我们使用wifi子节点中该参数设置为150000000;

    第三个是sd-uhs-sdr104,该属性决定了sdio的传输速度模式,类型为bool(flag),当声明后,表示该设备使用这种传输速度模式,这个属性的具体使用与介绍可参考文末脚注《Rockchip RK3399 - MMC&SD&SDIO基础》

    bus-width:description:Number of data lines.$ref: /schemas/types.yaml#/definitions/uint32enum: [1, 4, 8]default: 1max-frequency:description:Maximum operating frequency of the bus.$ref: /schemas/types.yaml#/definitions/uint32minimum: 400000maximum: 200000000sd-uhs-sdr104:$ref: /schemas/types.yaml#/definitions/flagdescription:SD UHS SDR104 speed is supported.
    
  6. 通过上面的步骤能够找到大部分关于wifi的属性与用法介绍,然而还是有个别属性无法把握住,例如num-slots,网上也没有关于这个属性的介绍,这个就只能靠猜了,从字面意思理解就是SD卡插槽的数量,节点中的赋值是1,而king3399上的SD卡插槽正好是一个,当然这仅仅是个人推测,若是谁手中有多个插槽的板子可以试着看看这个属性是如何使用的

至此,关于wifi的设备树内容已经介绍完毕(由于属性众多,无法逐一列举,可参考上述方法查看具体属性的介绍与用法),下面表格中列举了上述三个文件中的所有属性名

rockchip-dw-mshc.yaml#synopsys-dw-mshc-common.yaml#mmc-controller.yaml#
compatibleinterrupts$nodenamedisable-wp
regresets#address-cellswp-gpios
interruptsreset-names#size-cellsno-1-8-v
clocksclock-frequencycap-mmc-highspeedbroken-cd
clock-namesfifo-depthcap-sd-highspeedcd-gpios
rockchip,default-sample-phasecard-detect-delaynon-removablewp-inverted
rockchip,desired-num-phasesdata-addrcd-debounce-delay-mscd-inverted
fifo-watermark-alignedsd-uhs-sdr12bus-width
dmassd-uhs-sdr25max-frequency
dma-namessd-uhs-sdr50mmc-ddr-1_2v
sd-uhs-sdr104mmc-ddr-1_8v
sd-uhs-ddr50mmc-ddr-3_3v
cap-power-off-cardcap-sdio-irq
cap-mmc-hw-resetfull-pwr-cycle
disable-cqe-dcmd:broken-hpi
wakeup-sourcecompatible
full-pwr-cycle-in-suspenddsr
mmc-hs400-enhanced-strobeno-sdio
fixed-emmc-driver-typeno-sd
post-power-on-delay-msno-mmc
keep-power-in-suspendsupports-cqe
mmc-hs200-1_2vmmc-supply
mmc-hs200-1_8vvqmmc-supply
mmc-hs400-1_2vmmc-pwrseq
mmc-hs400-1_8vreg
4 wifi部分内核配置

打开网盘中下述路径中的文件,该文件是对wifi部分的使用说明,包含本文前面的设备树部分,但该文件写的比较杂乱,准确来说rp/rk所有的官方文档都写的很差,感觉就像是工程师随手写的笔记,逻辑跳脱,内容陈旧

cdrom_king3399_new\02-软件文档\RK原厂文档\linux\cn\Linux\Wifibt\Rockchip_Developer_Guide_Linux_WIFI_BT_CN.pdf

关于wifi部分的内核配置部分,本人没有心得,仅仅是照着网上的资料看了看配置选项与配置文件,没有做任何修改,下边提到的几个配置文件将在文末提供下载链接,若手中设备wifi有问题可以参考这几个配置文件

首先是查看配置选择,进入~\ws\sdk\kernel目录,输入make menuconfig ARCH=arm64,在弹出的界面中进入如下目录

Device Drivers > Network device support > Wireless LAN > Rockchip Wireless LAN support >

本人此处的配置如下,仅供参考,若对某个选项有疑惑可以选择该并按下h,即可弹出相关的说明,界面中配置选项保存在~\ws\sdk\kernel\.config文件中,该文件不可手动修改,文件第一行有提到

Rockchip Wireless LAN support
[ ]   build wifi ko modules
[*]   Wifi load driver when kernel bootup
[ ]   Wifi generate random mac......
[*]   Broadcom Wireless Device Driver Support  ---> 
Broadcom Wireless Device Driver Support
<*>   ap6xxx wireless cards supportEnable Chip Interface (SDIO bus interface support)  --->
(/vendor/etc/firmware/fw_bcmdhd.bin) Firmware path
(/vendor/etc/firmware/nvram.txt) NVRAM path
[ ]   Enable wlan1 support

此外打开编译日志~\ws\sdk\output\sessions\lastes\xx-kernel-build.log,可以看到如下一段内容,可以看出~ws\sdk\kernel\arch\arm64\configs\rockchip_wifi_builtin.config中的部分变量将~ws\sdk\kernel\.config的变量覆盖了

......
Using .config as base
Merging ./arch/arm64/configs/rockchip_wifi_builtin.config
Value of CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is redefined by fragment ./arch/arm64/configs/rockchip_wifi_builtin.config:
Previous value: # CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP is not set
New value: CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=yValue of CONFIG_AP6XXX is redefined by fragment ./arch/arm64/configs/rockchip_wifi_builtin.config:
Previous value: # CONFIG_AP6XXX is not set
New value: CONFIG_AP6XXX=y
......

其中rockchip_wifi_builtin.config的内容如下

# CONFIG_WIFI_BUILD_MODULE is not set
CONFIG_WIFI_LOAD_DRIVER_WHEN_KERNEL_BOOTUP=y
CONFIG_AP6XXX=y

[1] Rockchip RK3399 - MMC&SD&SDIO基础

[2] 正基官网

[3] K3568外接AP6275S WIFI模块调试详解

[4] datasheet(ap6354/ap6210)PWD:wm8e

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

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

相关文章

Elmo驱动器上位机软件的详细配置

续接上文,本文讲解Elmo驱动器上位机软件更详细的配置,重点关注,在电机的位置受到约束的情况下,完成驱动器的参数整定过程,以及一些调试方法 一 硬件介绍 本文使用的是另一套设备,假设电机的位置是受到约束的 1 编码器规格书 编码器已知信息是 :读数头是26位的,通讯…

【Python】爬虫使用代理IP

1、代理池 IP 代理池可以理解为一个池子&#xff0c;里面装了很多代理IP。 池子里的IP是有生命周期的&#xff0c;它们将被定期验证&#xff0c;其中失效的将被从池子里面剔除池子里的ip是有补充渠道的&#xff0c;会有新的代理ip不断被加入池子中池子中的代理ip是可以被随机…

Ascend Extension for PyTorch是个what?

1 Ascend Extension for PyTorch Ascend Extension for PyTorch 插件是基于昇腾的深度学习适配框架&#xff0c;使昇腾NPU可以支持PyTorch框架&#xff0c;为PyTorch框架的使用者提供昇腾AI处理器的超强算力。 项目源码地址请参见Ascend/Pytorch。 昇腾为基于昇腾处理器和软…

【HarmonyOS Next】数据本地存储:@ohos.data.preferences

【HarmonyOS Next】数据本地存储&#xff1a;ohos.data.preferences 在开发现代应用程序时&#xff0c;数据存储是一个至关重要的过程。应用程序为了保持某些用户设置、应用状态以及其他小量数据信息通常需要一个可靠的本地存储解决方案。在 HarmonyOS Next 环境下&#xff0c…

数据结构——二叉树(续集)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

MySQL性能测试方案设计

在现代互联网系统中&#xff0c;数据库性能直接影响到整体应用的速度和用户体验。而MySQL作为广泛使用的关系型数据库&#xff0c;随着数据量和并发请求的增长&#xff0c;其性能问题也日益突出。今天我们将深入探讨如何设计一套高效的MySQL性能测试方案&#xff0c;帮助你精准…

cv::intersectConvexConvex返回其中一个输入点集,两个点集不相交

问题&#xff1a;cv::intersectConvexConvex返回其中一个输入点集&#xff0c;但两个点集并不相交 版本&#xff1a;opencv 3.1.0 git上也有人反馈了intersectConvexConvex sometimes returning one of the input polygons in case of empty intersection #10044 是凸包嵌套判…

【学习笔记】SAP ABAP——内表

内表定义 ​ 内表是SAP ABAP中最具有影响力且最重要的功能之一&#xff0c;简而言之&#xff0c;用一句话概括内表的定义就是&#xff1a;***内表是可以在程序内部定义并且使用的表&#xff0c;属于本地表。***如下图展示出了参照数据库表sflight定义的内表的结构 内表与数据库…

MinerU容器构建教程

一、介绍 MinerU作为一款智能数据提取工具&#xff0c;其核心功能之一是处理PDF文档和网页内容&#xff0c;将其中的文本、图像、表格、公式等信息提取出来&#xff0c;并转换为易于阅读和编辑的格式&#xff08;如Markdown&#xff09;。在这个过程中&#xff0c;MinerU需要利…

[产品管理-66]:七步法创新工具:SCAMPER法,也被称为奔驰法,一种创新思考工具,帮助我们基于现有的产品找到产品创新突破的方向

SCAMPER法&#xff0c;也被称为奔驰法&#xff0c;是一种创新思考工具&#xff0c;由美国心理学家罗伯特艾伯尔&#xff08;也有说法是教育家和创新思考专家鲁伯特普里斯科特&#xff09;提出。这种检核表主要藉几个字的代号或缩写&#xff0c;代表七种改进或改变的方向&#x…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

IDEA启动提示Downloading pre-built shared indexes

Download pre-built shared indexes Reduce the indexing time and CPU load with pre-built JDK shared indexes 翻译&#xff1a; 下载预构建的共享索引 使用预构建的JDK共享索引减少索引时间和CPU负载. 使用预构建的JDK共享索引可以显著减少索引构建时间和CPU负载&#xf…

【DM系列】DM 集成 JDBC 开发指南

前言 数据库访问是数据库应用系统中非常重要的组成部分&#xff0c;DM 作为一个通用数据库管理系统&#xff0c;提供了多种数据库访问接口&#xff0c;包括 ODBC、JDBC、DPI 等方式。本开发指南详细介绍了 DM 的各种访问接口、相应开发环境的配置、以及一些开发用例。本指南的主…

处理PhotoShopCS5和CS6界面字体太小

处理PhotoShop CS6界面字体太小 背景&#xff1a;安装PhotoShop CS6后发现无法调大字体大小&#xff0c;特别是我的笔记本14寸的&#xff0c;显示的字体小到离谱。 百度好多什么降低该电脑分辨率&#xff0c;更改电脑的显示图标大小&#xff0c;或者PS里的首选项中的界面设置。…

【JavaEE进阶】Spring AOP 原理

在之前的博客中 【JavaEE进阶】Spring AOP使用篇_aop多个切点-CSDN博客 我们主要学习了SpringAOP的应用, 接下来我们来学习SpringAOP的原理, 也就是Spring是如何实现AOP的. SpringAOP 是基于动态代理来实现AOP的,咱们学习内容主要分以下两部分 1.代理模式 2.Spring AOP源码剖…

基于springboot+vu的二手车交易系统(全套)

一、系统架构 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页2 03. web端-注册 04. web端-登录 05. w…

macOS开发环境配置与应用开发(详细讲解)

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 macOS作为Apple公司推出的桌面操作系统&#xff0c;以其稳定性、优雅的用户界面和强大的开发工具吸引了大量开发者。对于…

TinyVue v3.19.0 正式发布!Tree 组件终于支持虚拟滚动啦!UI 也升级啦,更更符合现代审美~

你好&#xff0c;我是 Kagol&#xff0c;个人公众号&#xff1a;前端开源星球。 我们非常高兴地宣布&#xff0c;2024年10月28日&#xff0c;TinyVue 发布了 v3.19.0 &#x1f389;。 本次 3.19.0 版本主要有以下重大变更&#xff1a; 所有组件全面升级到 OpenTiny Design 新…

鸿蒙进阶篇-type、typeof、类

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

JavaWeb合集23-文件上传

二十三 、 文件上传 实现效果&#xff1a;用户点击上传按钮、选择上传的头像&#xff0c;确定自动上传&#xff0c;将上传的文件保存到指定的目录中&#xff0c;并重新命名&#xff0c;生成访问链接&#xff0c;返回给前端进行回显。 1、前端实现 vue3AntDesignVue实现 <tem…