编辑
2023-12-12
嵌入式
00
请注意,本文编写于 500 天前,最后修改于 336 天前,其中某些信息可能已经过时。

目录

V3S与f1c100基于最新u-boot+linux开发记录
准备工作
安装编译工具链
安装编译必要的依赖库和工具
uboot编译
克隆uboot仓库
uboot配置
启动配置:
linux编译
克隆linux仓库
内核配置
根文件系统编译
下载最新buildroot
根文件系统配置:
其他功能/应用配置
显示
触屏
音频
配置
视频播放
烧录
准备工作:
烧录uboot
拷贝kernel以及设备树
解压根文件系统

V3S与f1c100基于最新u-boot+linux开发记录

准备工作

先更新下本地软件包列表,是否更新软件自己决定

sudo apt-get update sudo apt-get upgrade

安装编译工具链

安装编译工具链(这里直接使用apt安装的13版本)

#不带FPU(f1c100) sudo apt-get install gcc-arm-linux-gnueabi #带FPU(v3s) sudo apt-get install gcc-arm-linux-gnueabihf

检查工具链版本,测试是否安装成功

arm-linux-gnueabi-gcc -v arm-linux-gnueabihf-gcc -v

手动安装方式: 上面安装的是linaro出的编译器,所以这里以arm出的编译器为例, 先在官网 https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads 下载编译器 ,这里下载 13.2 rel1版本

tar -xvf arm-gnu-toolchain-13.2.rel1-x86_64-arm-none-linux-gnueabihf.tar.xz -C /home/name/toolchain/arm-gnu-toolchain-x86_64-arm-none-linux-gnueabihf

在 /etc/profile 中添加

export PATH="$PATH:/home/lqy/toolchain/arm-gnu-toolchain-x86_64-arm-none-linux-gnueabihf/bin"

重新加载环境变量的配置文件

source /etc/profile

检查是否生效

arm-none-linux-gnueabihf-gcc -v

安装编译必要的依赖库和工具

sudo apt-get install libncurses5-dev swig bison flex gparted libssl-dev sudo apt-get install python3-pip sudo apt-get install git

uboot编译

克隆uboot仓库

git clone https://github.com/Lichee-Pi/u-boot.git

上面是荔枝派仓库,这里我们使用u-boot主线仓库

git clone https://github.com/u-boot/u-boot.git

切换到最新的v2024.01标签并创建分支

git checkout -b v2024.01 v2024.01

注意:因为不想编译时输入那么多命令,故修改根目录下Makefile中

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

下添加

ARCH ?=arm CROSS_COMPILE ?=arm-linux-gnueabihf-

这样可以省略 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

使用荔枝派Zero配置

make licheepi_nano_defconfig make LicheePi_Zero_defconfig

uboot配置

图形配置:

make menuconfig

f1c100s的话修改以下(可选):

arch/arm/mach-sunxi/dram_suniv.cstruct dram_para suniv_dram_para 中 .clk的156 换成 CONFIG_DRAM_CLK

ARM architecture > (156) sunxi dram clock speed 修改为 240 (若上面没修改则在此处修改)

General setup > (408000000) CPU clock frequency 主频修改为 720000000

boot 16/32M fat16 (大小自己根据kernel/dtb大小决定) rootfs -- ext4

启动配置:

如果需要flash启动,勾选 Device Drivers > SPI Support 和 Device Drivers > MTD Support > SPI Flash Support 之后根据自己flash厂家勾选对应支持,我这里勾选Winbond SPI flash support 若不支持也别着急搞驱动,勾选SFDP table parsing support for SPI NOR flashes (NEW)可以支持SFDP协议的flash,基本上都支持 若flash大于16M,勾选上 SPI flash Bank/Extended address register support (NEW) SPI Flash default speed in Hz自行修改

勾选 Boot options > Enable boot arguments 如果需要TF启动,Boot arguments (NEW)修改为

console=ttyS0,115200 panic=5 rootwait root=/dev/mmcblk0p2 earlyprintk rw

如果需要flash启动,Boot arguments (NEW)修改为

console=ttyS0,115200 panic=5 rootwait;mtdparts=spi32766.0:1M(uboot)ro,64k(dtb)ro,4M(kernel)ro,-(rootfs) root=31:03 earlyprintk rw rootfstype=jffs2

勾选 Boot options > Enable a default value for bootcmd 如果需要TF启动,bootcmd value 修改为

#f1c load mmc 0:1 0x80008000 zImage;load mmc 0:1 0x80c08000 suniv-f1c100s-licheepi-nano.dtb;bootz 0x80008000 - 0x80c08000 #v3s load mmc 0:1 0x41000000 zImage;load mmc 0:1 0x41800000 sun8i-v3s-licheepi-zero.dtb;bootz 0x41000000 - 0x41800000

如果需要flash启动,bootcmd value 修改为

sf probe 0;sf read 0x41800000 0x100000 0x10000;sf read 0x41000000 0x110000 0x400000;bootz 0x41000000 - 0x41800000

flash启动环境命令解析: sf probe 0; //初始化Flash设备(CS拉低) sf read 0x41800000 0x100000 0x10000;//从flash 0x100000(1MB)位置读取dtb放到内存0x41800000偏移处。 sf read 0x41000000 0x110000 0x400000;//从flash 0x110000(1MB+64KB)位置读取dtb放到内存0x41000000偏移处。 bootz 0x41000000 (内核地址)- 0x41800000(dtb地址) 启动内核

默认延迟2s启动,不想等待可以修改 Boot options > Autoboot options > (2) delay in seconds before automatically booting

注意

参数首次启动时候会写入配置文件,后续启动会优先按照配置中启动,所以后续修改要清理配置文件才会生效

编译

make -j24

至此u-boot编译完毕,编译成功后得到 u-boot-sunxi-with-spl.bin

linux编译

克隆linux仓库

git clone https://github.com/Lichee-Pi/linux.git

上面是荔枝派仓库,这里我们使用linux主线仓库

git clone https://github.com/torvalds/linux.git

切换到最新的v6.7标签并创建分支

git checkout -b v6.7 v6.7

此处clone需要大量时间,推荐直接在 kernel.org 下载

注意:同u-boot,因为不想输入那么多命令,故修改根目录下Makefile中

ARCH ?= $(SUBARCH)

改为

ARCH ?=arm CROSS_COMPILE ?=arm-linux-gnueabihf-

这样可以省略 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

复制Lichee-Pi的arch/arm/configs/licheepi_xxx_defconfig配置到linux主线对应目录下随后使用荔枝派配置

make licheepi_nano_defconfig make licheepi_zero_defconfig

内核配置

图形配置

make menuconfig

编译

make -j24

make dtbs

make -j24 INSTALL_MOD_PATH=out modules
make -j24 INSTALL_MOD_PATH=out modules_install

至此linux内核编译完成,生成内核文件zImage在arch/arm/boot下,设备树文件sun8i-v3s-licheepi-zero.dtb在arch/arm/boot/dts/allwinner下,驱动模块在out/下

根文件系统编译

下载最新buildroot

wget https://buildroot.org/downloads/buildroot-2023.11.tar.gz

解压

tar xvf buildroot-2023.11.tar.gz

根文件系统配置:

图形配置

make menuconfig

下载源 Build options → Mirrors and Download locations

(https://sources.buildroot.net) Backup download site (https://cdn.kernel.org/pub) Kernel.org mirror (http://ftpmirror.gnu.org) GNU Software mirror (http://rocks.moonscript.org) LuaRocks mirror (https://cpan.metacpan.org) CPAN mirror (Perl packages)

修改为

(https://sources.buildroot.net) Backup download site (https://mirrors.ustc.edu.cn/kernel.org) Kernel.org mirror (https://mirrors.ustc.edu.cn/gnu) GNU Software mirror (https://luarocks.cn) LuaRocks mirror (https://mirrors.ustc.edu.cn/CPAN) CPAN mirror (Perl packages)

工具链:

Toolchain -> Toolchain type = External toolchain -> Toolchain = Custom toolchain -> Toolchain origin = Pre-installed toolchain -> Toolchain path = -> Toolchain prefix = $(ARCH)-linux-gnueabihf -> External toolchain gcc version = 11.9.x -> External toolchain kernel headers series = 4.1.x -> External toolchain C library = glibc -> [*] Toolchain has SSP support? (NEW) -> [*] Toolchain has RPC support? (NEW) -> [*] Toolchain has C++ support?

系统配置:

System configuration -> System hostname = Jasonangel //平台名字,自行设置 -> System banner = Welcome to xxxxx //欢迎语 -> Init system = BusyBox //使用 busybox -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev -> [*] Enable root login with password (NEW) //使能登录密码 -> Root password = 123456 //登录密码为 123456

文件系统格式:

-> Filesystem images -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4 -> ext2/3/4 variant = ext4 //选择 ext4 格式 -> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs

等等,按需配置

编译

make

其他功能/应用配置

显示

DRM:

linux内核配置:

Memory Management options -> Contiguous Memory Allocator Library routines -> DMA Contiguous Memory Allocator (256) Size in Mega Bytes

rgb屏幕为例:

Device Drivers > Graphics support > Display Panels -> support for simple panels (other than eDP ones)

如果还想使用fb*设备,勾选 Enable legacy fbdev support for your modesetting driver

设备树添加:

/ { backlight: backlight { compatible = "pwm-backlight"; pwms = <&pwm 0 1000000 0>; brightness-levels = <0 30 40 50 60 70 100>; default-brightness-level = <6>; }; panel: panel { #address-cells = <1>; #size-cells = <0>; compatible = "qiaodian,qd43003c0-40", "simple-panel";//480x272 port@0 { reg = <0>; backlight = <&backlight>; #address-cells = <1>; #size-cells = <0>; panel_input: endpoint@0 { reg = <0>; remote-endpoint = <&tcon0_out_lcd>; }; }; }; }; &de { status = "okay"; }; &pwm { pinctrl-names = "default"; pinctrl-0 = <&pwm0_pin>; status = "okay"; }; &tcon0 { pinctrl-names = "default"; pinctrl-0 = <&lcd_rgb666_pins_a>; status = "okay"; }; &tcon0_out { tcon0_out_lcd: endpoint@0 { reg = <0>; remote-endpoint = <&panel_input>; }; };

如果想屏幕显示linux小企鹅

Device Drivers > Graphics support > Bootup logo [*] Standard black and white Linux logo (NEW) [*] Standard 16-color Linux logo (NEW) [*] Standard 224-color Linux logo (NEW)

如果想显示log则需要boot arguments里添加tty0即 console=ttyS0 改为 console=tty0 console=ttyS0

触屏

Device Drivers > Input device support > Horizontal screen resolution Vertical screen resolution

Touchscreens

Goodix I2C touchscree

音频

配置

因为设备树里已经有codec了,我们只需要在设备树里开启即可

c
&codec { allwinner,audio-routing = "Headphone", "HP", "Headphone", "HPCOM", "MIC1", "Mic", "Mic", "HBIAS"; status = "okay"; };

初始化会看到

ALSA device list: [ 1.410776] #0: V3s Audio Codec

执行 ls /dev/snd/可以看到

controlC0 pcmC0D0c pcmC0D0p timer

alsamixer 解除静音

视频播放

根文件系统配置:

Target packages → Audio and video applications → ffmpeg Build ffmpeg (the command line application) Build ffplay Build ffprobe Target packages → Graphic libraries and applications (graphic/text) mesa3d Gallium lima driver OpenGL EGL OpenGL ES

软解播放视频:

mpv --no-video test.mp3 ffmpeg -i test.mp4 -s 480x272 -pix_fmt bgra -f fbdev /dev/fb0 mpv --vo=drm --drm-draw-surface-size=480x272 test.mp4

改为200为双缓冲 Device Drivers > Graphics support > (100) Overallocation of the fbdev buffer

硬解播放视频配置:

Device Drivers > Staging drivers > Media staging drivers Allwinner sunXi family Video Devices Allwinner Cedrus VPU driver <*> Allwinner A31 Image Signal Processor (ISP) Driver
Device Drivers > Multimedia support > Media drivers [*] Media platform devices (NEW) ---> [*] V4L platform devices [*] Memory-to-memory multimedia devices <*> Deinterlace support <*> Video Multiplexer <*> Allwinner Deinterlace driver [*] V4L test drivers ---> <*> Virtual Memory-to-Memory Driver <*> Virtual Codec Driver <*> Virtual Media Controller Driver (VIMC) <*> Virtual Video Test Driver [ ] Enable CEC emulation support (NEW) (64) Maximum number of devices (NEW) < > Virtual Stateless Decoder Driver (visl)

硬解播放视频:

ffmpeg -hwaccel drm -hwaccel_device /dev/dri/card0 -s 480x272 -pix_fmt bgra -f fbdev /dev/fb0 -i /home/test.mp4 mpv --vo=drm --hwdec=auto --drm-draw-surface-size=480x272 /home/test.mp4

烧录

准备工作:

安装gparted sudo apt install gparted 选择TF卡卸载删除全部分区

首先新建linux分区,之前可用空间预留1M为uboot,新建32M fat16文件系统,卷标boot

烧录uboot

使用dd命令烧录u-boot到TF卡8K偏移处:

sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 如果不是第一次烧录,会有uboot env参数已经写入,会导致比如修改启动延迟不生效等问题,清除uboot分区 sudo dd if=/dev/zero of=/dev/sdb bs=1024 count=1024 seek=8

注意:/dev/sdb 指的是TF卡,可能是sdb也有可能是sdc,主要还是用命令 fdisk -l 来查看

拷贝kernel以及设备树

拷贝kernel

sudo cp arch/arm/boot/zImage /media/lqy/BOOT/ 拷贝设备树 sudo cp arch/arm/boot/dts/allwinner/sun8i-v3s-licheepi-zero.dtb /media/lqy/BOOT/

解压根文件系统

sudo tar -xvf rootfs.tar -C /media/lqy/rootfs/

本文作者:打盹的消防车

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!