Nanopi M3另辟蹊径开机记录

本篇文章的文件系统是瘦身版的,不健全的。但这恰恰是学习内核的好方法,系统运行时会提示缺少什么,或者异常。当你解决这些问题的时候,就会了解到文件系统为什么有这些文件,这些目录。

网上有很多关于nanopi m3的烧写开机启动教程。大多数都是根据友善之臂公司给出的官方教程,这里我也把官方教程链接贴出来:http://www.arm9.net/nanopi-m3.asp。

今天我要记录的nanopi m3开机启动教程,是开机启动linux小系统,进入shell命令行,没有多余的东西。整个系统就只有三个东西:U-boot,kernel,rootfs。所以我不需要4G以上的内存卡,有个10几M就足够了。所以我随便找了个以前不用的256M内存卡,准备开始玩一下。

·分析官方镜像文件

先了解下“敌情”

首先从官网下载了烧写镜像文件,我这里选择s5p6818-debian-wifiap-sd4g-20161117.img。名字太长了,我直接重名为debian.img。

用file命令查看下镜像文件,

jqh@ubuntu:~/work$ file debian.img

debian.img: DOS/MBR boot sector; partition 1 : ID=0x83, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 2048, 131072 sectors; partition 2 : ID=0x83, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 133120, 7484066 sectors

可以看出,镜像分成两个分区partition1~2。第一个分区从2048段开始,总共有131072个段。第二个分区从133120段开始。

那0到2047段怎么没有提及。其实第0段是有作用的,可以上网了解下,其中一个作用就是描述块设备的分区情况。第1~2047段,就是引导程序了,包括u-boot。

用fdisk命令查下镜像文件,

jqh@ubuntu:~/work$ fdisk -lu debian.img

Disk debian.img: 3.6 GiB, 3899999232 bytes, 7617186 sectors

Units: sectors of 1 * 512 = 512 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disklabel type: dos

Disk identifier: 0x00000000

Device      Boot  Start     End Sectors  Size Id Type

debian.img1        2048  133119  131072   64M 83 Linux

debian.img2      133120 7617185 7484066  3.6G 83 Linux

这里我们了解到每一个段sector的大小是512字节。所以分区描述段和引导段总大小是1M。第一个分区大小64M,第二个分区大小3.63G,所以知道官方为什么需要你准备不小于4G的内存卡了吧。我们这里只需要前1M数据拿出来,然后自己做2个小分区,一个放内核文件,一个放文件系统就可以了。

格式化256M内存卡

将内存卡以前的分区信息全部干掉。

jqh@ubuntu:~/work$ ls /dev/sdb*

/dev/sdb

重新建立分区,具体如下图

然后将两个分区格式化,第一个分区格式化为FAT,第二个分区格式化为ext4(也可以不要fat看个人喜好)。

下图可以看到格式化,挂载后的信息,

提取debian.img的引导段程序

由上面分析可知,我们只需要debian.img的第1段到2047段就可以了,所以,使用dd命令:

jqh@ubuntu:~/work$ sudo dd if=debian.img of=/dev/sdb bs=512 count=2047 seek=1 skip=1

2047+0 records in

2047+0 records out

1048064 bytes (1.0 MB, 1.0 MiB) copied, 1.10491 s, 949 kB/s

其中seek表示跳过输入文件多少个bs,skip表示跳过输出文件多少个bs。

到这里,引导代码就提取出来了,赶紧来试试引导程序能不能跑起来。

接上串口115200,8n1,看到如下打印信息:

Welcome to minicom 2.7

OPTIONS: I18n

Compiled on Nov 15 2018, 20:18:47.

Port /dev/ttyUSB0, 06:08:35

Press CTRL-A Z for help on special keys

scratch is broken, clear

watchdog timer star

working to aarch32

waiting for pll change..

--------------------------------------------------------------------------------

 Second Boot by Nexell Co. : Ver0.3.6 - Built on Jun 29 2016 15:19:53

--------------------------------------------------------------------------------

DDR3 POR Init Start 0

Lock value  = 188

······

mmc0 is current device

Writing to MMC(0)... done

Writing to MMC(0)... done

HDMI: display.0, preset 0 (1280 *  720)

HDMI: PHY Ready!!!

Failed to mount ext2 filesystem...

** Unrecognized filesystem type **

can't find bmp at 0x47000000 (type:0xffff), fb:0x46000000...

LOGO: DRAW FB=0x46000000, X=1280, Y= 720, Bpp=32

Hit any key to stop autoboot:  0

s5p6818#

从打印看,好像不支持FAT,算了我还是把第一个分区格式化为ext2再试试。

改之后如下图所示,这里报错误是因为使用了默认的内核镜像,我们需要更改默认镜像名字,或者手动选择启动。后面会讲到,

下一步把内核放到第一分区。

由于默认的U-boot,引导过程只有1秒的等待时间,如果没有按键,就往下执行。我们可以将这个延时改大一些,免得手忙脚乱。

这样下次开机,它就会等你10秒了。

·把nanopi m3的内核放到第一个分区

自己编译一个内核,内核获取地址:'https://github.com/friendlyarm/linux-3.4.y.git/

编译方法

make nanopi3_linux_defconfig ARCH=??

make uImage ARCH=?? CROSS_COMPILE=??

·将busybox做好的文件系统放到第二个分区

这里还需要做一个修改,修改启动参数bootargs。因为我们只需要一些简单的参数就可以了。

我们尝试启动内核,在串口输入如下命令,果然内核启动成功。

s5p6818# ext4load mmc 0:1 0x48000000 uImage

s5p6818# bootm 0x48000000

## Booting kernel from Legacy Image at 48000000 ...

   Image Name:   Linux-3.4.39-s5p6818-gc496018

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    4431400 Bytes = 4.2 MiB

   Load Address: 40008000

   Entry Point:  40008000

   Verifying Checksum ... OK

   Loading Kernel Image ... OK

 

Starting kernel ...

省略一堆打印信息,进入shell命令行,如下:

查看系统版本

/ # uname -a

Linux NanoPi3 3.4.39-s5p6818-gc496018 #1 SMP PREEMPT Sun Jan 20 00:47:18 PST 2019 armv7l GNU/Linux

查看文件系统

/ # ls

bin         etc         lost+found  sbin        usr

dev         linuxrc     proc        sys

说明确实启动成功。恭喜~~

官方自带的镜像u-boot是不支持网络功能的,后面将会修改u-boot配置,替换当前的U-boot,使得u-boot支持网络功能,开发乐趣更多,免于不停烧写内存卡影响寿命。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章