你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32MP157开发经验之OpenSTLinux

[复制链接]
y369369 发布时间:2022-8-26 15:55



今天来搞一下STM32MP157F-DK2,顺便写一下,我是参考官方的wiki,进行体验使用,并对相关过程做个记录。
先来个全貌展示
11.png

基础准备工作
系统环境
下载安装Ubuntu Desktop(这里使用版本为20.04.4):https://ubuntu.com/download/desktop


安装完成后进行基础环境安装与设置:
  1. sudo apt update
  2. sudo apt install -y build-essential
复制代码
以下为应用与内核开发需要的环境安装与设置:
  1. sudo apt install -y gawk git-core diffstat texinfo gcc-multilib chrpath socat cpio python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 pylint xterm
  2. sudo apt install -y xsltproc docbook-utils fop dblatex xmlto
  3. sudo apt install -y libmpc-dev libgmp-dev
  4. sudo apt install -y libncurses5 libncurses5-dev libncursesw5-dev libssl-dev linux-headers-generic u-boot-tools device-tree-compiler bison flex libyaml-dev libmpc-dev libgmp-dev
  5. sudo apt install -y python-is-python3

  6. # 设置使MMC支持分为16个分区
  7. echo 'options mmc_block perdev_minors=16' > /tmp/mmc_block.conf
  8. sudo mv /tmp/mmc_block.conf /etc/modprobe.d/mmc_block.conf
复制代码

硬件连接
硬件连接如下图所示:
12.png
特别需要注意的是使用的电源(5V3A)、供电的USB线、通讯的USB线品质不能太差,不然可能系统镜像烧录过程中会出错。


系统镜像烧录测试
ST官方提供了测试用的系统镜像,使用ST的烧录工具可以烧录镜像到存储器中。烧录工具有Linux、Windows、Mac版本的,选择合适的平台进行即可。


烧录是通过 USB OTG 那个口进行的(DFU模式)。需要注意的是烧录过程中设备会断开重新连接,如果使用虚拟机的话需要把这个USB设备设置为自动转到虚拟机或是在重新连接的过程中手动转到虚拟机。


下面是Linux下系统镜像烧录测试过程:


STM32CubeProgrammer安装
STM32CubeProgrammer用来将系统二进制文件烧录到TF卡或eMMC中,可以从下面选择合适的版本下载:
https://www.st.com/en/development-tools/stm32cubeprog.html
我这里通过Ubuntu自带的浏览器下载,得到的 en.stm32cubeprg-lin_v2-10-0.zip 文件位于 ~/Downloads/ 目录下。


接下来进行安装:
  1. # 建立STM32CubeProgrammer安装目录
  2. mkdir -p ~/mp157/tools/prog

  3. # 解压与安装
  4. cd ~/Downloads/
  5. unzip en.stm32cubeprg-lin_v2-10-0.zip
  6. ./SetupSTM32CubeProgrammer-2.10.0.linux
  7. # 安装时选择上面建立的安装目录,其它默认即可
复制代码
允许USB相关功能:
  1. # sudo apt install libusb-1.0-0
  2. cd ~/mp157/tools/prog/Drivers/rules/
  3. sudo cp *.* /etc/udev/rules.d/
复制代码
导出到环境变量方便使用:
  1. # 下面方式是临时的,每次打开终端都需要重新设置
  2. export PATH=$HOME/mp157/tools/prog/bin:$PATH
  3. # 设置成功的话使用 STM32_Programmer_CLI --h 可以看到软件信息
复制代码
系统镜像烧录
从下面地址下载ST官方提供的系统镜像:
https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1starter.html
我这里通过Ubuntu自带的浏览器下载,得到的 en.FLASH-stm32mp1-openstlinux-5-10-dunfell-mp1-21-11-17_tar.xz 文件位于 ~/Downloads/ 目录下。
  1. mkdir -p ~/mp157/ecosystem/starter
  2. cd ~/mp157/ecosystem/starter

  3. mv ~/Downloads/en.FLASH-stm32mp1-openstlinux-5-10-dunfell-mp1-21-11-17_tar.xz ./
  4. tar xvf en.FLASH-stm32mp1-openstlinux-5-10-dunfell-mp1-21-11-17_tar.xz
  5. # 官方的系统固件与烧录配置等都在解压得到的目录中
复制代码
烧录前将开发板背面的两个拨码开关都拨到OFF位置,然后按正面的RESET按钮进行复位。接着启动烧录工具:
  1. STM32CubeProgrammer
复制代码
连接设备,打开下面目录中对应的烧录配置文件(.tsv):
~/mp157/ecosystem/starter/stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/images/stm32mp1/flashlayout_st-image-weston/
然后二进制文件路径选择下面这个:
~/mp157/ecosystem/starter/stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/images/stm32mp1/
最后点击 Download 进行烧录即可:
13.png
烧录过程比较漫长,请耐心等待。


烧录完成后将开发板背面的两个拨码开关都拨回ON位置,然后按正面的RESET按钮进行复位。
系统将正常启动显示开机画面,初次启动时接着将黑屏几分钟进行初始化,完成后会在屏幕上显示文章开头图片中画面。


如果STLink那个USB口使用数据线连接到电脑的话会在电脑上有一个串口,使用终端工具进行连接的话会在这里打印出启动日志。也可以通过这里与系统进行交互:
14.png


应用与内核开发
SDK安装
从下面地址下载ST官方提供的SDK(SDK中包含编译工具链和库文件):
https://www.st.com/content/st_com/en/products/embedded-software/mcu-mpu-embedded-software/stm32-embedded-software/stm32-mpu-openstlinux-distribution/stm32mp1dev.html
我这里通过Ubuntu自带的浏览器下载,得到的 en.SDK-x86_64-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar.xz 文件位于 ~/Downloads/ 目录下。
  1. cd ~/Downloads/
  2. tar xvf en.SDK-x86_64-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar.xz

  3. # 建立SDK安装目录
  4. mkdir -p ~/mp157/ecosystem/developer/SDK
  5. # 执行脚本安装SDK
  6. chmod +x stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17.sh
  7. ./stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sdk/st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1.11-openstlinux-5.10-dunfell-mp1-21-11-17.sh -d $HOME/mp157/ecosystem/developer/SDK

  8. # 设置SDK
  9. # 下面方式是临时的,每次打开终端都需要重新设置
  10. cd ~/mp157/ecosystem/developer/
  11. source SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
  12. # echo $ARCH
  13. # echo $CROSS_COMPILE
  14. # $CC --version
  15. # echo $OECORE_SDK_VERSION
复制代码
应用开发
  1. # 建立并进入工程目录
  2. mkdir -p ~/mp157/ecosystem/developer/application/gtk_hello_world_example
  3. cd ~/mp157/ecosystem/developer/application/gtk_hello_world_example/
复制代码
建立 gtk_hello_world.c 文件(gedit gtk_hello_world.c),内容如下:
  1. #include <gtk/gtk.h>

  2. static void
  3. print_hello (GtkWidget *widget,
  4.              gpointer   data)
  5. {
  6.   g_print ("Hello World\n");
  7. }

  8. static void
  9. activate (GtkApplication *app,
  10.           gpointer        user_data)
  11. {
  12.   GtkWidget *window;
  13.   GtkWidget *button;
  14.   GtkWidget *button_box;

  15.   window = gtk_application_window_new (app);
  16.   gtk_window_set_title (GTK_WINDOW (window), "Window");
  17.   gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  18.   button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
  19.   gtk_container_add (GTK_CONTAINER (window), button_box);

  20.   button = gtk_button_new_with_label ("Hello World");
  21.   g_signal_connect (button, "clicked", G_CALLBACK (print_hello), NULL);
  22.   g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
  23.   gtk_container_add (GTK_CONTAINER (button_box), button);

  24.   gtk_widget_show_all (window);
  25. }

  26. int
  27. main (int    argc,
  28.       char **argv)
  29. {
  30.   GtkApplication *app;
  31.   int status;

  32.   app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  33.   g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  34.   status = g_application_run (G_APPLICATION (app), argc, argv);
  35.   g_object_unref (app);

  36.   return status;
  37. }
复制代码
建立 Makefile 文件(gedit Makefile),内容如下:
  1. PROG = gtk_hello_world
  2. SRCS = gtk_hello_world.c

  3. CLEANFILES = $(PROG)

  4. # Add / change option in CFLAGS and LDFLAGS
  5. CFLAGS += -Wall $(shell pkg-config --cflags gtk+-3.0)
  6. LDFLAGS += $(shell pkg-config --libs gtk+-3.0)

  7. all: $(PROG)

  8. $(PROG): $(SRCS)
  9.         $(CC) -o $@ $^ $(CFLAGS) $(LDFLAGS)

  10. clean:
  11.         rm -f $(CLEANFILES) $(patsubst %.c,%.o, $(SRCS))
复制代码
使用 make 进行编译。编译得到的二进制文件可以通过网络传输到开发板中(比如使用 scp gtk_hello_world root@<board ip address>:/usr/local 方式),然后在开发板中运行(比如通过串口终端来运行)。运行运行上面程序会在开发板的屏幕上出现一个带有按钮的窗体:
15.png
内核编译
从下面地址下载ST官方提供的Linux内核源码开发包:开发包

我这里通过Ubuntu自带的浏览器下载,得到的 en.SOURCES-kernel-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar.xz 文件位于 ~/Downloads/ 目录下。
  1. # 解压开发包内容
  2. cd ~/mp157/ecosystem/developer/
  3. cp ~/Downloads/en.SOURCES-kernel-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar.xz ./
  4. tar xvf en.SOURCES-kernel-stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17.tar.xz

  5. # 解压内核,打上MP157补丁
  6. cd stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.10.61-stm32mp-r2-r0/
  7. tar xvf linux-5.10.61.tar.xz
  8. cd linux-5.10.61
  9. for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
复制代码
  1. # source $HOME/mp157/ecosystem/developer/SDK/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
  2. # 进行相关设置
  3. make ARCH=arm multi_v7_defconfig "fragment*.config"
  4. for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done
  5. yes '' | make ARCH=arm oldconfig

  6. # 编译内核和设备树
  7. make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040

  8. # 编译内核模块
  9. make ARCH=arm modules

  10. mkdir -p $PWD/install_artifact/
  11. make ARCH=arm INSTALL_MOD_PATH="$PWD/install_artifact" modules_install
复制代码
编译完成后后可以使用网络将生成的内容更新到开发板上:
  1. # 更新内核
  2. # scp arch/arm/boot/uImage root@<board ip address>:/boot

  3. # 更新设备树
  4. # scp arch/arm/boot/dts/stm32mp157*.dtb root@<board ip address>:/boot

  5. # 更新内核模块
  6. # rm install_artifact/lib/modules/5.10.61/build install_artifact/lib/modules/5.10.61/source
  7. # find install_artifact/ -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
  8. # scp -r install_artifact/lib/modules/* root@<ip of board>:/lib/modules
复制代码
以下操作在开发板终端中进行:
  1. # /sbin/depmod -a
  2. # sync

  3. # 重启使所有更改生效
  4. # reboot
复制代码
内核修改测试
  1. # cd $HOME/mp157/ecosystem/developer/stm32mp1-openstlinux-5.10-dunfell-mp1-21-11-17/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.10.61-stm32mp-r2-r0/linux-5.10.61/

  2. # 打开内核一个源码进行修改
  3. gedit ./drivers/gpu/drm/stm/drv.c
复制代码
在打开的文件中添加红框中一条语句:
16.png
修改完成后保存推出,然后重新编译内核:
  1. make uImage LOADADDR=0xC2000040

  2. # 编译完成后重新传输内核到开发板
  3. scp arch/arm/boot/uImage root@<board ip address>:/boot
复制代码
以下操作在开发板终端中进行:
  1. reboot
  2. # 等待重启完成查看刚才修改的打印信息
  3. dmesg | grep -i stm_drm_platform_probe
复制代码
17.png


收藏 评论1 发布时间:2022-8-26 15:55

举报

1个回答
STMCU-管管 回答时间:2022-9-2 09:20:51
谢谢分享

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版