首页 > 系统相关 >粤嵌GEC6818开发板 手动制作64位Linux系统启动SD卡

粤嵌GEC6818开发板 手动制作64位Linux系统启动SD卡

时间:2024-12-13 10:02:40浏览次数:7  
标签:系统启动 uboot docs 分区 sudo boot 开发板 64 gec6818

背景:

之前的帖子中也提到了,可以用FriendlyARM提供的sd_fuse工具制作可以给使用S5P6818 SOC设备使用的SD卡,由于GEC6818的配置和三星Nexell的Raptor,drone开发板以及友善的nanopi3系列本质是很相近的,所以他们的系统、uboot、甚至是bootloader小加修改就可以跑在粤嵌的GEC6818开发板上面,使用sd fuse工具制作在CSDN上面已经有详细的帖子教大家了,就不再赘述,现在我们使用Linux系统基本dd,fdisk,tar等命令来实现bl和uboot的写入,boot分区,rootfs分区,user分区的数据写入。这个掌握之后其实可以发现安装ArchLinux,Gentoo等系统是非常简单的。

开始之前照例先上两张效果图:

启动日志输出在屏幕:

a6b0b8ecc9c14d44bbd5713afa8c8bac.jpeg

系统登录:

ef4288abb6f044cd9ad0651be2f1d13e.jpeg

系统启动流程:

之前24年8月修改开发了一个工具mk6818,用于调试bl1和u-boot,我补充了大致的启动流程在README,需要研究代码的同学可以去github查看:

https://github.com/celeron633/mk6818

这里介绍下大概:

下面介绍的bl1,bl2,bl33等名称全部按ATF的规范解释,即bl1为芯片上面的bootrom,bl2为bl1加载的一个类似于uboot-spl的程序,用于初始化DDR等外设,设置PLL频率。

上电之后,芯片内部的bootrom(bl1)会启动,这个是SOC出厂就写好的程序,无法修改,bootrom会根据引脚的选择,优先选择从内部MMC,或者外部SD,或者USB,串口启动。粤嵌GEC6818选择的优先启动位于SD0上面的SD卡。也就是下图中,蓝色排线对着那个槽。

5610f7db08674c9ea567e1d935983585.jpeg

另一个槽位是SD3,好像是不能被bootrom搜索到的,不过启动到uboot之后,插了卡照样是能启动里面的系统的。SD2粤嵌和FriendlyARM都没有引出卡槽,复用成其他接口了。

bootrom会搜索上面描述的那些设备的第1个扇区,里面有NISH信息描述bl2的位置,大小,加载在哪里,从哪个地址启动等信息,详情请看mk6818的README。读取bl2到内存后,然后跳转到了bl2,代码就进入到了bl2的领空了,这个时候,由于我们是armv8的64位启动了,按照ARM的ATF(ARM Trusted Firmware)规范,接下来会加载执行bl31(fip-loader.img),bl32(fip-secure.img),bl33(fip-nonsecure.img,也就是uboot了)。其中前面两个的代码ARM有开源,不过SOC厂商会修改,所以ARM开源的我们是不能用的。

能不能让bl1直接加载uboot,uboot再启动内核呢,其实粤嵌现有的32位系统就是这样的。没有那两个fip-loader和fip-secure。64位其实也可以,我自己就是用mk6818制作带nish的uboot,然后usb启动调试uboot的。但是这样有个问题,SMC调用没有在bl2中实现,Linux内核是没有办法跑起来的,内核需要调用SMC管理8个CPU核心的电源。这个有个波兰大神rafaello7已经实现了,后面再聊聊他的修改,我暂时还没有看懂。

ARM开源的ATF的链接如下:

GitHub - ARM-software/arm-trusted-firmware: Read-only mirror of Trusted Firmware-A

波兰大佬rafaello7修改bl1,支持smc调用的commit,看懂需要熟悉armv8的中断处理和GIC那一套。

added psci handler preliminary version · rafaello7/bl1-nanopi-m3@6792971 · GitHub

准备:

硬件:

需要准备一个读卡器,一张空白的SD卡,大于16G为妙,8G也能用。再小有点勉强了。

读卡器如果笔记本有,可以直接使用笔记本的。

eb60cba527c9405ca52eaaaab58d2d38.jpeg

软件:

准备一个Linux环境,windows没有dd,fdisk那些玩意,当然你要是用cygwin那些那当我没有说。

我使用的opensuse的Leap 15.6系统。你也可以使用ubuntu,arch,gentoo,centos任意GNU Linux系统。

需要下载的东西:

最好先clone整个repo:

GitHub - celeron633/docs_gec6818: 粤嵌GEC6818文档

东西全部都在prebuilt目录下,repo里面还有电路图等资料,prebuilt为预编译的一些二进制文件。

bl2:docs_gec6818/prebuilt/bl_and_uboot/bl1-mmcboot-sd.bin at master · celeron633/docs_gec6818 · GitHub

不要纠结为啥名字是bl1,按atf的规范,这个就是bl2

bl31:

docs_gec6818/prebuilt/bl_and_uboot/fip-loader.img at master · celeron633/docs_gec6818 · GitHub

bl32:

docs_gec6818/prebuilt/bl_and_uboot/fip-secure.img at master · celeron633/docs_gec6818 · GitHub

bl33(uboot编译后,处理生成的img文件):

docs_gec6818/prebuilt/bl_and_uboot/fip-nonsecure-GEC6818.img at master · celeron633/docs_gec6818 · GitHub

boot分区备份的targz文件:

docs_gec6818/prebuilt/boot/boot.tar.gz at master · celeron633/docs_gec6818 · GitHub

还有个最重要的rootfs:

http://112.124.9.243/dvdfiles/s5p6818/rootfs/rootfs-ubuntu-noble-core-arm64.tgz

这个我们从FriendlyARM的服务器下载,放GitHub有点大了,不用lfs无法上传的。

rootfs不区分FriendlyARM的板子还是GEC6818

其他:

然后就是有空闲的时间和折腾的心态了。毕竟这个我觉得比安装ArchLinux还是麻烦一点的,不过也不是太多。

分区:

警告:这一步操作很危险,你要是弄错了要分区的块设备,可能导致分区表丢失,或者写到其他硬盘造成数据丢失。操作前一定要确认好是sdb,还是sdc还是sdd,这个每个人由于插的硬盘数不同,所以都不太一样。要是这个都不会建议还是先学习基础,先不要折腾了。

小知识:每个扇区512字节

写入的系统暂时还是使用FriendlyARM提供的那套系统,不用另外编译了。按FriendlyARM的方案,我们需要3个分区:

1:boot:用于存放内核,dtb,开机LOGO;这个也是uboot经常访问的部分。

2:rootfs:只读文件系统,用于存放根文件系统,Linux系统最主要的组成部分了,相当于ubuntu分区时的/分区

3:userdata:会以overlay的方式挂载到根分区上面去,对rootfs所有的修改会保存到userdata,而不会直接写入rootfs,这样有个显而易见的好处,就是方便恢复出厂设置了。很多路由器也是类似的方法。

对于分区1,我们不能直接从2048扇区开始(fdisk默认从2048),需要预留一些空间给前面说的bl2,bl31到bl33。直接从2048开始相当于只有扇区1到2047给到这些,只有(2047 * 512 / 1024)只有1023kb,其实差不多也够了,但是我们还是先预留16M给他们。

下面我们一步步来操作:

首先看看sd卡是哪个块设备,使用lsblk查看下,根据大小判断:

706b503138c645cf83ef671a2e0355ee.png

我的是sdb,你也可以插入读卡器后,dmesg查看,内核会打印是sd多少。

运行cfdisk:

sudo fdisk /dev/sdb

先创建boot分区,从16M的位置开始,大小128M:

我输入的命令如下:

Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-62333951, default 2048): 34816
Last sector, +/-sectors or +/-size{K,M,G,T,P} (34816-62333951, default 62333951): 296959

Created a new partition 1 of type 'Linux' and of size 128 MiB.

Command (m for help): 

Command (m for help): n
Partition type
  p   primary (0 primary, 0 extended, 4 free)
  e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-62333951, default 2048): 34816
Last sector, +/-sectors or +/-size{K,M,G,T,P} (34816-62333951, default 62333951): 296959

Created a new partition 1 of type 'Linux' and of size 128 MiB.

Command (m for help):

464135724221492e925d591a8105b1f6.png

关键步骤:输入n创建分区,输入p,创建主分区,分区编号一定要选择1,输入1;然后开始扇区输入34816,结束扇区输入296959

至于为什么是这些数,是计算出来的,前面说了每个扇区512字节,如何16个MB多少个扇区,全部是算出来的。

执行完了之后,按w再回车保存退出,后面两个分区我们用cfdisk创建,cfdisk创建不支持起始位置,否则前面直接用cfdisk来了。


Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

d80d6202c61e4a8f86885520f5828fb6.png

运行cfdisk:

cfdisk使用了tui,比fdisk友好,当然你是大佬可以直接使用fdisk完成这一步的操作,这一步的操作更多是给初学者看的

sudo cfdisk /dev/sdb

8de125fa8e2845ada7064d39091c30c7.png

可以看到已经有一个sdb1分区了,大小128M,sdb1前面有16M空闲空间,这个是故意的。

然后按方向键下,光标移到绿色的free space,左右选择new回车:

b3fda60ce0bf46cab05120ec04c0583b.png

大小输入4G,回车9750716cada14c3c82bd08f0b5003690.png

选择主分区,千万不要选扩展

b2aee6dd165f432695c03d18a2b60be1.png

可以看到多了一个4G的主分区

70b53a59669643118d9865a57c2b6033.png

接着同样的方法,创建另外一个分区用于userdata,就不再赘述了。我选择userdata为8个G,最终效果如图下:

abf10ac587ac4a95b96e3e9d65ddfc30.png

完成后,左右选择write保存,输入yes确认,不要输入y,不认

f100dc4cff07496099b64c2273122546.png

显示分区表被修改后,选择quit退出

5dc14b1ed9ec456c97c4fc722ce2b61b.png

格式化:

我们刚才一共有3个分区sdb1,sdb2,sdb3,需要全部格式化为ext4格式,这里再次提醒一遍,千万不要搞错编号,sda,sdb,sdc,sdd等,否则你的数据真的要完蛋了。

81581a8550c2447fab4933f82d5f9955.png

依次输入下面的命令进行格式化:

sudo mkfs.ext4 /dev/sdb1
sudo mkfs.ext4 /dev/sdb2
sudo mkfs.ext4 /dev/sdb3

6b2b916d2e7642e98a2c079c2cedd8b8.png

执行完之后可以再lsblk确认下:

b7bbf5588c524fb982117a97767246e1.png

写入bootloader和uboot:

准备好我们需要的下面几个文件:

c01965a34d4d4d8fb9ea2ae964a4c0f9.png

对于这部分的写入,我们直接写入扇区,不需要挂载文件系统。

先看看sd_fuse里面,每个文件写入的扇区数,有点大概映像,参考这个文件:

sd-fuse_s5p6818/fusing.sh at master · friendlyarm/sd-fuse_s5p6818 · GitHub

脚本里面有写偏移:

822c3be37d084022b3da3145a1c897cd.png

这四个文件就是我们要写入到sdb的,只是我们不用fusing_bin,我们用dd

命令:

sudo dd if=./bl1-mmcboot-sd.bin of=/dev/sdb bs=512 seek=1
sudo dd if=./fip-loader.img of=/dev/sdb bs=512 seek=129
sudo dd if=./fip-secure.img of=/dev/sdb bs=512 seek=769
sudo dd if=./fip-nonsecure-GEC6818.img of=/dev/sdb bs=512 seek=3841

和友善的脚本里面描述的位置是完全对应的,使用seek参数,跳过n个bs大小,我们bs大小设置为了512,刚好是一个扇区的大小。

至于为什么是这些数,这个你得研究bl2的执行过程和NISH的数据结构了,可以参考我的mk6818写的README,然后学习bl2的代码。

执行日志:

dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/bl_and_uboot> sudo dd if=./bl1-mmcboot-sd.bin of=/dev/sdb bs=512 seek=1
42+1 records in
42+1 records out
21552 bytes (22 kB, 21 KiB) copied, 0.00411888 s, 5.2 MB/s
dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/bl_and_uboot> sudo dd if=./fip-loader.img of=/dev/sdb bs=512 seek=129
545+0 records in
545+0 records out
279040 bytes (279 kB, 272 KiB) copied, 0.0458411 s, 6.1 MB/s
dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/bl_and_uboot> sudo dd if=./fip-secure.img of=/dev/sdb bs=512 seek=769
502+1 records in
502+1 records out
257136 bytes (257 kB, 251 KiB) copied, 0.0421259 s, 6.1 MB/s
dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/bl_and_uboot> sudo dd if=./fip-nonsecure-GEC6818.img of=/dev/sdb bs=512 seek=3841
993+1 records in
993+1 records out
508440 bytes (508 kB, 497 KiB) copied, 0.082547 s, 6.2 MB/s
dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/bl_and_uboot> 

5fac22ba1e364d1dad3562759ca6ec0f.png

执行到这一步,恭喜已经写入好uboot和bootloader了。

写入boot分区:

挂载第一个128M的分区到/mnt:

sudo mount /dev/sdb1 /mnt

展开备份的boot.tar.gz:这个文件我前面已经提供了,是从我的机器提取出来的。

sudo tar -zxvp --xattrs -f ./boot.tar.gz -C /mnt

fbfe0e80533e4a4bad5ccc7d5ee4782b.png

其实就是展开了几个文件到boot分区

使用tar的关键参数为:

-f:操作的源文件

-z:使用gzip

-x:解压

-v:显示详细日志

-p:恢复压缩时的权限

--xattrs:恢复扩展权限,chattr那些设置的

-C:程序解压时chdir到/mnt,相当于解压到/mnt目录,就是我们sdb1分区的挂载

执行完了之后,umount,sync再拔掉卡:

dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/boot> sudo umount /mnt 
dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/boot> sudo sync
dengxh@openSUSE:~/data/s5p6818/docs_gec6818/prebuilt/boot> 

写入rootfs:

聪明的读者已经不难想到了,rootfs不就和boot.tar.gz差不多嘛,解压到sdb2就完事了,确实,没毛病。今天有点晚了,改天更新,先占坑。

-- 2024-12-12 更新:

1. 先从FriendlyARM的服务器下载回来镜像:

wget http://112.124.9.243/dvdfiles/s5p6818/rootfs/rootfs-ubuntu-noble-core-arm64.tgz

等待一段时间,等待文件下载完成。

2. 挂载我们之前分区的第二个分区(我这里sdb2)到mnt

sudo mount /dev/sdb2 /mnt

3. 和boot.tar.gz一样,解压从友善下载回来的targz到mnt文件夹:

sudo tar -zxvp --xattrs -f ./rootfs-ubuntu-noble-core-arm64.tgz -C /mnt

等待解压完成:

命令的含义上面boot的时候已经解释过了。

4. 修正rootfs目录结构

到mnt目录下,可以看到linux标准目录前,多了一层ubuntu-noble-core-arm64文件夹和rootfs文件夹,我们要做的是把里面的子内容移到上一层:

sudo mv ubuntu-noble-core-arm64/rootfs/* ./

再ls可以看到正常的目录结构,类似/下面:

5. 之后执行sync,再取消挂载mnt

sudo sync
sudo umount /mnt

大告成功:

接着可以拔掉SD卡,插入开发板的SD0卡槽上电测试了,串口线可以接个终端便于观察输出日志。不出意外已经可以正常启动进入系统了。

至于uboot和内核的编译,专栏里面已经有介绍了,喜欢的同学

标签:系统启动,uboot,docs,分区,sudo,boot,开发板,64,gec6818
From: https://blog.csdn.net/m0_47367420/article/details/144408714

相关文章

  • RK3588主板/开发板Android12系统APK签名文件生成的方法,干货满满
    本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-I......
  • NRF52810超低功耗SOC蓝牙芯片支持ANT和2.4 GHz私有协议NRF52832低成本方案64Marm
    nRF52810系统级芯片(SoC)是nRF52系列的基准成员,是NRF52832的低成本方案。它满足了将高级低功耗蓝牙功能和协议并发性引入应用的挑战,其价位使得向应用添加低功耗蓝牙连接极具吸引力。它是不太复杂的应用的理想选择,也是大型应用中的低功耗蓝牙连接处理器的理想选择。nRF52810支......
  • c++ 样式错误 “Unknown property transition” /“Could not parse stylesheet of o
    解决办法通过遍历所有的控件,“Unknownpropertytransition打印出所有的控件地址,将地址GPS2>&1log.log输出到log日志中“Couldnotparsestylesheetofobject0xb88164f8”关键函数QStringgetWidgetHierarchy(QObject*widget)获得所有的控件#include<QA......
  • 基于STM32单片机的智能点滴输液报警器液位检测电机无线WiFi手机APP设计DR-01非接触液
    25-040-点滴检测+药水液位+电机控制+上下限+按键+声光提醒+TFT彩屏+WiFi产品功能描述:本系统由STM32F103C8T6单片机核心板、TFT液晶显示电路、无线无线WIFI/、点滴检测模块、步进电机控制电路、DR-01非接触液位传感器检测电路、蜂鸣器声光报警、按键电路、电源电路组成。【1......
  • OSG开发笔记(三十八):osg3.0.0基于windows平台msvc2017x64编译器编译并移植Demo
    前言  本篇编译osg3.3.0的msvc2017x64版本,验证书中的从相机demo。 OSG编译步骤一:下载解压  下载版本,由于官方的其他路径没有直接给出3.0.0,需要自己切换分支,代码地址:https://github.com/openscenegraph/OpenSceneGraph/tree/OpenSceneGraph-3.6.4  然后:  ......
  • Linux系统挂载exfat格式U盘教程,触觉智能RK3562开发板演示
    本文介绍Linux系统(Ubuntu/Debian通用)挂载exfat格式U盘的方法,触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。修改对应的内核配置文件进入sdk目录cdrk3562_linux编辑......
  • 在Windows或者macOS上使用FFmpeg合并.h264文件(包含FFmpeg 安装)
    1.FFmpeg的安装1.1Windows1.2macOS2.使用FFmpeg合并.h264文件1.FFmpeg的安装FFmpeg是一个强大的多媒体框架,可以用来处理视频和音频文件。这里主要介绍其在Windows和macOS上的安装方法:1.1Windows访问FFmpeg的官方网站或GitHub仓库下载适用于Windows的静态......
  • python毕设的殡仪馆信息管理系统设计与实现ou64v程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景殡仪馆作为社会公共服务体系的重要组成部分,承担着为逝者提供尊严告别、为家属提供慰藉的重要职责。然而,传统的殡仪馆管理方式存在诸多不足......
  • 【064】基于51单片机无线亲子分离报警器【Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+NRF24L01无线模块+震动器+按键电路+蜂鸣器+LED灯。1、本设计采用STC89C51/52、AT89C51/52、AT89C51/52单片机作为主控芯片;2、系统采用NRF24L01无线将主控板和子控板进行通讯;3、当主控板和子控板超出范围时两个板子都会发出声光报警提......
  • OpenHarmony默认30秒熄屏太麻烦?触觉智能鸿蒙开发板教你轻松取消
    开发板在默认情况下,OpenHarmony系统开机后30秒会自动息屏,自动息屏会让不少用户感到麻烦,触觉智能教大家两招轻松取消自动息屏。使用触觉智能PurplePiOH鸿蒙开发板演示,搭载了瑞芯微RK3566四核处理器,Laval鸿蒙社区推荐开发板,已适配全新OpenHarmony5.0Release系统,SDK源码全开放!S......