Luckfox Pico Mini PWM LED （pwm-leds）设备树配置与控制流程
本文总结了在 Luckfox Pico Mini 开发板上，通过 设备树（DTS）配置 PWM LED 外设 并通过内核提供的 sysfs 接口进行控制的完整流程。内容包含涉及的文件路径和具体配置示例，适合初学者理解设备树与 PWM LED 驱动的关系。1. PWM 控制器节点在 SoC 厂商提供的 DTS 文件 rv1106.dtsi 中，PWM 控制器已经定义如下：pwm0: pwm@ff350000 { compatible = "rockchip,rv1106-pwm", "rockchip,rk3328-pwm"; reg = <0xff350000 0x10>; interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>; #pwm-cells = <3>; pinctrl-names = "active"; pinctrl-0 = <&pwm0m0_pins>; clocks = <&cru CLK_PWM0_PERI>, <&cru PCLK_PWM0_PERI>; clock-names = "pwm", "pclk"; status = "disabled"; // 顶层 DTS 可以覆盖为 "okay" };配置说明compatible：匹配 SoC 的 PWM 驱动reg：PWM 控制器寄存器地址#pwm-cells = <3>：描述 pwms 属性格式pinctrl-0：对应 PWM 输出引脚clocks / clock-names：时钟绑定status = "disabled"：顶层 DTS 中覆盖为 "okay" 可启用2. LED 外设节点（pwm-leds）在顶层 DTS 中添加 pwm_leds 节点，示例：/ { model = "Luckfox Pico Mini"; compatible = "rockchip,rv1103g-38x38-ipc-v10", "rockchip,rv1103"; pwm_leds { compatible = "pwm-leds"; pwm_user_led { label = "pwm-user-led"; pwms = <&pwm0 0 1000000 0>; // PWM0, 通道0, 周期1ms (1kHz), 占空比0 max-brightness = <255>; linux,default-trigger = "none"; }; }; };关键字段说明compatible = "pwm-leds"：指定 LED 驱动pwms = <&pwm0 0 1000000 0>：<PWM控制器 通道 周期(ns) 占空比>max-brightness：最大亮度值linux,default-trigger：默认触发器，可选 "none", "heartbeat", "timer" 等3. 编译 DTS 并更新内核顶层 DTS 编译命令：make dtbs # 然后将生成的 dtb 文件替换到板子上编译完成后，重新启动开发板查看 sysfs 节点：ls /sys/class/leds/ # 输出示例： # pwm-user-led4. 手动控制 LED通过 sysfs 控制 LED 亮度：# 设置亮度为一半 echo 128 > /sys/class/leds/pwm-user-led/brightness # 设置全亮 echo 255 > /sys/class/leds/pwm-user-led/brightness # 关闭 LED echo 0 > /sys/class/leds/pwm-user-led/brightness对于 PWM LED，brightness 会直接改变占空比。5. Trigger 控制（可选）查看可用 trigger：cat /sys/class/leds/pwm-user-led/trigger设置 trigger：# heartbeat trigger（仅支持 invert 属性，周期不可调） echo heartbeat > trigger echo 1 > invert # timer trigger（可设置 delay_on / delay_off 调整周期） echo timer > trigger echo 500 > delay_on echo 500 > delay_off注意事项一个 LED 同一时间只能有一个 triggerheartbeat trigger 在你的 PWM LED 驱动下 仅提供 invert 属性，无法调整闪烁频率timer trigger 可以自由设置高低电平持续时间平滑呼吸灯需要使用 用户空间脚本 调节 brightness，内核 trigger 默认不提供平滑曲线6. 内核配置相关相关配置影响 LED 驱动和 trigger 行为：CONFIG_LEDS_PWM：使 PWM LED 驱动可用CONFIG_LEDS_TRIGGER_PWM：允许 trigger 使用 PWM 占空比CONFIG_LEDS_TRIGGER_TIMER：支持 timer trigger（可调周期）CONFIG_LEDS_TRIGGER_HEARTBEAT：提供 heartbeat triggerCONFIG_LEDS_TRIGGER_ACTIVITY：提供系统 I/O activity trigger示例路径：内核默认配置：/home/mango/Luckfox/luckfox-pico/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig7. 总结流程确认 PWM 控制器节点，并在顶层 DTS 中启用在 DTS 中定义 pwm-leds 外设编译 DTS 并更新内核查看 /sys/class/leds/ 下是否出现 LED通过 brightness 或 trigger 控制 LED如需平滑效果，可通过用户空间脚本控制 PWM 占空比参考文件sysdrv/source/kernel/arch/arm/boot/dts/rv1106.dtsi（SoC 厂商提供的 PWM 控制器定义）顶层 DTS（ sysdrv/source/kernel/arch/arm/boot/dts/rv1103g-luckfox-pico-mini.dts）/sys/class/leds/pwm-user-led/（LED 控制 sysfs 接口）内核配置文件：luckfox-pico/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106_linux_defconfig附：示例手动控制命令# 设置 LED 半亮 echo 128 > /sys/class/leds/pwm-user-led/brightness # 设置 heartbeat trigger 并反转逻辑 echo heartbeat > /sys/class/leds/pwm-user-led/trigger echo 1 > /sys/class/leds/pwm-user-led/invert # 设置 timer trigger 并控制周期 echo timer > /sys/class/leds/pwm-user-led/trigger echo 500 > /sys/class/leds/pwm-user-led/delay_on echo 500 > /sys/class/leds/pwm-user-led/delay_off结论：通过 DTS 配置 PWM LED 节点，可以在内核启动时创建对应的 sysfs 接口，并通过 brightness 或 trigger 控制 LED。复杂的平滑呼吸或自定义闪烁周期可通过 timer trigger 或用户空间 PWM 脚本实现。系列文章使用 Buildroot 交叉编译 Vitetris 到 Luckfox ARM 开发板的完整实践与经验总结Luckfox Pico Mini 入门学习笔记：GPIO LED 驱动与设备树实践Luckfox Pico Mini PWM LED （pwm-leds）设备树配置与控制流程【当前文章】
在这里找到适合自己系统的编译好的安装包，比如我是linux，x86-64位架构，我选择了2.1的旧版本，因为版本太新的话依赖的相关lib你的系统未必是最新的，只是学习用旧一点没事。于是找到下载地址。安装就很简单了一句话搞定，不用wget下来直接给网址就行sudo rpm -i https://www.nasm.us/pub/nasm/releasebuilds/2.10/linux/nasm-2.10-1.x86_64.rpm安装完成后就能执行nasm命令了$ nasm -v NASM version 2.10 compiled on Mar 12 2012用汇编写一个hello world; hello_world.asm ; ; Author: C.L ; Date: 11-11-2022 global _start ; 程序入口 section .text: _start: mov eax, 0x4 ; 使用 write 系统调用函数（x86架构决定的） mov ebx, 1 ; 使用标准输出作为fd(write函数的参数1) mov ecx, message ; 使用自定义的字符串作为输出内容 mov edx, message_length ; 字符串长度，也是传递给write用的 int 0x80 ; 中断，让CPU去执行eax寄存器指定的syscall(也就是write) ; 接着定义返回值，直接返回0即可（返回别的也行，随便） mov eax, 0x1 mov ebx, 0 int 0x80 section .data message: db "Hello World!", 0xA ; 0xA是换行符 message_length equ $-message ; 字符串长度 编译保存为 hello_world.asm 后编译，编译完成后查看当前文件夹下生成了编译完成的object文件。如果你的机器是32位的那么把 elf64 改成 elf32 即可。$ nasm -f elf64 -o hello_world.o hello_world.asm $ ls hello_world.asm hello_world.o链接继续执行链接，生成最终的可执行程序。可以看到已经生成了最终的 hello_world 可执行程序。如果你的机器是32位的那么把 elf_x86_64 改成 elf_i386 即可。$ ld -m elf_x86_64 -o hello_world hello_world.o $ ls hello_world hello_world.asm hello_world.o运行$ ./hello_world Hello World!以上就是如何在linux下安装汇编编译器的方法，希望对看到这里的小伙伴有帮助。
灵魂拷问，我应该更改 SSH 端口吗？偶尔我会在网上看到有关 SSH 端口更改的讨论。很多人说应该修改端口，这会挡掉很多暴力破解的人。而反对派则认为修改端口不但没有提高安全性（因为可以通过端口扫描检测到），反而还有可能让攻击者对你更有兴趣。那么到底修改还是不修改就看你自己喽。整体流程修改ssh配置文件，添加新的端口号让防火墙允许新的端口号通过使用新端口登录测试修改ssh配置文件删掉旧端口号（22）让防火墙禁用旧端口号（22）我采取了一个看上去很繁琐的步骤，但这是为了防止你注销并因配置失败而无法再次登录。现在让我们来看看设置。本文当前端口（旧端口）为22，修改后的端口（新端口）为8822。修改ssh配置文件，添加新的端口号首先更改 SSH 设置。以下命令使用 vim 进行编辑，你也可以使用你喜欢的编辑器。$ sudo vim /etc/ssh/sshd_config修改成以下的样子。减号表示删除行，加号表示添加行。- #Port 22 + Port 22 + Port 8822sshd_config修改完成以后用下面的命令重启sshd服务。$ sudo systemctl restart sshd让防火墙允许新的端口号通过由于有防火墙的存在，所以使用以下命令开放这个新端口。$ sudo ufw allow 8822/tcp $ sudo ufw reload使用新端口登录测试用新端口进行登录测试确保新端口已经可用。如果你无法使用新端口登录，请查看ssh设置或防火墙设置。修改ssh配置文件删掉旧端口号（22）SSH设置同样的，继续删掉旧端口的设置。$ sudo vim /etc/ssh/sshd_config同样的，减号表示删除行，加号表示添加行。- Port 22 + #Port 22sshd_config设置完成后重启sshd服务。$ sudo systemctl restart sshd让防火墙禁用旧端口号（22）首先确认一下当前防火墙状态$ sudo ufw status你会看到至 动作 来自 - -- -- 22 ALLOW Anywhere 8822/tcp ALLOW Anywhere 22 (v6) ALLOW Anywhere (v6) 8822/tcp (v6) ALLOW Anywhere (v6)可以看到新旧规则都存在，删掉旧的！$ sudo ufw delete allow 22/tcp $ sudo ufw reload这样就完成端口的修改了。当然，就像标题写的那样，如果你希望共用多个端口，那么你也可以保留旧端口或者开启多个新的端口。最后在关闭旧端口之前一定要确保你可以使用新端口登录。如果你不能访问物理服务器的话，不能登录ssh意味着你将失去对服务器的控制，千万要谨慎。希望这篇文章对你有用，祝好运。
查看Linux是多少位数getconf LONG_BIT 查看cpu详细信息 cat /proc/cpuinfo 查看cpu核心数量cat /proc/cpuinfo | grep 'cpu cores' | uniq 查看cpu型号cat /proc/cpuinfo | grep 'model name' | uniq 查看内存总数cat /proc/meminfo | grep MemTotal 查看硬盘空间大小(不包括未挂载的硬盘)df -h