原计划调试SPI设备,由于遇到了困难多方查找资料也没有找到解决的办法,只能暂时搁置下来。看来只有自己想办法了。如果自己编写SPI设备的驱动,就需要重新编译内核代码,制作自己的image了。经过艰苦的努力终于用了一点发现。这其中最痛苦的是st的wiki网站实在是慢!!大把的时间都是在等待网站的回应。
准备编译环境
编译的必要条件是安装SDK,安装过程前面有叙述,主要是注意一定的检查环境变量。注意我用的是ubuntu 16.04,有个叫bc的工具据说是统计字符的,这个版本中默认是没有安装的。
apt install bc
安装成功后在进行下面的步骤。
下载安装源码包
en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz
参考资料和README.HOW_TO.txt
1、安装内核源码。
$ tar xvf en.SOURCES-kernel-stm32mp1-openstlinux-20-02-19.tar.xz
$ cd stm32mp1-openstlinux-20-02-19/sources/arm-ostl-linux-gnueabi/linux-stm32mp-4.19-r0/
$ tar xvf linux-4.19.94.tar.xz
源码安装成功!
2、打补丁
$> cd linux-4.19.49
$> for p in `ls -1 ../*.patch`; do patch -p1 < $p; done
不出错误就完成
3、准备编译
$> cd linux-4.19.49
$> mkdir -p ../build
在源码的目录上层建立build目录用来编译
$> make ARCH=arm O="$PWD/../build" multi_v7_defconfig fragment*.config
$> for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r -O $PWD/../build $PWD/../build/.config $f; done
$> yes '' | make ARCH=arm oldconfig O="$PWD/../build"
以上操作在linux-4.19.49 目录完成,检查build目录,应该有makefile等文件
$> cd build
$> make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040
$> make ARCH=arm modules
编译模块和驱动,注意时间较长。
4、开始编译
进入源码目录
$> cd <directory to kernel source code>
* Build kernel images (uImage and vmlinux) and device tree (dtbs)
$> make ARCH=arm uImage vmlinux dtbs LOADADDR=0xC2000040 O="$PWD/../build"
* Build kernel module
$> make ARCH=arm modules O="$PWD/../build"
注意时间较长
5、制作安装固件
* Generate output build artifacts
$> make ARCH=arm INSTALL_MOD_PATH="$PWD/../build/install_artifact" modules_install O="$PWD/../build"
$> mkdir -p $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/uImage $PWD/../build/install_artifact/boot/
$> cp $PWD/../build/arch/arm/boot/dts/st*.dtb $PWD/../build/install_artifact/boot/
以上步骤比较顺利完成,在build下发现制作好的内核文件。注意只是内核文件。这次没有更加深入的研究设备驱动的制作。 资料上说是通过修改device tree (dtbs)文件配置来加入驱动的。
6、内核文件的修改。
st公司没有提供GUI类型的linux内核配置的工具,也没有制作各种烧写image的脚本。只是提供了修改内核的方法。
比较靠谱的方法是提供读卡器进行修改内核文件。我没有急着修改SD卡的内容。如果坏了我的板子就“变砖”啦。先介绍不动手。
SDCARD 是linux能够使用的文件系统,内核和驱动都是磁盘文件。只要替换就可以完成更新。
修改内核
(1)找一个USB读卡器,插入制作好系统的SDCARD。
(2)mount SD卡
(3)进入<path to install_artifact dir>/install_artifact
(4)拷贝boot目录到SDCARD cp -r boot/* /media/$USER/bootfs/
(5)卸载SD卡
修改模块
(1)进入<path to install_artifact dir>/install_artifact
(2)删除连接文件 rm lib/modules/<kernel version>/source lib/modules/<kernel version>/build
(3)制作拷贝列表 find . -name "*.ko" | xargs $STRIP --strip-debug --remove-section=.comment --remove-section=.note --preserve-dates
(4)拷贝文件到SD卡 cp -r lib/modules/* /media/$USER/rootfs/lib/modules/
(5)卸载SD卡
修改板子上的依赖
注意这是在板子上操作
Generate a list of module dependencies (modules.dep) and a list of symbols
provided by modules (modules.symbols):
$> ssh root@<ip of board> depmod -a
Synchronize data on disk with memory
$> ssh root@<ip of board> sync
Reboot the board in order to take update into account
$> ssh root@<ip of board> reboot
7、使用工厂image制作tf卡
首先,下载en.FLASH-stm32mp1-openstlinux-20-02-19.tar.xz软件包。解压到目录下。
制作TF-A卡需要使用工具STM32CubeProgrammer来烧写,本次测试是在windows主机下进行的。安装工具时需要注意,如果先前安装过该软件,需要把DFU驱动先卸载在安装。我没有安装过所以一次就安装好了。
使用一张空白卡制作工作image ,将板子上的sw1的两个都跳线拨到off位置,将TF-A卡插好,将USB-C电缆和ST-link、网线都与PC机相连。然后给板子上电。
上电后,按下板子上的reset按键。打开STM32CubeProgrammer
选择连接方式为USB。如果成功可以出现板子的信息。
使用open file文件卡打开stm32mp1-openstlinux-20-02-19\images\stm32mp1\flashlayout_st-image-weston下的tsv文件。选择你需要使用的。
本次使用“FlashLayout_sdcard_stm32mp157a-dk1-basic.tsv”
指定Binaries PATH的路径为image的目录。stm32mp1-openstlinux-20-02-19\images\stm32mp1\
单击download,就开始制作TF-A卡了。
完成后,给板子断电。将板子上的sw1的两个都跳线拨到on位置。
上电,就可以看到启动的界面了。
参考资料
https://wiki.st.com/stm32mpu/wiki/STM32MP1_Developer_Package#Installing_the_Linux_kernel
https://wiki.st.com/stm32mpu/wiki/How_to_build_Linux_kernel_user_space_tools
此内容由EEWORLD论坛网友bigbat原创,如需转载或用于商业用途需征得作者同意并注明出处