1 Linux内核
事实上对于F1C100S/F1C200S,Linux官方源码已经对licheepi nano进行支持。所以我们完全可以通过licheepi nano的配置文件进行移植。
可以使用官方的系统,也可以自己尝试移植试试。这里我自己体验一下移植,如果出现问题还可以与官方的系统对比,方便解决问题,达到学习的目的,不然遇到问题,真的是解决不了。
https://github.com/Lichee-Pi/linux 从这里查看官方的linux源码。
1.1 下载内核源码
进入Linux系统官网:
https://www.kernel.org/
选择任意一项点击 [browse]
在新打开页面选择 【summary】点击【tag】中的【…】切换下载
然后选择需要的版本。或者使用下面的链接直接下载5.2版本
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/snapshot/linux-5.2.tar.gz
下载后完成后,将代码复制到Ubuntu虚拟机并解压源码。
tar -zxvf linux-5.7.1.tar.gz
1.2 配置编译
需要对Linux编译进行配置:
- 指定架构类型
- 指定交叉编译工具
- 项目配置
指定架构,就这个很好理解,就是指定CPU类型,就是配置为Arm就行,交叉编译工具即为上一篇已经安装好的编译工具。
找到Linux内核代码中的Makefile文件:
修改如下配置:
ARCH ?= arm
CROSS_COMPILE ?=arm-linux-gnueabi-
如果没找到ARCH 或 CROSS_COMPILE字段,自己手动添加也行,如下图所示:
事实上这两个字段可以不用指定,在进行make的时候加上对应的参数就行,这里为了避免麻烦,所以直接放到了makefile文件中。
接下来就是指定项目配置了,这个操作就是让Linux内核认F1C100S/F1C200S这颗soc。
进入内核源码中的arch/arm/configs目录中,可以看到有很多开发板的配置文件,其中sunxi_defconfig是全志的配置文件,但是该配置文件非常不全,需要额外配置大量的选项,一般选项多大上千个,这里先使用licheepi_nano的配置文件。
https://github.com/Lichee-Pi/linux/blob/nano-5.2-tf/arch/arm/configs/licheepi_nano_defconfig
下载该文件,然后将其放到arch/arm/configs/目录下。
然后通过终端进入Linux-5.2根目录,输入命令:
make clean
make ARCH=arm CROSS_COMPILE=arm-none-eabi- linux-licheepi_nano_defconfig
或者
make licheepi_nano_defconfig
make menuconfig
sudo apt-get install flex bison
进入图形配置界面,如图所示:
该界面和u-boot配置一样,所以操作方式也是一样的,上下键移动选项,使用空格键进行选中或取消选择,同样通过空格键或回车键,进入子选项配置,通过Tab键选择保存和退出即可返回上级菜单或命令行界面,也可以直接双击Esc键返回上级目录。
1.3 配置TF卡设备树信息
在完成内核配置后还需要配置TF卡的设备树配置,否则即便是能正常运行内核,在加载文件系统的时候还是会有问题,在这里配置很简单:在linux-5.7.1/arch/arm/boot/dts 目录下,分别修改suniv-f1c100s.dtsi、suniv-f1c100s-licheepi-nano.dts 两个文件。
1.3.1 修改suniv-f1c100s.dtsi文件
首先是 suniv-f1c100s.dsti,如果没有则在开头部分添加头文件:
#include <dt-bindings/clock/suniv-ccu-f1c100s.h>
#include <dt-bindings/reset/suniv-ccu-f1c100s.h>
在其中 soc { … } 中的 pio: … { … } 中添加一项 mmc0_pins,规定 mmc 设备引脚(参考原理图可知):
...
soc {
...
pio: pinctrl@1c20800 {
...
mmc0_pins: mmc0-pins {
pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5";
function = "mmc0";
};
}
...
}
...
前面是引脚声明,下面在 soc { … } 下再加入 mmc0,进行详细配置:
...
soc {
...
mmc0: mmc@1c0f000 {
compatible = "allwinner,suniv-f1c100s-mmc", "allwinner,sun7i-a20-mmc";
reg = <0x01c0f000 0x1000>;
clocks = <&ccu CLK_BUS_MMC0>, <&ccu CLK_MMC0>, <&ccu CLK_MMC0_OUTPUT>, <&ccu CLK_MMC0_SAMPLE>;
clock-names = "ahb", "mmc", "output", "sample";
resets = <&ccu RST_BUS_MMC0>;
reset-names = "ahb";
interrupts = <23>;
pinctrl-names = "default";
pinctrl-0 = <&mmc0_pins>;
status = "disabled";
#address-cells = <1>;
#size-cells = <0>;
};
...
}
...
1.3.2 修改suniv-f1c100s-licheepi-nano.dts文件
先在根节点(即 / { … } 内)添加应该是电平配置的信息:
...
/ {
...
reg_vcc3v3: vcc3v3 {
compatible = "regulator-fixed";
regulator-name = "vcc3v3";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
}
...
然后在最外层(之间在文件最后面)添加 mmc0 使能:
...
&mmc0 {
vmmc-supply = <®_vcc3v3>