
1. 从零开始为什么选择Microchip Linux4SAM作为嵌入式Linux的起点如果你刚刚接触嵌入式Linux面对市面上琳琅满目的开发板树莓派、BeagleBone、各种国产派和复杂的BSP板级支持包可能会感到无从下手。我最初也有同样的困惑直到我开始接触Microchip的SAM系列MPU和它的Linux4SAM项目。经过几个项目的实战我发现对于希望从“单片机思维”平稳过渡到“Linux系统思维”的开发者或者需要一个稳定、文档齐全的工业级平台进行产品原型开发的团队Linux4SAM是一个非常理想的切入点。简单来说Linux4SAM是Microchip官方为其基于ARM Cortex-A内核的SAM系列微处理器MPU提供的完整Linux发行版和支持生态系统。它不仅仅是一个内核源码仓库更是一个包含了U-Boot引导程序、设备树、根文件系统构建工具Yocto/OpenEmbedded、以及大量驱动和示例的“交钥匙”解决方案。当你拿到一块像SAM9X60、SAMA5D2或SAMA7G5这样的开发板时Linux4SAM能让你在最短的时间内从一个空白的板子启动到一个功能完整的Linux系统并立即开始应用开发。这解决了嵌入式Linux入门最大的几个痛点硬件适配的复杂性、软件工具链的断裂和文档支持的缺失。你不用再花几周时间去手动移植U-Boot、调试设备树、裁剪内核这些最耗时且容易出错的基础工作Microchip已经帮你做好了。你可以直接跳过这些“脏活累活”把精力集中在你的应用程序和产品差异化功能上。对于初学者这意味着你可以快速获得正反馈看到系统启动、点亮LED、读取传感器从而建立信心对于有经验的开发者这意味着一个可靠的底层基础可以让你专注于上层业务逻辑。2. Linux4SAM生态全景核心组件与资源地图要高效利用Linux4SAM首先得搞清楚它到底包含了什么以及这些资源都在哪里。很多人一开始会迷失在官网的各种链接和仓库里这里我为你画一张清晰的“资源地图”。2.1 官方核心资源仓库Microchip将Linux4SAM的相关资源主要托管在三个地方理解它们的定位至关重要Linux4SAM GitHub 组织这是最活跃的开发中心。关键仓库包括linux4sam/linux-at91: 这是主线内核。Microchip的工程师会将针对SAM MPU的补丁和驱动持续提交到Linux内核社区并定期将最新的稳定内核版本同步到这个仓库打上必要的AT91平台补丁。对于新产品开发建议基于此仓库。linux4sam/u-boot-at91: 同理这是集成了AT91平台支持的U-Boot引导程序仓库。linux4sam/yocto-meta-atmel: 这是Yocto项目的层Layer。Yocto是一个用于构建定制化Linux发行版的框架这个meta层包含了构建SAM MPU系统镜像包括内核、U-Boot、根文件系统的所有配方recipes、配置和机器定义。这是构建完整系统镜像最推荐的方式。linux4sam/at91bootstrap: SAM MPU通常需要一个小型的、在U-Boot之前运行的二级引导程序用于初始化最基础的硬件如DDR内存、时钟并加载U-Boot。at91bootstrap就是这个角色。Microchip 官方开发者网站这是文档和稳定版本发布的中心。Linux4SAM 主页面这里提供了概览、下载链接和入门指南。软件包提供预编译好的SD卡镜像、工具链、以及对应特定内核版本的补丁包对于不想用Git的用户。文档包括硬件参考设计、数据手册、以及最重要的——SAM Linux内核驱动程序指南。这份文档详细说明了如何配置和使用SAM芯片上的各种外设如MAC、SDMMC、ADC、LCD等的Linux驱动是驱动开发者的圣经。Microchip 论坛遇到问题时这里是寻求社区帮助和查看历史问题的最佳场所。很多工程师和Microchip的技术支持专家会在这里活跃。2.2 开发工具链构建系统的选择你需要一套工具来编译内核、U-Boot和应用程序。Linux4SAM主要支持两种构建方式Yocto Project / OpenEmbedded这是官方主力推荐的构建系统。它功能强大可以构建从引导程序到根文件系统的完整、可复现的系统镜像。通过meta-atmel层你只需几条命令就能配置和构建针对特定开发板如sama5d27_som1_ek-sd的镜像。它的学习曲线稍陡但一旦掌握对于管理复杂的产品软件依赖和版本控制是无价的。对于追求产品化、需要定制文件系统、管理多个软件包的项目Yocto是必选项。Buildroot这是一个更简单、更快速的嵌入式Linux构建系统。它采用菜单配置类似Linux内核的make menuconfig可以快速生成一个精简的根文件系统。Linux4SAM社区也有对Buildroot的支持适合快速原型验证、对系统尺寸极其敏感、或者不想深入Yocto复杂性的场景。个人经验对于纯粹的应用开发者如果官方提供的预编译SD卡镜像已经包含了所需驱动你可以直接使用该镜像然后通过apt-get或opkg取决于文件系统来安装额外的软件包无需自己构建整个系统。这能让你最快地跑起来。2.3 硬件平台如何选择你的第一块开发板Microchip提供了丰富的SAM MPU开发板选择哪一块开始呢入门之选SAM9X60 Curiosity / SAMA5D2 Xplained UltraSAM9X60基于ARM9内核主频可达600MHz性价比极高。它运行的是较老的Linux 4.x内核但生态系统成熟资料丰富。适合学习Linux基础、工业控制、HMI等对算力要求不高的场景。SAMA5D2基于Cortex-A5内核主频可达500MHz性能优于ARM9且能运行主线内核。Xplained Ultra板载资源丰富以太网、LCD接口、音频编解码器、Arduino接口扩展性强是学习现代嵌入式Linux外设驱动的绝佳平台。性能与未来之选SAMA7G54 / SAMA7G5这是Microchip最新的MPU系列基于Cortex-A7内核主频可达1GHz并集成了强大的图形处理单元GPU和视频编解码器。如果你需要开发带GUI如Qt的复杂人机界面、或涉及视频处理的应用SAMA7G是面向未来的选择。它需要运行Linux 5.x或更高版本的内核。选择建议如果你是学生或个人爱好者考虑成本SAM9X60 Curiosity是很好的起点。如果你是工程师为产品做技术预研建议直接上手SAMA5D2 Xplained Ultra或SAMA7G5因为它们代表了更现代的内核和架构学习经验更具迁移性。3. 实战第一步让开发板“跑起来”的完整流程理论说得再多不如动手一试。这里我以最经典的SAMA5D2 Xplained Ultra开发板为例详细走一遍从零到系统启动的完整流程。这个过程适用于大多数Linux4SAM板卡细节略有不同。3.1 准备工作硬件与软件清单硬件SAMA5D2 Xplained Ultra开发板。一张至少8GB的Micro SD卡Class 10或更高速度影响镜像烧写和系统启动。USB转Micro-USB线用于串口调试和供电。网线用于网络调试和文件传输。5V电源适配器当需要独立供电时使用。软件串口终端工具Windows用Putty/Tera TermmacOS/Linux用screen或minicom。SD卡烧录工具balenaEtcher跨平台推荐或Win32DiskImagerWindows。预编译镜像从Microchip开发者网站下载对应你开发板的最新“SD Card Image”。3.2 烧录镜像与首次上电下载镜像访问Microchip官网找到SAMA5D2 Xplained Ultra的页面在“Software”部分找到最新的Linux4SAM SD卡镜像通常是一个.img或.wic文件。烧录SD卡打开balenaEtcher选择下载的镜像文件选择你的SD卡驱动器然后点击“Flash!”。这个过程会擦除SD卡所有数据。连接硬件将烧录好的SD卡插入开发板的SDMMC0卡槽。用USB线连接开发板的DEBUG USB口到电脑。这个接口既提供电源也包含了一个USB转串口芯片通常是CP210x或FTDI。连接网线到开发板的以太网口可选但强烈建议方便后续SSH登录。启动串口终端在电脑上识别出新的串口设备Windows在设备管理器查看COM号Linux/macOS通常是/dev/ttyUSB0。配置串口终端波特率115200数据位 8停止位 1无校验无流控。上电与观察给开发板上电通过USB或外部电源。立即在串口终端中观察输出。你会看到类似下面的启动日志RomBOOT AT91Bootstrap 3.9.0-00009-gf110492 (2023-10-11 16:02:22) ... U-Boot 2023.10 (Nov 15 2023 - 14:30:00 0000) CPU: SAMA5D27 1Ghz DRAM: 256 MiB ... Hit any key to stop autoboot: 0如果不按任何键U-Boot会自动从SD卡加载内核并启动。几秒钟后你会看到内核解压、设备树加载、驱动初始化的信息滚动最后出现登录提示符... [ OK ] Started Serial Getty on ttyS0. [ OK ] Reached target Login Prompts. Welcome to Arago 2023.12 (GNU/Linux 6.1.46-linux4sam-2023.10 aarch64) sama5d2-xplained login:恭喜你的嵌入式Linux系统已经成功启动了。默认用户名是root无需密码。3.3 基础系统探索与网络配置登录系统后你可以像使用任何Linux服务器一样操作它。查看系统信息uname -a # 查看内核版本和架构 cat /proc/cpuinfo # 查看CPU信息 free -h # 查看内存使用情况 df -h # 查看存储空间配置网络如果使用DHCP 预编译镜像通常已经配置了DHCP。你可以用ifconfig或ip addr查看获取到的IP地址。ip addr show eth0如果显示inet字段有一个IP地址如192.168.1.100说明网络已通。你现在可以从主机通过SSH登录开发板了这比串口操作方便得多ssh root开发板IP更新软件包如果镜像支持 一些基于Yocto的镜像可能集成了opkg包管理器。你可以尝试更新软件源并安装一些常用工具如vim,htop等。opkg update opkg install vim htop踩坑提示第一次启动时如果串口没有任何输出请按顺序检查1) 串口线是否连接在DEBUG USB口2) 串口终端波特率是否为1152003) SD卡是否插牢、镜像是否烧录成功4) 开发板供电是否充足。最常犯的错误是波特率不对或串口号选错。4. 超越预编译使用Yocto构建自定义系统镜像使用预编译镜像快速上手后下一步必然是定制自己的系统也许你需要更新内核到特定版本需要添加特定的驱动模块或者需要裁剪文件系统以节省空间。这时就必须请出Yocto了。4.1 Yocto环境搭建与meta-atmel层集成假设你在Ubuntu 20.04/22.04 LTS系统上进行构建。安装依赖包sudo apt-get update sudo apt-get install gawk wget git diffstat unzip texinfo gcc build-essential \ chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils \ iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ python3-subunit mesa-common-dev zstd liblz4-tool file locales libacl1获取Yocto核心组件 Yocto项目通过repo工具管理多个Git仓库。我们使用其长期支持版本kirkstone或更新版本请参考meta-atmel层说明。mkdir linux4sam-yocto cd linux4sam-yocto # 初始化repo并同步kirkstone分支 repo init -u https://github.com/linux4sam/meta-atmel -b kirkstone repo sync这个过程会下载包括pokyYocto核心、meta-openembedded以及meta-atmel在内的所有层。初始化构建环境# 设置环境变量并创建一个名为build的构建目录 DISTROatmel DISTROatmel MACHINEsama5d27-som1-ek-sd source ./setup-environment build这里的MACHINE变量指定了目标机器。对于SAMA5D2 Xplained Ultra正确的机器名是sama5d27-som1-ek-sd尽管板子名字叫Xplained但其核心是SOM1模块。执行后你会自动进入build目录。4.2 配置与构建你的第一个镜像在build目录下核心配置文件是conf/local.conf。你可以根据需要修改它例如修改并行编译线程数以加快速度BB_NUMBER_THREADS 8设置下载缓存目录DL_DIR /home/yourname/yocto-downloads选择镜像配方Yocto通过“镜像配方”来定义最终生成什么。meta-atmel提供了一些预定义的镜像。atmel-qt5-demo-image: 包含Qt5图形框架和演示程序适合带屏幕的应用。core-image-base: 一个包含基础命令行工具和库的镜像。core-image-minimal: 绝对最小的可启动镜像。 我们以构建一个基础镜像为例bitbake core-image-base开始构建运行上述命令后Yocto会开始一个漫长的过程下载所有源代码、配置、编译工具链、编译内核、U-Boot、根文件系统等。首次构建可能需要数小时取决于你的网络和CPU性能。它会利用DL_DIR缓存下载的文件后续构建会快很多。获取输出构建成功后最终的镜像文件位于build/tmp/deploy/images/sama5d27-som1-ek-sd/目录下。最重要的文件是core-image-base-sama5d27-som1-ek-sd.wic这是一个可以直接用balenaEtcher烧录到SD卡的完整磁盘镜像。zImage压缩的内核镜像。at91-sama5d27_som1_ek.dtb设备树二进制文件。u-boot.binU-Boot镜像。将.wic文件烧录到SD卡插入开发板启动你就运行在自己构建的系统上了4.3 常见定制操作添加自定义软件包在conf/local.conf文件中添加IMAGE_INSTALL:append package-name例如添加nginx和python3IMAGE_INSTALL:append nginx python3。然后重新运行bitbake core-image-base。修改内核配置Yocto提供了交互式内核配置菜单。bitbake -c menuconfig virtual/kernel配置完成后保存退出它会自动生成一个碎片fragment配置文件。之后重新构建内核即可bitbake -c compile -f virtual/kernel bitbake -c deploy virtual/kernel。开发自己的应用你可以创建自己的Yocto层bitbake-layers create-layer在里面编写自己应用程序的配方.bb文件然后将其添加到bblayers.conf中这样你的应用就能被集成到系统镜像里。构建经验Yocto构建非常消耗磁盘空间建议预留100GB以上和内存。在local.conf中设置BB_NUMBER_THREADS和PARALLEL_MAKE为你CPU的核心数可以大幅提升编译速度。如果构建失败仔细查看错误日志通常在tmp/work/.../temp/下的log.do_*文件错误信息通常很明确。5. 驱动与外设开发让硬件“活”起来系统跑起来后下一步就是控制硬件。在Linux下这主要通过驱动和设备树Device Tree来完成。对于应用开发者更常见的是通过sysfs、设备文件或内核提供的框架如IIO、Input、FrameBuffer来访问外设。5.1 理解设备树硬件的“描述文件”设备树是一个描述硬件拓扑结构的数据结构。它告诉内核这块板子上有什么硬件CPU、内存、外设以及它们如何连接地址、中断号、时钟等。对于SAM MPU设备树源文件.dts位于Linux内核源码的arch/arm/boot/dts/或arch/arm64/boot/dts/目录下。例如SAMA5D2 Xplained Ultra的设备树文件是at91-sama5d27_som1_ek.dts。如果你想启用某个默认未启用的外设比如第二个SPI控制器你需要修改设备树。但在Yocto环境中更规范的做法是创建一个设备树覆盖Device Tree Overlay或修改机器配置。一个简单的例子通过设备树配置一个GPIO LED。 假设你想控制开发板上的一个用户LED对应PA23引脚。在设备树中找到leds节点或添加一个leds { compatible gpio-leds; led-blue { label blue; gpios pioA 23 GPIO_ACTIVE_LOW; linux,default-trigger heartbeat; }; };重新编译设备树更新系统后这个LED就会自动被/sys/class/leds/blue控制并且默认会有心跳闪烁效果。5.2 使用Sysfs操作GPIO即使没有在设备树中声明你也可以通过sysfs直接操作GPIO。这是最快速测试GPIO功能的方法。例如操作PA23引脚对应GPIO编号需要计算对于A端口编号 (32 * port_number) pin_number。PA23 (32*0)23 23注意内核GPIO编号是全局的需要查看/sys/class/gpio/gpiochip*/label和base来确定。更简单的方法是使用gpiofind命令如果镜像包含gpiod工具gpiofind “PA23”假设找到的GPIO编号是480。# 导出GPIO echo 480 /sys/class/gpio/export # 设置为输出方向 echo out /sys/class/gpio/gpio480/direction # 输出高电平 echo 1 /sys/class/gpio/gpio480/value # 输出低电平 echo 0 /sys/class/gpio/gpio480/value # 取消导出 echo 480 /sys/class/gpio/unexport5.3 使用标准框架访问外设对于复杂外设推荐使用内核提供的统一框架。IIO框架用于ADC、陀螺仪等SAMA5D2的ADC驱动已经集成到IIO框架。你可以通过/sys/bus/iio/devices/来访问。# 查看ADC设备 ls /sys/bus/iio/devices/ # 假设设备是iio:device0读取通道1的原始值 cat /sys/bus/iio/devices/iio\:device0/in_voltage1_rawPWM框架通过/sys/class/pwm/控制。Input框架用于按键、触摸屏事件会出现在/dev/input/eventX可以用evtest工具测试。5.4 编写简单的用户空间应用一个简单的C程序通过sysfs控制上面提到的LED#include stdio.h #include stdlib.h #include string.h #include unistd.h #define GPIO_PATH /sys/class/gpio/gpio480 #define GPIO_EXPORT /sys/class/gpio/export #define GPIO_UNEXPORT /sys/class/gpio/unexport int main() { FILE *fp; // 导出GPIO if ((fp fopen(GPIO_EXPORT, w)) NULL) { perror(Export failed); return -1; } fprintf(fp, %d, 480); fclose(fp); sleep(1); // 等待内核创建目录 // 设置为输出 char direction_path[100]; snprintf(direction_path, sizeof(direction_path), %s/direction, GPIO_PATH); if ((fp fopen(direction_path, w)) NULL) { perror(Set direction failed); goto unexport; } fprintf(fp, out); fclose(fp); // 闪烁LED 5次 char value_path[100]; snprintf(value_path, sizeof(value_path), %s/value, GPIO_PATH); for (int i 0; i 5; i) { if ((fp fopen(value_path, w)) NULL) { perror(Set value failed); break; } fprintf(fp, 1); fclose(fp); sleep(1); if ((fp fopen(value_path, w)) NULL) { perror(Set value failed); break; } fprintf(fp, 0); fclose(fp); sleep(1); } unexport: // 取消导出 if ((fp fopen(GPIO_UNEXPORT, w)) ! NULL) { fprintf(fp, %d, 480); fclose(fp); } return 0; }用交叉编译工具链如aarch64-poky-linux-gcc编译这个程序拷贝到开发板上运行就能看到LED闪烁了。驱动开发心得对于产品开发强烈建议通过设备树正确配置外设并使用内核的标准框架如GPIO LED、PWM、IIO来访问。这能保证驱动的可维护性和可移植性。直接操作/sys/class/gpio只适合临时测试。在修改设备树时务必参考内核文档Documentation/devicetree/bindings/和meta-atmel层里的现有例子。