ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

FPGA+Linux下7寸触摸屏驱动调试:设备树与内核配置实战

2026/9/13 21:25:57 拓冰建站 浏览量
FPGA+Linux下7寸触摸屏驱动调试:设备树与内核配置实战 做FPGA嵌入式开发的人迟早要碰到一个坎FPGA本身把时序、逻辑搞定但一旦和Linux打交道就发现完全是另一个世界。设备树、内核配置、驱动加载、中断上报每个环节都能让你卡上几天。尤其是“7寸触摸屏驱动”这个需求看起来只是一个外设驱动实际上牵扯到FPGA侧硬件设计、Linux内核配置、设备树编写、输入子系统甚至还有触摸屏本身上电时序的细节。我接触黑金云课堂这套FPGALinux开发流程有一段时间了也帮几个项目调过7寸触控方案。这篇文章就把我实际调通“7寸触摸屏驱动”的完整思路和操作细节整理出来。无论你是初学者刚啃完FPGA语法准备进入Linux驱动还是已经有Linux基础但第一次在FPGA平台上跑外设这篇文章应该都能帮到你。整个调试过程的核心说白了就是三件事第一搞清楚触摸屏硬件挂在哪个总线、哪个中断上第二用设备树描述清楚触摸芯片让内核能找到它第三把内核对应的触摸驱动打开然后验证坐标事件。看似简单但每一步都有不少坑。1. 方案选型与软硬件协同设计思路1.1 7寸触摸屏驱动到底要驱动什么很多刚接触Linux驱动的人看到“触摸屏驱动”这几个字就以为要自己从寄存器开始写一个完整的芯片驱动。其实在真实项目中绝大多数时候我们做的不是“写驱动”而是“移植驱动”。7寸屏的触摸部分通常有两种形态一种是电阻触摸屏用四线或五线电阻原理一般通过ADC采样坐标另一种是电容触摸屏普遍使用I2C或者SPI接口由一颗触控芯片完成电容变化检测、坐标计算然后通过I2C把坐标数据上报给主控。现在7寸电容触摸屏是绝对主流触控芯片常见的有汇顶的GT911、GT928系列思立微的FT5x06系列以及三星、海栎创等品牌的型号。黑金开发板套件里常见的7寸屏触控芯片大概率也是这些国产型号之一其中GT911出现的频率尤其高。这些触控芯片内部都有MCU自己完成电容扫描和坐标计算主控侧要做的就是三件事通过I2C读取坐标数据通过中断引脚接收“有触摸”的通知通过复位引脚控制芯片启动时序。Linux内核里已经有这些触控芯片的成熟驱动比如drivers/input/touchscreen/goodix.c就是汇顶系列的官方驱动。所以我们真正要做的事情是把硬件接对、把设备树配对、把内核选项打开。1.2 为什么FPGA开发板要用Linux跑触摸应用有朋友会问FPGA本身也是一种能自己定义逻辑的芯片触摸屏这点数据量直接用FPGA写个控制器不行吗为什么非要套一层Linux答案在于产品需求的复杂度。如果你只是在屏幕上画几个固定坐标的按钮FPGA硬逻辑直接判断触摸点落在哪个区域然后给一个高低电平信号这种做法完全可行响应还特别快。但一旦需要跑图形界面、支持多点触摸手势、联网更新配置、跑算法FPGA裸机方案就变成一场灾难。Linux的输入子系统、事件通知机制、图形栈这些都是现成的跨平台复用度也高。黑金云课堂这系列教程的核心思路就是典型的软硬件协同FPGA负责并行性要求高的部分比如显示时序生成、图像预处理、高速接口而Linux负责需要复杂管理和生态的部分比如文件系统、UI框架、外设驱动。触摸屏这种交互类外设天然适合归Linux管。具体到硬件平台跑Linux有两种选择。一种是用Zynq这类带ARM硬核的FPGAARM核直接运行LinuxFPGA作为可编程逻辑挂在旁边另一种是纯FPGA配一个软核处理器比如MicroBlaze但在上面跑Linux的效率和技术成熟度都远不如硬核。所以推荐有这种需求的直接选Zynq平台黑金的Zynq系列开发板跑这套方案非常省心。1.3 软硬件分工哪些放FPGA哪些放Linux实际开发中7寸触摸屏应用通常涉及显示和触摸两块一个完整的项目会这样分工显示部分可以由FPGA的PL逻辑实现RGB LCD时序或者用Zynq的DisplayPort控制器输出。7寸屏一般是RGB888接口需要像素时钟、行同步、场同步、使能信号。如果分辨率是1024x600像素时钟大概在51.2MHz左右这类并行时序用FPGA实现很简单资源消耗也很低。触摸部分则是典型的外设管理事务放在Linux侧处理。触摸屏的I2C接口和中断引脚一般接在PS侧的I2C控制器和GPIO上。这样Linux的I2C子系统可以直接操作总线触摸驱动注册中断后就能收到触摸事件。FPGA逻辑在触摸这条链路上通常不需要参与计算最多做法是做一个I2C mux或者电平转换控制之类的辅助逻辑但那属于扩展场景了。这种分工的逻辑很简单SPI、I2C这类低速串行总线的协议栈和驱动框架Linux都已经实现得非常成熟没必要在FPGA里重复造轮子。FPGA应该把资源留给真正需要并行计算的逻辑而不是去和内核抢外设管理的活。2. 硬件连接与接口设计要点2.1 7寸触摸屏的接口形态与关键信号拿到一块7寸触摸屏先别急着写代码要对着原理图把每个信号理清楚。7寸RGB屏的接口通常分成两大部分显示屏信号和触摸信号。显示屏信号包括RGB数据线一般是24位、像素时钟DCLK、行同步HSYNC、场同步VSYNC、数据使能DE、背光控制BL_EN可能还有电源控制和屏电源信号。触摸屏信号相对简单常见的就是四根线SCL、SDA、VCC供电脚、GND另外有些模组还会引出INT中断脚和RST复位脚。要注意的是触摸模组和屏幕本身经常是两套独立的供电域。有些屏的显示部分需要3.3V甚至5V的背光电压而触摸芯片的I/O口可能是1.8V或者3.3V电平。接错电平会烧芯片所以在看原理图时第一步要确认触摸芯片的工作电压和I2C上拉电压是接到同一组电源轨上的。黑金7寸屏的触摸接口一般都会和LCD FPC排线整合在一起或者单独引出一个FPC座上面已经画好了I2C和中断、复位引脚。拿到手后对着原理图把触摸芯片型号找出来再到芯片手册里确认I2C地址、复位时序这比任何调试都重要。我见过太多人第一件事是去翻设备树模板结果抄了一个完全不同的芯片型号最后卡了两天才发现驱动压根不匹配。2.2 Zynq平台上的引脚分配与连接方案以Zynq平台为例触摸屏接PS侧I2C是比较自然的选择。Zynq-7000系列有内置的I2C控制器可以配置为标准模式100Kbps或快速模式400Kbps完全满足触控芯片的通信需求。具体连接时建议用PS的I2C0或者I2C1把SDA和SCL引脚在约束文件里分配出来。中断引脚一般接PS端MIO引脚的GPIO功能复位引脚也接一个GPIO。这样的好处是Linux系统里I2C总线天生就有标准驱动GPIO中断可以通过设备树配置成触发模式不需要写任何自定义PL逻辑。也有一种方案是用PL侧做I2C控制器比如Xilinx提供的AXI IIC IP核再把中断通过IRQ_F2P连接到GIC。这样做的场景一般是PS侧的I2C数量用完了或者I2C接口被其他设备占用。不过在7寸触摸屏这种场景下完全没有必要增加复杂度直接PS侧I2C即可。中断引脚和复位引脚的连接需要特别注意上下拉。很多触控芯片的INT引脚是开漏输出外部需要接上拉电阻否则检测不到有效电平。看原理图时如果发现INT引脚悬空或者没有上拉建议手动补一个4.7K欧姆左右的上拉电阻到触摸芯片的IO电源域。另外INT引脚的电平极性也很关键GT911的INT默认是高电平触发但也可以通过配置切换为低电平触发这一点和驱动里的设备树描述是否一致直接决定了中断是否能够正常上报。2.3 上电时序与复位操作习惯触控芯片的上电时序是这个项目里最容易忽视、也最容易在实际硬件上翻车的一环。以GT911举例芯片正常工作需要按顺序完成复位先给VCC上电等待一段时间拉低RST复位引脚至少100微秒然后拉高再等待一段时间芯片才能与主机完成握手。为什么强调这个时序因为GT911的模式切换是通过复位期间INT引脚的电平状态决定的。具体来说GT911有两种I2C地址模式复位时INT引脚的电平会影响芯片的I2C地址是0x5D还是0x14。如果地址配置环节出了问题用i2cdetect扫不到设备就会怀疑驱动有bug实际上只是硬件时序没做对。在Linux驱动里良好的驱动实现会在设备树里配置reset-gpios由驱动在probe时自动完成复位时序。如果触控芯片本身没有复位要求只靠初始化配置也能工作那就省事很多。但GT911这类芯片建议老老实实把复位引脚接出来并且在设备树里配好reset-gpios让驱动控制复位时序这样可以避免因为上电乱序导致的“有时候能检测到、有时候检测不到”的诡异问题。3. Linux驱动移植与设备树配置3.1 内核驱动选项CONFIG怎么开Linux内核里触摸屏驱动位于drivers/input/touchscreen目录下汇顶GT9系列的驱动文件是goodix.c对应的Kconfig选项是CONFIG_TOUCHSCREEN_GOODIX。FT5x06系列对应的是edt-ft5x06.cKconfig选项是CONFIG_TOUCHSCREEN_EDT_FT5X06。调驱动之前先确认内核里有没有把这个驱动编译进去。如果你用的是PetaLinux可以在petalinux-config里通过内核菜单打开如果用传统方式编译内核直接运行make menuconfig进入Device Drivers - Input device support - Touchscreens子菜单。Device Drivers --- Input device support --- [*] Touchscreens --- * Goodix I2C touchscreen ---这是把驱动编译进内核的方式设置成ybuilt-in或者mmodule都可以但建议开发阶段直接编成y省去管理模块的麻烦。编成m的时候要记得把goodix.ko拷贝到根文件系统里并且处理依赖关系新手容易卡在这个细节上。启动之后可以用以下命令确认是否加载成功dmesg | grep goodix如果看到类似“goodix_ts 0-005d: GT911, contact number 5”的日志说明驱动已经成功识别到芯片了。要是没有任何输出那就要回到I2C枚举和硬件连接问题上去查。3.2 设备树节点编写的关键细节设备树是用来描述硬件连接关系的数据结构Linux内核启动时会根据设备树里的节点去匹配驱动。在Zynq平台上设备树文件一般位于arch/arm/boot/dts/目录下黑金的工程里可能有对应当前板卡的dts文件。在I2C总线节点下为触摸芯片添加子节点大致写法如下i2c0 { status okay; clock-frequency 400000; goodix_ts5d { compatible goodix,gt911; reg 0x5d; interrupt-parent gpio0; interrupts 54 0 IRQ_TYPE_LEVEL_HIGH; reset-gpios gpio0 55 GPIO_ACTIVE_HIGH; irq-gpios gpio0 54 GPIO_ACTIVE_HIGH; touchscreen-size-x 1024; touchscreen-size-y 600; }; };几个字段我解释一下compatible字段要和驱动里的of_device_id匹配比如goodix.c中的匹配表是“goodix,gt911”这种格式compatible写错驱动根本不会绑定。reg字段是I2C地址如果复位时序固定一般GT911为0x5d或0x14。interrupt-parent和interrupts用来描述中断连接到哪个GPIO控制器、哪个引脚其中中断标志用IRQ_TYPE_LEVEL_HIGH还是IRQ_TYPE_LEVEL_LOW要根据INT引脚实际极性。reset-gpios和irq-gpios是驱动需要操作的GPIO。touchscreen-size-x和touchscreen-size-y是触摸屏原始坐标的最大值这个值决定了坐标缩放比例。很多屏驱动有一个独立的max坐标参数和屏幕分辨率物理像素不是一回事。比如一块1024x600的屏幕触控芯片可能上报的坐标范围就是0-1023和0-599这两个值要尽可能准确否则会出现触摸点偏移一边的问题。3.3 设备树地址与中断标志的坑关于GT911的I2C地址我多补充几句。GT911在每次上电复位后根据INT引脚电平高低决定自己的I2C地址。如果INT引脚为高电平地址是0x5d如果INT引脚为低电平地址也可能是0x14具体要参考模组设计。这个设计常常让人困惑因为设备树里reg字段写死了地址但硬件上地址可能会变。处理方式有两种一是直接检查模组原理图确认地址引脚的状态从根源上固定地址然后设备树里写对应地址二是用i2cdetect扫描总线看看芯片实际挂在哪个地址上再倒过来写设备树。我在实际调试中遇到过更隐蔽的情况驱动里probe时会调用复位函数把INT拉低再拉高结果导致芯片地址从0x5d切换成了0x14。这种问题单靠设备树配置无法解决需要修改驱动初始化顺序或者保证复位时的电平状态和期望一致。这也是为什么我劝大家先把硬件时序吃透再去调设备树否则改来改去都是瞎猜。中断标志方面最常见的错误是把电平触发写成了边沿触发。GT911的中断在默认配置下是高电平意味着有触摸时INT引脚拉高读取完坐标后驱动用irq_set_irq_type切换类型或者直接转发给系统。把它配成IRQ_TYPE_LEVEL_HIGH是符合绝大多数模组默认行为的。但也有模组内部已经装了上拉反相电路实际是低电平触发这种就只能对着示波器量INT引脚的波形来判断。3.4 编译烧录与启动检查设备树和内核配置改好之后进入编译流程。如果使用PetaLinux可以在工程目录下执行petalinux-build -c kernel petalinux-build -c device-tree petalinux-package --boot --fsbl --fpga --u-boot --force如果是纯手工编译内核命令大概是make ARCHarm menuconfig make ARCHarm UIMAGE_LOADADDR0x8000 uImage make ARCHarm dtbs编译完成后通常需要将uImage、dtb文件、根文件系统镜像一起做成SD卡启动镜像或者通过网络tftp加载。黑金云课堂的资料包里一般都有完整的启动镜像生成说明这里不展开整条启动流程。系统启动后先看I2C总线上能不能枚举到设备这是最关键的一步。i2cdetect -y 0如果总线编号是0就查i2c-0总线如果是1就写-y 1。如果触摸芯片正常应该会在扫描列表里看到5d或者14。假如什么地址都没扫到排查方向就是硬件没接好、硬件I2C频率不匹配、触摸芯片没有正常上电或复位。不要怀疑驱动因为在i2cdetect这一步驱动根本还没参与这是纯硬件和底层I2C控制器层面的通信。扫描到设备之后用dmesg看内核日志。正常情况下能看到goodix相关的信息说明设备树绑定成功驱动已经开始初始化。此时再查看输入设备列表cat /proc/bus/input/devices找到触摸屏对应的event编号一般会是event1或event0。然后用hexdump直接抓事件hexdump /dev/input/event1手指触摸屏幕时会输出类似这样的数据0000000 0000 5e20 0000 0000 0003 0000 012c 0000 0000010 0000 5e20 0000 0000 0003 0001 00f0 0000 0000020 0000 5e20 0000 0000 0001 014a 0001 0000 0000030 0000 5e20 0000 0000 0000 0000 0000 0000这些数据的含义可以讲一下前四列是时间戳第五第六列是事件类型0003是EV_ABS绝对坐标0001是EV_KEY按键第七列是事件code0000对应ABS_X0001对应ABS_Y014a对应BTN_TOUCH最后一列是value值。看到ABS_X和ABS_Y有输出就说明触摸链路的整个大动脉已经通了。4. 触摸屏调试与问题排查实录4.1 显示与触摸的整体联调触摸屏驱动调通之后通常还面临一个和应用层的整合问题尤其是显示方向和触摸方向的一致性。这一点在调7寸屏时特别常见。很多板卡上LCD屏的安装方向、扫描顺序和触摸屏坐标轴并不一致结果就是“显示正常但点左上角光标跑到了右下角”。处理坐标方向的方式有两种一种是通过设备树属性例如touchscreen-inverted-x、touchscreen-inverted-y、touchscreen-swapped-x-y告诉内核需要翻转或交换坐标轴另一种是使用tslib做应用层校准。设备树属性适合坐标轴方向完全固定、不需要用户交互校准的场景。比如屏幕上下颠倒安装那就在触摸屏节点里加上touchscreen-inverted-y坐标翻转后方向就和显示一致了。这种方式简单高效但前提是你确认屏幕的物理安装方向和数据手册里的默认扫描方向不一致。对于需要应对不同屏幕方向或者希望精确校准的情况tslib是更通用的选择。在根文件系统里安装tslib之后运行ts_calibrate进行五点校准校准参数会写入ts.conf或者校准文件应用层通过tslib读取坐标时就会自动转换。这个方案在工控机上非常常见因为它不依赖内核驱动层的特殊修改。4.2 触摸没反应优先排查信号链路的三个环节触摸完全没反应的时候先冷静地按信号链路三个环节排查总线枚举、中断上报、事件输出。第一步是I2C枚举。执行i2cdetect如果摸不到设备地址那就是硬件层的问题检查电源、复位、上拉、地址引脚用示波器看SCL和SDA上有没有时钟和数据波形。很多情况下是上拉电阻没焊或者焊接虚焊导致SDA被拉低这时候总线上会表现为一直忙或者扫描不到设备。第二步是确认中断有没有发生。如果I2C能扫到设备驱动也正常识别了但hexdump /dev/input/eventX完全没输出大概率是中断没触发。先在设备树里加一段debugfs或者用GPIO中断测试方法检查中断配置。有一个很实用的技巧把中断触发类型改一下比如从level high改成level low试试如果没有反应再量一下INT引脚电平。如果触摸屏触摸时INT引脚确实有跳变但驱动没有响应那多半是中断号配置错了或者irq-gpios和interrupts描述的是不同的GPIO。第三步是看内核日志里有没有异常。如果驱动反复打印“I2C read error”之类的信息说明总线通信不稳定检查I2C频率是否过高、线缆是否过长尝试把clock-frequency从400000降到100000很多触摸不稳定问题直接就好了。4.3 坐标偏移与触摸跳变的处理经验坐标偏移是一个比较有迷惑性的故障。比如触摸某个点上报坐标偏差很大甚至触摸位置和显示位置严重不一致。这个时候要先判断偏移是固定比例还是随机漂移。固定比例偏移一般是坐标范围配置错误。设备树里的touchscreen-size-x和touchscreen-size-y如果比实际输出范围小内核会把原始坐标压缩到屏幕分辨率导致触摸点偏移。比如触控芯片上报范围是0-1023但设备树配置成0-511坐标就会整体缩小一半。所以先确认芯片手册里的输出范围再和设备树里的配置对齐。随机漂移或者跳动则可能是因为触摸屏的电源纹波太大或者触摸面板和显示面板之间的间距、接地问题。可以用示波器看触摸芯片电源纹波确保供电干净。电源纹波大的情况下触摸坐标会有规律的抖动这种通常不是代码能解决的要从硬件供电设计入手。另外还有一个容易被忽略的因素盖板玻璃或贴膜厚度太厚会导致电容触摸灵敏度下降导致按下后坐标漂移或者触摸点不稳。这种模拟问题在研发测试阶段不常出现但到了整机装配后就暴露出来。排查时要用排除法先裸屏测试再装外壳看故障是否复现。4.4 常见问题速查表我把调7寸触摸屏驱动过程中最常遇到的问题整理成了表格方便大家快速定位。现象可能原因排查方向i2cdetect扫不到地址硬件连接错误、上拉缺失、芯片未复位测电源、测SCL/SDA波形、复位时序扫到地址但驱动没识别compatible不匹配、设备树未加载检查设备树节点和驱动匹配表驱动识别但无事件输出中断配置错误、事件接口看错量INT波形、检查interrupts配置坐标明显偏移touchscreen-size-x/y配置错误对比芯片实际输出范围坐标翻转或镜像触摸轴方向和显示方向不一致配置touchscreen-inverted-x/y触摸偶尔失灵I2C干扰、电源纹波、频率过高降I2C频率改善供电触摸响应慢中断触发方式导致忙等确认是电平触发还是边沿触发驱动报I2C read error总线时序异常或地址不稳定用逻辑分析仪看I2C通信过程这张表只覆盖了比较高频的问题实际项目里遇到的奇葩问题肯定更多。但排查思路永远是先硬件后软件先链路后配置不要一上来就怀疑内核驱动有bug。触摸屏驱动在Linux里已经非常成熟绝大多数情况下问题都是出在“连接”和“描述”的层面。5. 进阶玩法与场景扩展5.1 多点触摸与手势支持7寸电容触摸屏通常支持5点甚至10点触摸只要触控芯片本身支持内核的触摸驱动也会注册相应数量的触点。input子系统上报时使用BTN_TOUCH表示主触点按下使用ABS_MT_*系列事件上报多点信息。驱动起来后如果应用层用的标准Qt或者GTK多点手势一般不需要额外开发框架会自动处理缩放、旋转等手势。但如果是在裸机或者轻量级图形环境里做就需要自己解析ABS_MT_SLOT和ABS_MT_POSITION_X/Y这涉及Linux multi-touch协议Type A和Type B的知识。想深入研究的可以查内核文档Documentation/input/multi-touch-protocol.rst。当前比较实际的做法是用Qt的QML开发界面触摸事件直接封装成QTouchEvent应用代码根本不用关心底层协议细节。这也是为什么很多人推荐FPGALinux的产品要上Qt因为触摸交互本来就是Qt的强项。5.2 触摸屏数据与FPGA逻辑联动在某些应用场景下触摸坐标数据不止要给Linux应用层用还要反馈回FPGA逻辑侧做实时响应。比如FPGA在屏幕上画了一条动态曲线用户手指滑动时触摸坐标要快速改变曲线形状如果经过程序的应用层转发再到PL侧延迟可能会偏高。这种场景下有一种更高效的架构触摸中断触发后Linux驱动把坐标写入某种共享内存FPGA侧通过AXI接口读取共享内存的数据直接进行图形渲染。Zynq平台上可以通过AXI BRAM Controller或者AXI GPIO做一个简单的共享区域驱动把input子系统上报的坐标镜像一份到共享内存PL逻辑直接读。不过这种架构会绕开Linux input子系统的标准框架复杂度会上升不少。我的建议是除非延迟指标真的严格到必须走PL侧处理否则还是老老实实走应用层。多数人感知到的微小的触摸延迟其实是显示刷新率不够而不是触摸链路慢。5.3 从黑金平台迁移到其他FPGA平台的注意事项黑金云课堂上用Zynq平台调通的这套方案迁移到其他FPGA平台的时候主要变化在硬件层描述。换了芯片型号设备树和boot流程会不一样换了触摸芯片compatible和reg可能要改了重新编译内核。从Linux驱动的角度触摸芯片的驱动是通用的。比如goodix驱动无论你用的是Xilinx、Intel还是国产FPGA芯片平台的ARM核只要I2C控制器标准兼容设备树写对了都能跑。所以真正需要迁移的反而是设备树中中断号和GPIO号怎么对应到新平台的具体引脚。国产FPGA平台这些年用的人越来越多很多芯片也自带ARM核。换平台时最耗时间的其实是内核BSP适配而不是触摸驱动本身。所以如果只是调一个触摸屏完全可以沿用现成的Linux内核把重点放在设备树和启动镜像上。5.4 其他触摸方案在FPGA平台上的思路除了I2C接口的电容触摸屏实际项目中还会碰到带USB接口的电容触摸屏以及红外触摸框。USB接口的触摸屏属于HID设备Linux内核自带usbhid驱动插上就能用基本不需要移植。设备树里也不用特殊配置因为USB是枚举型总线设备会自动上报。红外触摸框则是另一个思路它自带一颗控制芯片通过串口或USB输出坐标数据。虽然从原理上不算“触摸屏驱动”了但在大尺寸交互设备上非常常见。如果你的项目从7寸屏扩展到大屏交互可以参考触摸框厂商提供的通信协议写一个简单的串口解析应用把坐标转成input子系统事件。整体而言7寸触摸屏驱动只是Linux外部设备接入的一个样本。一旦你把I2C设备树、中断配置、Input子系统这套流程跑顺了以后接其他传感器和触摸设备都会顺手很多。最后分享一个我自己的经验调试这类外设驱动不要总想着改代码很多时候真正的问题出现在硬件电路和时序上。调通一次之后把这套流程固化下来从查原理图到设备树、内核配置、事件验证按顺序走你会发现大部分问题都能在半小时内定位。FPGALinux的组合虽然看起来门槛高但流程清晰后其实就是熟练工。这大概也是黑金云课堂这类教程存在的意义把开荒者踩过的坑提前填平让后来者少走弯路。