龙芯久久派开发入门:从环境搭建到GPIO点灯实战 1. 项目概述从“点灯”开始走进龙芯久久派的世界如果你刚拿到一块龙芯久久派开发板看着这块搭载了国产龙芯2K0300处理器的精致板卡心里既兴奋又有点无从下手那么“点灯”就是你最好的起点。这几乎是所有嵌入式开发者的“Hello World”一个看似简单的动作背后却串联起了从硬件认知、环境搭建、到代码编写、系统交互的完整开发链条。对于久久派这样一款基于龙芯自主指令集架构LoongArch的开发板这个过程更是理解其独特生态的绝佳入口。龙芯2K0300是龙芯中科推出的面向嵌入式领域的高性价比处理器而久久派则是围绕它打造的一款功能丰富的开源硬件平台。它不仅仅是一块开发板更是我们接触、学习和应用龙芯技术栈的桥梁。通过控制一颗LED灯的亮灭我们将亲手触摸到LoongArch指令集的脉搏理解如何在龙芯的Loongnix或LoongOS系统上进行应用开发并掌握其特有的交叉编译与调试方法。这远不止是让一个灯闪烁而是开启一扇门门后是物联网、边缘计算、工业控制等众多基于自主核心技术的应用场景。2. 久久派开发环境全解析与搭建在点亮LED之前我们必须把“战场”准备好。与常见的ARM架构开发板如树莓派、STM32不同龙芯久久派使用的是LoongArch架构这意味着我们通常的x86或ARM电脑无法直接编译出能在它上面运行的程序。因此搭建一个高效的交叉编译环境是第一步也是最关键的一步。2.1 硬件准备与连接首先确保你手头的久久派板卡和必要的周边设备已经就位。我建议你按照以下清单核对久久派开发板确认型号通常为标准版或带无线模块的版本。电源适配器推荐使用5V/2A或更高规格的Type-C电源。供电不足可能导致板子运行不稳定尤其是在连接外设时。MicroSD卡容量16GB或以上Class10或U1速度等级。这是系统的“硬盘”非常重要。USB转TTL串口模块这是初期调试和登录系统的生命线。久久派板载了调试串口通常是UART0你需要一个像CH340、CP2102这类常见的模块。杜邦线用于连接串口模块和久久派的调试串口针脚TX、RX、GND。网线可选但推荐用于有线网络连接比Wi-Fi初始配置更稳定。LED和电阻为了“点灯”实验你需要一个发光二极管LED和一个220Ω至1kΩ的限流电阻。当然久久派板载可能已经有用户LED但外接一个能让你更清晰地理解GPIO操作。连接串口是关键步骤。将USB转TTL模块的TX引脚连接到久久派调试串口的RX引脚RX连接久久派的TXGND对接GND。切记不要接错更不要将VCC接到板子上以免损坏设备。在电脑上使用终端软件如Windows的Putty、MobaXterm或macOS/Linux的screen、minicom连接对应的串口端口波特率通常设置为115200数据位8停止位1无奇偶校验。2.2 系统镜像烧录与启动久久派通常运行Loongnix基于Linux或LoongOS。官方资料汇集帖如网络资料中提到的提供了系统镜像的下载链接。你需要从百度网盘或Git仓库下载最新的系统镜像文件通常是.img或.iso格式。使用烧录工具如Raspberry Pi Imager,balenaEtcher, 或dd命令将镜像写入MicroSD卡。将烧录好的SD卡插入久久派连接串口和电源。上电后在串口终端里你将看到系统的启动日志。首次启动可能需要一些时间进行初始化。成功启动后你会看到登录提示符。默认的登录用户名和密码通常是loongson或root具体请查阅你下载的镜像说明文档。注意烧录镜像会清空SD卡所有数据请提前备份。确保使用可靠的烧录工具并验证烧录完整性避免因镜像损坏导致无法启动。2.3 交叉编译工具链部署这是LoongArch开发的核心环节。因为我们的开发主机Host多是x86_64架构而目标板Target是LoongArch64架构所以需要交叉编译工具链。根据网络资料官方提供的工具链下载链接为http://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz。在你的开发主机以Ubuntu为例上可以按以下步骤操作# 1. 下载工具链也可以先在浏览器下载再传到主机 wget http://ftp.loongnix.cn/toolchain/gcc/release/loongarch/gcc8/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz # 2. 解压到合适目录例如 /opt sudo tar -xJf loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3-1.tar.xz -C /opt # 3. 将工具链路径添加到系统环境变量 echo export PATH/opt/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.3/bin:$PATH ~/.bashrc source ~/.bashrc # 4. 验证安装 loongarch64-linux-gnu-gcc --version如果安装成功命令会输出gcc的版本信息并且明确显示Target: loongarch64-linux-gnu。至此你的开发主机就具备了为久久派编译程序的能力。2.4 本地开发与远程调试环境配置为了提高效率我强烈建议配置SSH和网络文件系统如NFS。配置网络通过串口登录久久派使用ifconfig或ip addr查看网络接口。如果有线网口如eth0已连接它可能会通过DHCP自动获取IP。你也可以手动配置。更便捷的方式是配置Wi-Fi如果板子支持资料中的B站视频链接提供了相关教程。启用SSH大多数Linux镜像默认已安装SSH服务器。使用systemctl start ssh启动服务systemctl enable ssh设置开机自启。然后就可以在开发主机上通过ssh username板子IP远程登录了告别串口终端。搭建NFS可选但高效在开发主机上搭建NFS服务器将代码目录共享出来。在久久派上挂载这个NFS共享目录。这样你可以在主机上编辑代码直接在共享目录里编译然后在板子上运行无需反复拷贝文件极大提升迭代速度。3. “点灯”实战从硬件原理到代码实现环境就绪现在让我们聚焦核心目标——控制GPIO点亮LED。我们将采用最直接、最能理解底层原理的方式通过操作Linux系统的Sysfs GPIO接口。3.1 硬件电路与GPIO引脚识别首先我们需要确定使用哪个GPIO引脚。你需要查阅久久派的原理图资料帖中有提供或板卡手册找到可供用户使用的GPIO引脚及其对应的物理引脚号例如板载LED可能连接在GPIO12上。为了演示我们假设使用GPIO12来控制一个外接LED。硬件连接很简单将LED的正极长脚通过一个220Ω的限流电阻连接到GPIO12LED的负极短脚连接到板子的GND地引脚。电阻必不可少用于限制电流保护GPIO口和LED。在Linux系统中GPIO号并不是物理引脚号而是内核中的编号。有时需要根据芯片数据手册进行换算。对于久久派一个简便的方法是查看系统中的GPIO映射。登录板子系统可以查看/sys/class/gpio/目录或者使用gpiod工具如果已安装来探测。3.2 Sysfs GPIO控制方法详解Linux Sysfs GPIO接口是一种经典的文件系统操作方式非常直观。以下是在板子系统内部直接操作的步骤# 1. 导出GPIO引脚。假设我们要操作的GPIO在内核中的编号是12。 echo 12 /sys/class/gpio/export # 执行后会生成 /sys/class/gpio/gpio12 目录 # 2. 设置引脚方向为输出。 echo out /sys/class/gpio/gpio12/direction # 3. 控制引脚电平点亮LED。 echo 1 /sys/class/gpio/gpio12/value # 输出高电平 # 等待一秒 sleep 1 # 熄灭LED echo 0 /sys/class/gpio/gpio12/value # 输出低电平 # 4. 取消导出操作完成后 echo 12 /sys/class/gpio/unexport这就是最基础的Shell脚本点灯。但我们的目标是在主机上编写C程序交叉编译后传到板子上运行。3.3 交叉编译C语言点灯程序在开发主机上创建一个名为blink.c的文件#include stdio.h #include stdlib.h #include unistd.h #include fcntl.h #include string.h #define GPIO_PIN 12 // 根据实际使用的GPIO号修改 #define GPIO_PATH /sys/class/gpio/ #define GPIO_EXPORT GPIO_PATH export #define GPIO_UNEXPORT GPIO_PATH unexport #define GPIO_DIR GPIO_PATH gpio GPIO_PIN /direction #define GPIO_VAL GPIO_PATH gpio GPIO_PIN /value int write_to_file(const char *filename, const char *value) { int fd open(filename, O_WRONLY); if (fd 0) { perror(Failed to open file); return -1; } if (write(fd, value, strlen(value)) 0) { perror(Failed to write to file); close(fd); return -1; } close(fd); return 0; } int main() { printf(Blinking LED on GPIO %s...\n, GPIO_PIN); // 1. 导出GPIO if (write_to_file(GPIO_EXPORT, GPIO_PIN) 0) { fprintf(stderr, Maybe GPIO %s already exported?\n, GPIO_PIN); // 继续尝试不直接退出 } // 2. 设置为输出模式 if (write_to_file(GPIO_DIR, out) 0) { perror(Set direction failed); return 1; } // 3. 闪烁10次 for (int i 0; i 10; i) { // 点亮 if (write_to_file(GPIO_VAL, 1) 0) { perror(Set high failed); break; } sleep(1); // 熄灭 if (write_to_file(GPIO_VAL, 0) 0) { perror(Set low failed); break; } sleep(1); } // 4. 取消导出 (可选系统重启后会自动清理) // write_to_file(GPIO_UNEXPORT, GPIO_PIN); printf(Done.\n); return 0; }使用我们之前安装的交叉编译工具链进行编译loongarch64-linux-gnu-gcc -static -o blink_loongarch blink.c-static参数进行静态链接将程序依赖的库都打包进可执行文件这样可以避免板子系统上缺少某些动态库而无法运行的问题对于简单的测试程序非常方便。3.4 程序上传、执行与验证将编译生成的blink_loongarch文件通过SCP命令传到久久派上scp blink_loongarch loongson板子IP:~/然后通过SSH登录板子给程序添加执行权限并运行ssh loongson板子IP chmod x blink_loongarch sudo ./blink_loongarch # 操作GPIO通常需要root权限如果一切顺利你将看到LED开始闪烁每秒一次共10次。恭喜你你已经成功在龙芯久久派上完成了第一个硬件控制程序实操心得第一次操作时最容易出错的地方是GPIO编号和权限。如果程序报错“Permission denied”记得用sudo运行。如果提示“Device or resource busy”可能是该GPIO已被系统其他驱动比如LED触发器占用可以尝试换一个未使用的GPIO或者先取消其他占用如echo none /sys/class/leds/xxx/trigger。4. 深入理解GPIO操作的高级方式与框架通过Sysfs操作GPIO虽然直观但效率较低且在现代Linux开发中更推荐使用libgpiod库或直接进行内存映射MMAP操作。这对于追求高性能或需要精确时序控制的应用至关重要。4.1 使用libgpiod库进行开发libgpiod是Linux官方推荐的GPIO用户空间库它提供了更简洁、更安全的API。首先你需要在久久派系统上安装libgpiod的开发包如果镜像未预装sudo apt update sudo apt install libgpiod-dev libgpiod-doc更常见的做法是在交叉编译时需要将主机的交叉编译工具链指向包含libgpiod头文件和库的路径但这通常需要先在主机上为LoongArch架构交叉编译libgpiod库本身过程较为复杂。一个更简单的方法是直接在久久派系统上编译使用libgpiod的程序这对于学习API是可行的。一个使用libgpiod的简单点灯程序示例#include gpiod.h #include stdio.h #include unistd.h int main() { const char *chipname gpiochip0; // GPIO控制器名称 struct gpiod_chip *chip; struct gpiod_line *line; int ret; // 打开GPIO芯片 chip gpiod_chip_open_by_name(chipname); if (!chip) { perror(Open chip failed); return 1; } // 获取GPIO线假设偏移量为12即GPIO12 line gpiod_chip_get_line(chip, 12); if (!line) { perror(Get line failed); gpiod_chip_close(chip); return 1; } // 请求将线设置为输出初始低电平 ret gpiod_line_request_output(line, blink-example, 0); if (ret 0) { perror(Request line as output failed); gpiod_line_release(line); gpiod_chip_close(chip); return 1; } // 闪烁LED for (int i 0; i 10; i) { gpiod_line_set_value(line, 1); sleep(1); gpiod_line_set_value(line, 0); sleep(1); } // 释放资源 gpiod_line_release(line); gpiod_chip_close(chip); return 0; }在板子上用gcc编译运行即可。libgpiod的优势在于它更规范支持更多高级功能如事件监听且不依赖缓慢的sysfs文件操作。4.2 内存映射MMAP与寄存器直接操作对于实时性要求极高的场景比如生成精确的PWM波形绕过操作系统内核直接操作GPIO寄存器是最快的方式。这需要开发者深入了解龙芯2K0300芯片的寄存器手册直接读写物理内存地址。警告此操作风险极高不当操作可能导致系统崩溃或硬件损坏仅适用于深度开发且清楚自己在做什么的开发者。基本原理是打开/dev/mem设备文件。使用mmap系统调用将GPIO控制器的物理内存地址映射到用户空间的虚拟地址。通过指针操作这些映射后的地址读写寄存器。由于涉及具体芯片的寄存器地址和位域定义代码与硬件强相关此处不展开详细代码。但思路是找到GPIO方向寄存器如GPIO_DIR和数据寄存器如GPIO_DATA的物理地址通过计算偏移量控制特定引脚。4.3 集成到应用框架以LoongMui为例网络资料中提到了“LoongMui”项目Gitee链接。这是一个为龙芯开发板包括久久派设计的图形界面或应用框架示例。对于更复杂的应用比如你想做一个带图形界面控制LED的桌面程序或者将GPIO控制嵌入到一个网络服务中就需要考虑框架集成。例如在LoongMui或Qt for LoongArch这样的图形框架中你可以将GPIO控制逻辑通过libgpiod或系统调用封装写成一个后台服务或一个类然后由前端的按钮点击事件来触发。这标志着你的开发从简单的命令行测试进入了真正的应用开发阶段。5. 项目扩展与实战应用场景成功点灯只是一个开始。基于这个基础我们可以探索更多有趣且实用的项目将久久派的能力真正发挥出来。5.1 实现呼吸灯效果PWM模拟久久派的GPIO本身可能不支持硬件PWM但我们可以用软件模拟。原理是通过循环快速改变GPIO高低电平的占空比。// 简化的软件PWM思路 void soft_pwm(int gpio_pin, int duty_cycle, int period_ms) { // duty_cycle: 占空比 (0-100) // period_ms: PWM周期毫秒 int on_time period_ms * duty_cycle / 100; int off_time period_ms - on_time; // 这里需要实现微秒级延时如usleep来控制更平滑 // 点亮 set_gpio_high(gpio_pin); delay_ms(on_time); // 熄灭 set_gpio_low(gpio_pin); delay_ms(off_time); } // 在主循环中调用并逐渐改变duty_cycle即可实现呼吸效果。通过改变一个周期内高电平的时间比例就能调节LED的视觉亮度。虽然软件PWM精度和稳定性不如硬件但对于指示灯效果绰绰有余。5.2 结合传感器输入如按键控制让LED与外界交互。例如连接一个轻触开关到另一个GPIO引脚并配置为输入模式。当检测到按键按下时改变LED的状态亮/灭/闪烁模式。// 伪代码 int led_pin 12; int button_pin 13; setup_gpio(led_pin, OUTPUT); setup_gpio(button_pin, INPUT_PULLUP); // 上拉输入 while(1) { if (read_gpio(button_pin) LOW) { // 按键按下 toggle_gpio(led_pin); // 翻转LED状态 delay_ms(200); // 简单防抖 while(read_gpio(button_pin) LOW); // 等待按键释放 delay_ms(200); } }这就构成了一个最简单的输入-输出系统是许多物联网设备的原型。5.3 构建网络控制服务这是将本地硬件能力开放到网络的关键一步。你可以在久久派上运行一个简单的Web服务器如使用Python的Flask、Bottle框架或C语言的mongoose库创建一个HTTP API。# 一个使用Flask的简单示例 (在久久派上运行) from flask import Flask, request import os app Flask(__name__) LED_PATH /sys/class/gpio/gpio12/value app.route(/led/state) def control_led(state): if state in [on, 1]: with open(LED_PATH, w) as f: f.write(1) return LED ON elif state in [off, 0]: with open(LED_PATH, w) as f: f.write(0) return LED OFF else: return Invalid command if __name__ __main__: app.run(host0.0.0.0, port8080)运行这个脚本后你在同一局域网的手机或电脑浏览器访问http://久久派IP:8080/led/on就能远程点亮LED。这为智能家居、远程监控等应用打下了基础。5.4 迈向更复杂的应用与“YOLO”等AI应用的结合网络热词中提到了“龙芯2k300 yolo”。龙芯2K300处理器具备一定的算力足以运行轻量级的AI模型。你可以将“点灯”作为AI推理结果的输出端。例如在久久派上部署一个轻量级YOLO模型如YOLOv5s需要转换为适合LoongArch的推理框架如ncnn、TNN等。使用USB摄像头资料中提到了USB摄像头方案采集图像。运行模型进行目标检测。当检测到特定目标比如“人”时控制GPIO点亮LED作为报警指示。这就完成了一个完整的“感知-思考-执行”的嵌入式AI边缘计算原型。虽然性能无法与高端GPU相比但在很多低功耗、实时性要求的场景如特定物体出现报警、简单分类任务中非常有用。6. 开发中的常见问题与深度排查指南在龙芯久久派的开发过程中你肯定会遇到各种问题。这里我总结了一些典型问题及其排查思路希望能帮你少走弯路。6.1 交叉编译工具链问题问题执行loongarch64-linux-gnu-gcc提示“未找到命令”或“Permission denied”。排查检查环境变量PATH是否正确设置。可以通过echo $PATH查看或直接使用绝对路径/opt/工具链路径/bin/loongarch64-linux-gnu-gcc。确保解压后的bin目录下有该文件并且有可执行权限。问题编译程序时提示“找不到头文件”或“链接库错误”。排查交叉编译时如果需要链接第三方库如libgpiod你需要该库针对LoongArch架构的版本。通常需要自行交叉编译该库。对于简单的标准C库程序使用-static静态链接可以避免大部分库依赖问题。6.2 系统启动与串口连接问题问题上电后串口无任何输出。排查电源确认电源适配器功率足够5V/2AType-C线缆能传输数据和电力。串口连接再三检查TX/RX是否接反GND是否连接。尝试交换TX和RX。串口参数确认波特率是否为115200数据位8停止位1无校验无流控。SD卡镜像重新烧录官方提供的镜像确保烧录过程无误。硬件尝试更换USB转TTL模块或USB端口。问题系统启动到一半卡住或报错。排查观察卡住前的最后几条日志信息。可能是文件系统损坏、内核不匹配或硬件驱动问题。尝试更换SD卡或重新下载、烧录镜像。6.3 GPIO控制失败问题问题执行echo 12 export时提示Device or resource busy。排查该GPIO可能已被内核的其他子系统占用。常见于板载LED其驱动可能以LED类设备注册。你可以检查/sys/class/leds/目录下是否有对应的设备并尝试将其触发器设置为noneecho none | sudo tee /sys/class/leds/xxx/trigger。或者换一个原理图上标明未使用的GPIO引脚。问题能导出GPIO但设置方向或值时提示Permission denied。排查操作/sys/class/gpio下的文件需要root权限。确保使用sudo执行你的程序或命令。在编写自启动服务时也要注意权限问题。问题LED不亮但程序似乎运行正常。排查硬件连接用万用表测量GPIO引脚在输出1时的电压应为高电平如3.3V。检查LED极性是否接反电阻阻值是否过大。GPIO编号确认你操作的GPIO内核编号与物理引脚对应关系是否正确。最可靠的方法是查阅官方提供的引脚复用表。引脚复用有些GPIO引脚可能默认被配置为其他功能如I2C、SPI。需要查阅手册确保在设备树Device Tree或内核启动参数中该引脚被正确配置为GPIO功能。对于久久派通常用户可用的GPIO已经是通用功能。6.4 网络与远程访问问题问题无法通过SSH连接。排查IP地址通过串口登录用ip addr确认板子的IP地址。SSH服务运行systemctl status ssh检查服务是否运行。如果没有安装使用sudo apt install openssh-server安装。防火墙检查是否有防火墙规则阻止了SSH端口默认22。网络连通性在主机上ping板子的IP确认网络层是通的。问题NFS挂载失败。排查首先确保主机NFS服务已启动且共享目录已正确导出/etc/exports配置。在板子上使用showmount -e 主机IP查看可用的共享列表。挂载时注意权限可以尝试在挂载命令中添加-o nolock参数解决某些锁服务问题。6.5 性能与稳定性调优当项目复杂后你可能会关心性能。Sysfs太慢如前所述对于高频操作Sysfs是瓶颈。切换到libgpiod或内存映射方式。系统负载使用top或htop命令监控CPU和内存使用情况。如果运行AI应用关注CPU各核心的利用率。龙芯2K300是多核处理器确保你的应用能够利用多线程。实时性标准Linux内核并非实时操作系统。如果对GPIO翻转时序有微秒级精度要求可以考虑使用内核的GPIO字符设备/dev/gpiochipX配合libgpiod或者探索为内核打上PREEMPT_RT实时补丁的可能性这需要自行编译内核难度较高。开发龙芯久久派的过程是一个不断遇到问题、查阅资料善用官方论坛、QQ群和Git仓库、动手尝试和解决问题的循环。每一次成功的点亮不仅是一个LED更是你对自主技术体系理解的一次点亮。从最基础的GPIO控制出发你可以逐步深入到驱动开发、内核裁剪、应用部署最终将它打造成满足你特定项目需求的强大工具。