【每周学习摘要17(23/02/19-24/02/25)】

Windows原生编译openssl 脚本

:: must be executed at the same directory as root of this project
:: need to install StrawBerry Perl and NASM, then fill in those two environment variables.
set StrawBerry=D:\Strawberry
set NASM_dir=D:\NASM
set JOM_dir=D:\Qt\jom
:: below no need to read
set StrawBerry_dir=%StrawBerry%\c\bin;%StrawBerry%\perl\bin;%StrawBerry%\perl\site\bin
set PATH=%NASM_dir%;%StrawBerry_dir%;%JOM_dir%;%PATH%
:: Refer to https://stackoverflow.com/questions/75869012/unable-to-build-my-c-project-with-jom-qmake-problem
:: Compiler said "If several cl.exe write in the same file .PDB, use /FS"
set CFLAGS=/FS 
set CXXFLAGS=/FS
:: use call otherwise the below commands will not be executed
call "C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 10.0.18362.0 -vcvars_ver=14.0
perl Configure --prefix=%cd%\openssl_build_output
jom -j32
jom test -j32
:: I don't know why but jom can't read the prefix 
nmake install -j32

Reference

How to Build OpenSSL, zlib, and cURL libraries on Windows
Notes for Windows platforms - openssl

Windows下编译ffmpeg(Msvc+msys2)

时效性声明

本文使用的版本为ffmpeg n6.1.1, vcvarsall.bat 来源于Visual Studio2022,
编译器为msvc v140

具体步骤

先随便打开一个cmd
-vcvars_ver=14.0 是为了用msvc v140(VS2015)编译
-use-full-path 是为了继承cmd里的环境变量到msys2 console里

"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 -vcvars_ver=14.0
D:\msys64\msys2_shell.cmd -use-full-path

到了msys2后安装git cmp make nasm

pacman -S git diffutils make nasm pkg-config

因为msys2自带的link和msvc里的link会冲突,所以修改原来的link名称

mv /usr/bin/link /usr/bin/lin

反正这个link基本用不到(msys2环境是隔离的,生成的库不能直接被msvc链接,还不如mingw64环境,那个至少还能生成可被msvc链接的东西)
然后克隆和配置,默认安装到/usr/local/ffmpeg-v6.1.1

git clone https://github.com/FFmpeg/FFmpeg.git --depth 1 -b n6.1.1 ffmpeg-v6.1.1
cd ffmpeg-v6.1.1
./configure --toolchain=msvc --prefix=/usr/local/ffmpeg-v6.1.1

warning C4828: 文件包含在偏移 0x1d9 处开始的字符,该字 符在当前源字符集中无效(代码页 65001)。make: *** Deleting file 'libavcodec/msvideo1enc.o'

可能会遇到编译器信息导致的编码错误(有些人cmd打开默认code page是936)
直接随便改一下或者根据cl.exe给出的,编辑config.h

#define CC_IDENT "用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.00.24247.2 版"

最后

make -j32
make install

Reference

Windows + MSVC环境编译ffmpeg - 罗均 - 知乎
FFmpeg wiki:CompilationGuide/MSVC

关于一直说的MSVC CRT是个什么东西

https://learn.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=msvc-170

Orcad Capture CIS

调整原理图页面默认字体,以及模板默认字体

Mingw-w64下链接动态库的细节

比如我想链接一个库-lA,在windows下有import library和static libraray之分,其中import library在mingw下通常以dll.a结尾,而statlic library则直接以.a结尾

打个比方usb-1.0,

libusb-1.0.a  libusb-1.0.dll.a

那么如果-L库路径包含了两个相同的会如何呢
请阅读binutils关于Win32的官方文档
这里面说了
For instance, when ld is called with the argument ‘-lxxx’ it will attempt to find, in the first directory of its search path,

libxxx.dll.a
xxx.dll.a
libxxx.a
xxx.lib
libxxx.lib
cygxxx.dll (*)
libxxx.dll
xxx.dll

所以是默认先找动态库的导入库进行链接的
其中还有有趣的 direct linking to a dll, 这是说不需要导入库,ld直接连接到一个dll上

如何让CMake找到QT

source
For find_package to be successful, CMake must find the Qt installation in one of the following ways:

  • Set your CMAKE_PREFIX_PATH environment variable to the Qt 5 installation prefix. This is the recommended way.
  • Set the Qt5_DIR in the CMake cache to the location of the Qt5Config.cmake file.
    但是下面那种办法只能找到qt core
    还需要设置一堆比如

    所以说, recommended approach is to set the CMake cache variable CMAKE_PREFIX_PATH to include the Qt 6 installation prefix

    cmake -GNinja -B build -DCMAKE_PREFIX_PATH=
    /Users/tz61/Qt/6.5.3/macos

    更快地编译QT6

    QT在6以后可以用cmake编译源码了,source

    Windows下CMake可以默认从C:/Qt下找到Qt各个版本

    在linux交叉编译openocd参考

    source

    MSVC BuildTools 老版本下载

    更新:MSVC老编译器可以从VS2022里面下载,没必要单独再搞个BuildTools
    2017: https://aka.ms/vs/15/release/vs_buildtools.exe
    2019: https://aka.ms/vs/16/release/vs_buildtools.exe
    2022: https://aka.ms/vs/17/release/vs_buildtools.exe
    source
    MSVC 14.16 是runtime 版本,10.0.17763.0是Windows SDK版本,19.16.27051是Compiler版本

【每周学习摘要16(23/01/20-24/01/26)】

QT

把AUTOUIC开启后
cmake通过add进executable的file中的include 语句判断ui文件
其中在include同级目录或者CMAKE_AUTOUIC_SEARCH_PATHS变量下寻找该ui文件
具体见https://cmake.org/cmake/help/latest/variable/CMAKE_AUTOUIC_SEARCH_PATHS.html#variable:CMAKE_AUTOUIC_SEARCH_PATHS

Vscode 调试Makefile

第一个方式,直接修改launch.json

这个文件从ece220/mps/mp10/.vscode/.launch.json

"configurations": [
        {
            "name": "(gdb) Launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/mp10",
            "args": [
                "graph",
                "requests",
                "0"
            ],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                },
                {
                    "description": "Set Disassembly Flavor to Intel",
                    "text": "-gdb-set disassembly-flavor intel",
                    "ignoreFailures": true
                }
            ]
        }
    ]

第二个方式,通过Makefile插件

然后打开workspacesettings.json,修改makefile.launchConfigurations

{
    "makefile.launchConfigurations": [
        {
            "cwd": "/home/ztn/Documents/cs225sp24/lab_debug",
            "binaryPath": "/home/ztn/Documents/cs225sp24/lab_debug/sketchify",
            "binaryArgs": ["in_111","sddsd"]
        }
    ]
}

stm32重定向printf

需要修改fputc,或者write, 因为不同库实现不一样,而且gcc的newlib版本不同,新版本需要修改write

【每周学习摘要15(23/12/30-24/01/05)】

ubuntu-base 不能获取串口的原因

卡在serial getty’
原因:没有安装udev
source

mplayer 播放

mplayer -vo fbdev2:/dev/fb1 -vf scale=240:135 -geometry 0:50 -fps 30 -ao alsa:device=hw=0.0 badapple.mp4
alsa那里 hw=0.0 可以用aplay -l 查看card:device
如果是用drm产生的fb需要用fbdev2:/dev/fb0,其他比如fbtft的就用fbdev:/dev/fb0

mpg123使用

mpg123 -o alsa:hw:0,0 mican*\ -\ Deadline.mp3
同理

ubuntu-base移植libmali

参考仓库mirror
其中我看到官方rk的buildroot镜像里面,libEGL,libgbm的大小都是一样的里面有libmali_hook.so.1的调用关系
现在知道libmali_hook怎么生成(在刚才那个仓库的hook文件夹下),
然后libegl,libgbm什么的大小竟然都一样

(base) ➜  lib ls -l libgbm.so.1 libEGL.so.1 libGLESv1_CM.so.1 libGLESv2.so.2 
-rwxr-xr-x 1 root root 5784  9月 14 17:01 libEGL.so.1
-rwxr-xr-x 1 root root 5784  9月 14 17:01 libgbm.so.1
-rwxr-xr-x 1 root root 5784  9月 14 17:01 libGLESv1_CM.so.1
-rwxr-xr-x 1 root root 5784  9月 14 17:01 libGLESv2.so.2
(base) ➜  

补充:这些libegl,libgbm什么的都是一些wrapper库,具体创建过程在这个脚本里
meson.build
我到时候解读一下然后换成用普通命令创建,不用meson

【每周学习摘要14(23/12/23-23/12/29)】

手动编译最新版本的rockchip bsp linux

CrossCompile Toolchain

首先交叉编译工具链可以从linaro下载,这个无所谓

boot.img

boot.img是rockchip专有镜像格式 ,需要使用他们kernel仓库的Makefile里面的命令进行打包,具体原理暂时不清楚。
先把泰山派的设备树拷贝到kernel/arch/arm64/dts/rockchip/下面

export PATH="$PATH:/home/ztn/Embedded/Allwinner/Allwinner-H616/toolchains/bin"
ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- make tspi-rk3566-user-v10-linux.img -j32

然后可以得到boot.img,这个文件里面包含了内核镜像文件和设备树tspi-rk3566-user-v10-linux.dtb

u-boot.itb

这个文件是一个复合体
需要py2环境
然后利用rkdeveloptool,先加载bootloader到内存,然后烧录,然后再烧录boot.img,u-boot.itb

ZYNQ EBAZ4205

为什么正点原子的镜像启动不了,我猜是启动参数(比如DDR配置不一样)所以说开不起来。已经改了电阻了也不行。
别慌,明天自己编译一遍

【每周学习摘要13(23/12/16-23/12/22)】

RK3566 Drm Panel 驱动配置

1.dt-binding解读-2022-03-24 RK3566 MIPI屏 调试记录,panel-init-sequence 命令格式介绍
2.配置生成工具-original_mipi_init_sequence-to-rk_dts_panel_init_sequence-convert Public
panel节点是挂载在dsi0节点下面,如果对应spi屏幕的drm驱动,则是将panel节点挂载在spi0节点下面,参考嵌入式Linux使用TFT屏幕:使用树莓派4B的MIPI-DSI接口点亮ST7701S屏幕

关于怎么解读屏幕参数和时序,然后填写dts,参考RK3588-MIPI屏幕调试笔记:RK3588-MIPI-DSI之屏参配置
再具体的话,可以参考rockchip官方bsp仓库-drivers/gpu/drm/panel/panel-simple.c
arch/arm64/boot/dts/rockchip

eDP屏幕相关

RK3568 EDP接口调试

RockChip编译教程

其实可以单独下载github上rockchip-linux的官方bsp linux,u-boot仓库单独编译
也可以设置上次那个H616里面的工具链
但是在make.sh的第273行需要把none加进去
然后需要clone rkbin到同级目录

CROSS_COMPILE_ARM64=$(cd `dirname ${CROSS_COMPILE_ARM64}`; pwd)"/aarch64-none-linux-gnu-"

具体操作可以看toybrick的仓库里面的make.sh,也可以使用官方推荐的
比如
软件开发/U-Boot

具体编译

Rockchip-linux kernel-5.10

git clone https://github.com/rockchip-linux/kernel.git -b develop-5.10 --depth 1
cd kernel
ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- make rockchip_linux_defconfig
ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu- make -j32

Rockchip-linux uboot

直接根据toybrick的进行编译,clone 他们自己的编译工具链后然后照做

./make.sh rk3566

rkdevelop-tool

需要切换到gcc-7/g++-7编译
具体操作自己看rkdeveloptool

在rk3566上编译taisei-v1.3

没什么好说的,甚至可以用自带的SDL
之前我以为自带的SDL有bug,其实是因为可能在mingw上面编译的缘故,编译完了有些东西针对mingw平台的没开,然后就启动不了窗口,只能通过pacman安装
想不到1G内存+tf卡这种丐版配置都能编译SDL2+taiseiv1.3
但是taisei和extreme-tux-tracer这两个游戏,以及glxinfo监测的时候都只察觉到了llvmpipe 这个软件渲染器。
但是glmark2-es2就可以完美利用GLES2
后来我才知道原来GLES2 API不一定需要EGL作为后端,也可以在GLX上面使用,然后glmark2-es2就是在X11上面通过GLX使用了GLES2的API
taisei和etr估计在链接的时候就用的是gl的API,所以fallback了到llvmpipe上面的api(mesa库提供的)
然后他们在运行的时候会显示

libGL error: unable to load driver: rockchip_dri.so
libGL error: driver pointer missing
libGL error: failed to load driver: rockchip

但是跑glmark2-es2就不会出现这些
根据那个Richardn2002兄弟的在stm32MP157上的源码STM32MP157F-DK2/blob/main/src/gl-test.c
可以知道,程序链接时需要链接GLESv2库而非GL,然后gl头文件需要用GLES2/gl2.h而非GL/gl.h
看SDL2的做法好像是用他们自己的头文件套了一层?这个有待研究。先准备math241 mid3先
然后找到的Xorg加载GLX的流程:Firefly3568-libGL error: failed to load driver: rockchip
3588上运行qt报错,请指教
GPU/Driver/libGL error on Rock 4C plus on Debian

GL4ES

将gl call 转换成gles call,且自己创建一个context。
用的时候把编译产生的libGL.so.1放到LD_LIBRARY_PATH就行。
然后只能运行gles2.0
然后可以玩etr但是很鬼畜,玩不了taisei

查看GPU使用率

RK查看gpu占用率方法

cat /sys/devices/platform/fde60000.gpu/devfreq/fde60000.gpu/load

转接板

st7701的屏幕:(0.5mm pitch),fl7703np(0.3mm pitch)

fl7703np转接板

排线 31pin 0.3mm 3块钱一根
31pin 0.3mm 排座 0.3一个,要两个
然后是3.3V转1.8V点LDO芯片,芯片准备用ME6206A18XG,输出电压1.8V,那个屏幕没说需要多大电流,然后SOT23-3封装最大功率300mW,所以没关系的。主要这个也便宜
这个转接板成本加起来可能就5块钱,所以还好
注意转接板要连接
泰山派上面的屏幕背光驱动芯片是SY7201,电流计算公式是I=0.2V/R
所以说驱动st7701s 20mA需要200mV/20mA=10Ohm作为反馈电阻,可以买两个20欧的电阻并联或者直接一个10欧电阻

【每周学习摘要12(23/12/09-23/12/15)】

STM32

STM32F334

官方HAL库如果用gdb调试则会卡在时钟设置,
但是用ChibiOS 的HAL/RT则没有任何问题。
尝试探索原因才发现,RCC->CR和RCC->CFGR并非上电后自动变成0,比如CFGR里面的SW一开始就是选择PLL的,但是官方HAL库没有进行检查
因此ChibiOS的启动文件里面手动对寄存器进行了清零
下面是ChibiOS里面的STM32F3xx/hal_lld.c的初始化函数,
HSI是默认开启的,因为手册里写RCC->CR resetval=0x0000 XX83
这里做了一次检查保证HSI先开起来。
总流程大概是

  • 1.先检查HSI开启
  • 2.配置CFGR,切换时钟源为HSI
  • 3.清空CFGR和CR(为初始值)
    HSI校正是自动的,

    CFGR2(HSEPrescale)不能写入

    要提前将SW切换到HSI


void stm32_clock_init(void) {

#if !STM32_NO_INIT
  /* HSI setup, it enforces the reset situation in order to handle possible
     problems with JTAG probes and re-initializations.*/
  RCC->CR |= RCC_CR_HSION;                  /* Make sure HSI is ON.         */
  while (!(RCC->CR & RCC_CR_HSIRDY))
    ;                                       /* Wait until HSI is stable.    */

  /* HSI is selected as new source without touching the other fields in
     CFGR. Clearing the register has to be postponed after HSI is the
     new source.*/
  RCC->CFGR &= ~RCC_CFGR_SW;                /* Reset SW, selecting HSI.     */
  while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI)
    ;                                       /* Wait until HSI is selected.  */

  /* Registers finally cleared to reset values.*/
  RCC->CR &= RCC_CR_HSITRIM | RCC_CR_HSION; /* CR Reset value.              */
  RCC->CFGR = 0;                            /* CFGR reset value.            */

然后在STM32官方HAL库的HAL_RCC_OscConfig函数最前面加上清零

HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef  *RCC_OscInitStruct)
{
  uint32_t tickstart;
  uint32_t pll_config;
#if defined(RCC_CFGR_PLLSRC_HSI_PREDIV)
  uint32_t pll_config2;
#endif /* RCC_CFGR_PLLSRC_HSI_PREDIV */
  // Added by TonyZhang, following ChibiOS's startup file
    RCC->CFGR &= ~RCC_CFGR_SW;                /* Reset SW, selecting HSI.     */
    while ((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_HSI)
        ;                                       /* Wait until HSI is selected.  */
    RCC->CR &= RCC_CR_HSITRIM | RCC_CR_HSION; /* CR Reset value.              */
    RCC->CFGR = 0;

对于什么是HSE Bypass

寄存器里可以配置HSE(告诉外部晶振)是否bypass,
如果选择bypass, 则接收外部时钟信号(有源晶振)
如果关闭bypass,则外部为无源晶振+陶瓷电容组成的振荡器,内部会开启反相器构成皮尔斯振荡器进行震荡

【每周学习摘要09(23/11/18-23/11/24)】

全志A33

核心板

经典核心板
1.锐尔威视A33-VSTAR
2.芯灵思SINLinx-SinA33
其中第二个有主线支持

开发包下载

1.一牛网
https://pan.baidu.com/s/13tXGCSaP4LRRM9uD5VqEiQ 9cpd
2.BSP开发包下载链接: https://pan.baidu.com/s/1jIvJiOu 密码: p6w7
source

编译教程

1.全志A33编译环境搭建
2.SINA33-V1.0 android系统的编译过程
3.whycan
241加油,先不弄了

在主线运行Mali GPU驱动(A33 Utgard)

sunxi的page发现的,一个是在bsp kernel加载ARM驱动(已经过时),还有一个是在主线加载驱动
当运行ARM闭源驱动的时候,运行eglinfo时看到Vendor就不是panfrost/lima而是ARM,但是不支持GLX,只支持EGL,但是可以用OpenVG,OpenCL等API(如果有)
参考bootlin的文章
这个r9p0是DDK的版本,一个DDK分为内核部分和用户空间部分
内核部分按照GPLv2开源
用户空间驱动由rk,全志,Amlogic这种签了协议的编译发布二进制blob

Xorg/GPU/APIs

术语表
EXA: Acceleration architecture with no well-defined acronym. Based on the kdrive acceleration architecture (KAA) but with some additional features and cleanups, and designed to be used within the xfree86 DDX.
DDX: Device Dependent X. The part of X that interacts with the hardware. There have been many of these over the years:xfree86, kdrive, xwin (for Windows), darwin (for OS X), xgl, vfb, xnest, and so forth. In the X server code, each directory under hw corresponds to one DDX. One DDX may have one or more device drivers. In the xfree86 DDX, each driver is a separate loadable module; in most of the other DDXes, each driver is compiled to its own server binary. Contrast: DIX.
EGL可以理解为一个API,然后通过EGL与X11的API,可以与XOrg交互。具体源码SimpleGL_example,也可以看A33主线Linux跑起OpenGL/ES
然后EGL底层有GBM/EGLStream等实现显存管理的方法,也可以是fbdev这种最基础的,见Fbdev的局限性-ARM
Wayland只是上层建筑,它可以基于GBM/EGLStream/fbdev(deprecated)这些backend...,详见Wayland-ArchWiki

瑞芯微

瑞芯微启动过程

https://opensource.rock-chips.com/wiki_Boot_option
不像全志,瑞芯微有两套启动方案,一套是闭源的二进制miniloader,还有一套是开源的u-boot TPL/SPL方案
原厂u-boot

生成ddr配置

在rkbin/tools里面有ddrbin_tool
可以用来生成ddr配置

11:29:23 ztn@DESKTOP-9D7T4FN rkbin ±|master ✗|→ ddrbin_tool -g gen_param.txt rv1126_ddr_784MHz_v1.09.bin
ddrbin_tool -g gen_param.txt rv1126_ddr_784MHz_v1.09.bin
version v1.15 20230530