先更新下本地软件包列表,是否更新软件自己决定
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
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
图形配置:
make menuconfig
f1c100s的话修改以下(可选):
arch/arm/mach-sunxi/dram_suniv.c
中
struct 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
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/下
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
使用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
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 许可协议。转载请注明出处!