【f1c200s笔记二】u-boot配置和编译

一、硬件介绍

1、上次把编译环境配置过程说完,发现忘了介绍硬件了。博主使用的是荔枝派,具体的型号是CherryPi-F1C200S。为了避免不必要的麻烦,原理图就不贴出来了。可以自行到某宝进行搜索。

2、在这个硬件上有两个坑需要注意,第一个是,它的串口默认使用的A2A3,但是u-boot(荔枝派nano)的默认串口是E0E1。改程序对于一个小白来说太麻烦,所以博主直接改了跳线电阻。

3、第二个就是控制显示屏背光的芯片,是默认使能的,所以想要在程序中控制背光亮度,需要更改电路的跳线电阻。(在此怀念一下被折磨的的日子)。

4、在荔枝派板子基础上,有添加了TF卡做系统,增加了lcd屏幕,lcd屏是RGB并口屏,不需要做初始化的那种。然后简陋的支架。

二、u-boot源码准备

1、介绍完硬件就进入主题吧,既然是u-boot的编译,首先是要准备u-boot的源码。u-boot可以从官方网站下载,但是配置项较多,不适合新手。LicheePi nano同样是使用f1c200s芯片,其中大部分的配置已经做完,所以就是它了。

2、首先是创建文件夹,/usr/local/f1c200s/u-boot,保证文件存放的条理性。然后依次执行。

#进入创建好的文件夹
cd /usr/local/f1c200s/u-boot

#从github下载源码,并且设置使用分支nano-v2018.01
git clone http://github.com/Lichee-Pi/u-boot.git -b nano-v2018.01

#对源码进行压缩保存
tar -cvf u-boot.tar u-boot/

#进入到u-boot目录
cd u-boot

a、套用百度的介绍,GitHub是一个面向开源及私有软件项目的托管平台。类似于svn可以进行版本控制,也可以进行软件分享。git是一个可以进行github操作的一个命令。git clone命令,是克隆一个git仓库到本地。

b、当多人维护一套代码,或者一个人修改一套代码完成不同的功能,必然导致这一套代码出现不同的变化,就像一条路出现了岔路口,变成了更多条路。但是呢它们都是基于一个根源,这个概念就是分支。大胆猜测,-b就是选择分支。

c、如果想要查看这套代码的所有分支,可以使用命令git branch -a进行查看,带有“*”号就是当前分支,也可以通过git checkout ***进行分支切换。

三、u-boot编译器选择(配置)

1、有一定基础的一定知道,linux下编译软件需要执行make,make大致的过程是找到makefile文件,加载里面包含的其他文件,展开函数和变量,建立依赖关系,执行最终目标。执行最终目标是需要编译对应的文件的,而编译器就是需要我们指定(修改)的,修改位置就在makefile文件内。

2、makefile中指定编译器的是变量CROSS_COMPILE,但是如果在makefile里面一行一行比对实在太麻烦。这时候就要用到grep命令,它类似于win的文本编辑器那样Ctrl+F这样的操作。执行

grep CROSS_COMPILE\ ?= Makefile -n

a、这条命令的含义是,在文件Makefile中搜索“CROSS_COMPILE ?=”,打印搜索到的结果,并且在打印结果时,显示对应的行号。

b、命令中“\”符号在正则表达式中,表示转义或者原义。在这里很显然是原义的用法,因为在这条命令中,空格会被grep识别为参数间的分割符,加上“\”之后“CROSS_COMPILE ?=”就能被正确识别成一个整体。

c、如果没有输入错误,终端将会打印如下信息,也就是说这段字符是在Makefile的第246行。

3、然后使用vim编辑器打开Makefile文件,在命令模式下,输入“:”,然后输入246,按回车就跳转到第246行啦。然后按照如下修改。

#ifeq ($(HOSTARCH),$(ARCH))
#CROSS_COMPILE ?=
#endif

ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-

Makefile中在某行前面添加#,作用就是屏蔽某行

=号就不用多说了,是赋值的作用,前面加一个“?”,意思是如果这个变量没有被定义(没有被赋值),那么就赋等号后面的值。

arm-linux-gnueabi-还有印象吗,就是上一篇所配置的编译环境。

四、u-boot菜单配置

1、单片机的启动是很直接简单的,把程序刷进flash之后,单片机直接从起始地址读取指令,开始向下执行。但是嵌入式linux的启动就相对复杂一些。

2、以jz2440为例(因为f1c200s实在没有找到资料(¯▽¯;),但是原理应该相差不多),首先芯片内部有一段固化好的代码,上电之后,固化好的代码首先会根据启动位置(jz2440会根据IO电平判断启动位置。f1c200s有固定的检查顺序,先检查到的设备作为启动位置),读取固定4k的内容(u-boot开头4k的代码)执行,这部分内容对cpu做必要的初始化之后,把u-boot的剩余代码拷贝进ram内执行。u-boot再根据配置,到指定的位置读取kernal(内核)到ram,传递必要的配置信息给内核后,跳转到内核开始执行,内核再挂载根文件系统,这样整个过程才算告一段落。

3、有没有眼花,嵌入式linux启动经历了多次跳转,才真正开始执行kernal。但本章节最关注的,是从u-boot跳转到kernal这一部分。

4、从u-boot跳转到kernal,首先u-boot需要知道kernal在哪个位置吧,kernal需要拷贝到内存的那个位置?设备树文件在哪里并且需要拷贝到哪里?kernal的控制台是什么?根文件系统又在哪里。这些都是通过u-boot的配置菜单进行设置。

5、在进行上述配置之前,还有一个步骤需要准备。因为u-boot面对很多的芯片平台,u-boot的配置菜单有大量的配置项,用以适配不同的芯片平台。作为普通开发者不需要进行一一配置,我们只需要使用厂商配置好的配置即可。

6、各个芯片的官方配置都在u-boot源文件夹的configs内,其中licheepi_nano_defconfig是sd卡启动的配置文件,licheepi_nano_spiflash_defconfig是spiflash的配置文件。

7、在u-boot的主目录内,即/usr/local/f1c200s/u-boot/u-boot内,执行make licheepi_nano_defconfig,使官方配置生效。

8、然后执行make menuconfig,进入菜单配置界面。如果遇到什么报错,最好的办法是问度娘,基本都是环境配置问题。

u-boot的配置菜单界面

9、使用上下键,将光标移动到Enable boot arguments位置,按空格键,打开其功能,然后在下方新弹出的Boot arguments选项上,按enter键,在弹出的输入框内输入console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw然后按enter确定 。

Boot arguments输入框
编辑后的状态

a、console=ttyS0,115200的作用是配置控制器台参数,设置控制台为串口0,波特率为115200,在linux中,tty就是串口设备。

b、 panic=5表示,内核卡住5秒,就会执行异常操作。

c、rootwait表示无限期等待。挂载根文件系统前,等待根文件设备的出现。

d、root=/dev/mmcblk0p2表示根文件系统位置。mmcblk0p2中,mmc是表示mmc存储设备(tf即属于mmc设备),blk0表示块设备0(第一张TF卡),p2表示第二分区。

e、earlyprintk表示内核在启动和加载过程中,可以打印输出信息。

f、rw表示文件系统可读可写。

10、按照同样的办法,修改bootcmd value的内容为load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 – 0x80c08000;(如果是复制的话,一定要注意这里,”0x80008000 – 0x80c08000“中间的”-“可能会丢失,而且必须加空格)

a、load是一条加载的命令,“;”号表示一条命令的结束。load mmc 0:1 0x80008000 zImage; 表示将mmc设备0的分区1内的文件zImage,复制到内存地址的0x80008000位置。zImage就是kernal,之后就会了解到,kernal编译生成了二进制文件zImage,然后会将其放置到内存卡的分区1的文件夹内。设置命令和实际保存两个操作是相互对应的。

b、同样的,load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;的意义和上一条相同。dtb文件是设备树文件,之后会单独讲解。

c、bootz命令是告诉u-boot,linux内核镜像的起始地址为0x80008000,设备树的起始地址为0x80c08000

11、使用左右键,将光标移动到save,按enter进行保存,然后选择exit退出配置菜单。

五、编译和烧录

1、做完上述配置等一系列操作,终于可以进行编译的最后一步操作,执行make。如果知道自己的主机是几颗核心,还可以加入-j参数,提高编译速度。比如四核的主机,就可以执行make -j4。

2、接下来是一些博主自己遇到的问题,以及解决的办法。

a、报错/bin/sh: 1: python: not found

#首先查看当前环境中的python版本
ls -l /usr/bin/python*

#接下来是博主主机打印的信息
lrwxrwxrwx 1 root root      10 Mar 25 20:41 /usr/bin/python3 -> python3.10
-rwxr-xr-x 1 root root 5905480 Jun 29 20:14 /usr/bin/python3.10
lrwxrwxrwx 1 root root      34 Jun 29 20:14 /usr/bin/python3.10-config -> x86_64-linux-gnu-python3.10-config
lrwxrwxrwx 1 root root      17 Mar 25 20:41 /usr/bin/python3-config -> python3.10-config

#由此可见,环境中安装的python版本是3.10,并没有python所以就创建一个连接
ln -s /usr/bin/python3.10 /usr/bin/python

#由此解决

b、报错error: command ‘swig’ failed: No such file or directory,这是因为缺少swig导致,执行sudo apt-get install swig解决。

c、报错

/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status

解决办法是,在文件scripts/dtc/dtc-lexer.lex.c_shipped的第634行,给YYLTYPE yylloc前面加入extern。

3、编译成功后,会在当前文件夹下生成文件u-boot-sunxi-with-spl.bin文件,这就是我们的最终文件。

4、接下来将tf卡插入到主机中,可以使用命令fdisk -l查看当前主机的磁盘情况,前后对比可以确定TF卡的设备名称。一般如果你的主机只有一个硬盘的时候,tf卡的名字会是/dev/sdb。当然要根据你的实际情况来看。

插入tf卡之前的
插入tf卡之后的

博主的主机有连两个硬盘,所以tf卡的设备名字就是/dev/sdc

5、使用命令sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdc bs=1024 seek=8,将u-boot二进制文件复制到tf卡指定位置,注意of要指向你自己的tf设备名称。
dd是一条搬移命令,if表示的是源文件,of表示的是目标文件(linux下一切皆文件,文件/dev/sdb代表的是tf卡),bs是指定数据块的大小,seek是表示向目标写入时,跳过多少个数据块再开始。这是因为TF卡的起始地址处,存放的是TF卡的DBR(引导记录)等一些十分重要的信息。

成功烧写的打印信息

6、等烧录完成,将TF卡插入到开发板,上电,即可看到从串口0输出的信息,如果没有输出,记得检查一下串口硬件是否正确。

博客内容均系原创,未经允许严禁转载!

评论

  1. Enderman
    12 月前
    2023-10-21 16:47:46

    最近的uboot v2023.07已经将lctech f1c200s并入主线了,有对应的config文件直接编译就能用,参考https://linux-sunxi.org/Lctech_Pi_F1C200s的描述

    • 博主
      Enderman
      10 月前
      2023-12-11 14:23:21

      还不错欧,配置起来就不会这么麻烦了

    • 博主
      Enderman
      10 月前
      2023-12-11 14:24:30

      就是我用的这块板子ヾ(≧∇≦*)ゝ

  2. KAYANO_AI
    1 年前
    2023-8-18 16:24:32

    博主我用F1C100S芯片烧录uboot,串口打印确实乱码,我看波特率确实是115200,不知道怎么回事

    • 博主
      KAYANO_AI
      1 年前
      2023-8-18 19:49:35

      如果波特率是正确的,可以查看一下串口工具配置,是不是8位数据,无奇偶校验位,一位停止位。如果配置也是对的,再检查一下串口信号地线是不是连接了,用示波器查看一下TX和RX的波形,毛刺,倾斜这些问题。再不行就换一个工具试试,比如友善串口,或者ssh工具secureCRT。

  3. Enderman
    2 年前
    2023-2-19 15:12:36

    博主请问跳线电阻怎么改啊,同款板子

    • 博主
      Enderman
      2 年前
      2023-2-20 9:25:37

      把R6和R14的两个0欧的电阻,换到R8和R11上就可以了。。在板子的背面,那颗小芯片u4的旁边。ヾ(≧∇≦*)ゝ

      • Enderman
        春风催雪
        2 年前
        2023-2-20 10:56:56

        感谢!帮大忙了

        • 博主
          Enderman
          2 年前
          2023-2-20 11:25:09

          不客气,共同进步。վ’ᴗ’ ի

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇