GEC6818开发板是一款基于三星s5p6818处理器的嵌入式开发平台,这颗64位ARM Cortex-A53芯片在物联网和智能设备开发领域非常常见。我第一次接触这块板子是在一个智能家居网关项目里,当时就被它均衡的性能和丰富的接口所吸引。相比市面上其他开发板,GEC6818最大的优势在于支持完整的64位系统运行环境,这意味着你可以充分利用ARMv8架构的特性,比如更高效的NEON指令集和更大的内存寻址空间。
为什么要选择64位Linux系统?实测下来,在运行Python机器学习推理、视频解码等任务时,64位系统的性能比32位系统提升约20-30%。我遇到过不少开发者还在使用老旧的32位系统,结果在部署OpenCV等库时各种兼容性问题频出。而像Ubuntu 16.04(Xenial)这样的64位系统,不仅软件生态丰富,还能直接使用apt-get安装大多数现成的ARM64软件包。
说到系统选择,友善之臂(FriendlyElec)提供的Smart6818系统镜像是个不错的起点。他们维护的内核版本是4.4.y长期支持版,这个版本对s5p6818的GPU、VPU等外设驱动支持相对完善。记得第一次尝试用官方Ubuntu镜像时,WiFi和GPU加速直接就能用,这省去了很多移植驱动的时间。不过要注意,不同厂商的系统镜像可能存在硬件兼容性问题,比如粤嵌提供的旧系统就无法直接使用友善之臂的内核。
在开始烧录前,你需要准备好以下硬件:
这里有个容易踩的坑:SD卡质量参差不齐。有次我用某杂牌SD卡烧录后系统频繁卡死,换成三星EVO Plus后就再没出现过问题。建议购买时选择大品牌的高速卡,毕竟系统运行时也需要频繁读写SD卡。
在Ubuntu电脑上需要安装这些工具:
bash复制sudo apt update
sudo apt install -y gdisk git wget pv unzip
重点说下烧录工具的选择。Windows用户可以用Win32DiskImager,但在Linux环境下我更推荐直接用dd命令,配合pv进度显示工具:
bash复制sudo dd if=system.img of=/dev/sdX bs=4M status=progress
如果下载的是压缩过的镜像文件,可以管道解压直接烧录:
bash复制unzip -p s5p6818-sd-friendlycore-xenial-4.4-arm64-20220115.img.zip | sudo dd of=/dev/sdX bs=4M status=progress
推荐从友善之臂官网下载最新镜像:
bash复制wget http://112.124.9.243/dvdfiles/s5p6818/images-for-eflasher/friendlycore-arm64-images.tgz
镜像名称中的关键信息解读:
friendlycore:基于Ubuntu Core的精简系统arm64:64位ARM架构xenial:Ubuntu 16.04基础4.4:Linux内核版本我对比过几个版本,发现2022年之后的镜像对触摸屏支持更好。如果开发板带LCD,建议选择日期较新的版本。
首先用fdisk查看SD卡设备号(千万别选错设备!):
bash复制sudo fdisk -l
通常SD卡会显示为/dev/sdX(X可能是b/c/d等)。确认无误后,先卸载已有分区:
bash复制sudo umount /dev/sdX*
使用sgdisk彻底清除旧分区表:
bash复制sudo sgdisk --zap-all /dev/sdX
解压下载的镜像压缩包:
bash复制tar xvzf friendlycore-arm64-images.tgz
进入解压目录,运行烧录脚本:
bash复制cd sd-fuse_s5p6818
sudo ./fusing.sh /dev/sdX friendlycore-arm64
这里有个实用技巧:如果只想测试uboot,可以临时把rootfs.img改名为rootfs.img.bak,然后创建一个空文件:
bash复制mv friendlycore-arm64/rootfs.img friendlycore-arm64/rootfs.img.bak
touch friendlycore-arm64/rootfs.img
这样能大幅缩短烧录时间,实际使用时再恢复原文件即可。
烧录完成后,在Ubuntu上检查SD卡分区:
bash复制sudo fdisk -l /dev/sdX
应该能看到三个分区:
用mount命令挂载检查文件完整性:
bash复制sudo mount /dev/sdX1 /mnt
ls /mnt
sudo umount /mnt
将烧录好的SD卡插入开发板的启动卡槽(通常是标有"BOOT"的卡槽,我遇到过有些板子两个卡槽都能启动,但优先级不同)。接上串口调试器时,要注意:
推荐使用picocom作为串口终端:
bash复制sudo apt install picocom
sudo picocom -b 115200 /dev/ttyUSB0
正常启动时,串口会输出类似以下信息:
code复制U-Boot 2016.03 (Jan 15 2022 - 15:32:18 +0800)
CPU: S5P6818@1.4GHz
DRAM: 1 GiB
MMC: S5P_MSHC2: 0, S5P_MSHC3: 1
In: serial
Out: serial
Err: serial
Net: Net Initialization Skipped
No ethernet found.
Hit any key to stop autoboot: 0
如果卡在uboot阶段,可以尝试在倒计时时按任意键进入uboot命令行,输入printenv查看环境变量。常见问题是bootcmd设置不正确,可以用以下命令临时修改:
code复制setenv bootcmd "mmc dev 1; ext4load mmc 1:1 0x48000000 Image; ext4load mmc 1:1 0x49000000 s5p6818-gec6818.dtb; booti 0x48000000 - 0x49000000"
saveenv
boot
问题1:内核panic无法启动
解决方案:
问题2:屏幕显示异常
解决方法:
code复制setenv bootargs "console=ttySAC0,115200 root=/dev/mmcblk1p2 rootwait fbcon=rotate:1"
问题3:网络不可用
解决方法:
克隆sd-fuse工具仓库:
bash复制git clone https://github.com/friendlyarm/sd-fuse_s5p6818
替换uboot镜像文件:
bash复制cp u-boot.bin sd-fuse_s5p6818/friendlycore-arm64/fip-nonsecure.img
执行烧录:
bash复制cd sd-fuse_s5p6818
sudo ./fusing.sh /dev/sdX friendlycore-arm64
挂载SD卡的boot分区:
bash复制sudo mount /dev/sdX1 /mnt
替换内核镜像:
bash复制sudo cp arch/arm64/boot/Image /mnt/Image
更新设备树:
bash复制sudo cp arch/arm64/boot/dts/s5p6818-gec6818.dtb /mnt/
对于小规模更新,可以直接chroot进去操作:
bash复制sudo mount /dev/sdX2 /mnt
sudo chroot /mnt
apt update
apt install package-name
exit
大规模更新建议重新生成rootfs.img:
bash复制make_ext4fs -l 3072M -s rootfs.img rootfs/
利用SD卡和eMMC分别存放不同系统:
要实现自动切换,可以修改uboot环境变量:
code复制setenv bootcmd "if mmc dev 1; then run sd_boot; else run emmc_boot; fi"
bash复制tune2fs -o journal_data_writeback /dev/mmcblk1p2
tune2fs -O ^has_journal /dev/mmcblk1p2
bash复制dd if=/dev/zero of=/var/swapfile bs=1M count=512
mkswap /var/swapfile
swapon /var/swapfile
bash复制echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
以调试I2C设备为例,首先确认驱动加载:
bash复制ls /dev/i2c-*
使用i2c-tools测试:
bash复制i2cdetect -y 0
如果设备无响应,检查设备树中的i2c节点是否启用:
bash复制fdtdump /boot/s5p6818-gec6818.dtb | less