STM32F746-DISCO运行Linux4.19

自闭症网瘾萝莉.ら 提交于 2019-12-05 22:10:54

STM32F746-DISCO运行Linux4.19


Linux Kernel

主线linux已经提供对无MMU的处理器的支持,configs中已经存在stm32_defconfig,DTS中包含:stm32f746-disco;因此只需要编译即可。
下载主线源码:http://cdn.kernel.org/pub/linux/kernel/v4.x
安装交叉编译链,可以使用之前编译uboot的arm-none-eabi-gcc,但是这个是编译链线程模式是single,而不是posix,也就是说虽然这个编译链可以编译内核和根文件系统,但是不能编译linux应用程序。如果需要支持编译linux应用程序(一般要支持,不然移植linux干嘛--!),则需要自己去构建交叉编译链,网上讲解的比较详细,不过我推荐使用Buildroot来构建支持stm32的交叉编译链,简单快捷,当然也可以用Buildroot来构建内核和根文件系统。

根文件系统

根文件系统可以使用busybox构建,也可以使用buildroot构建。
elinux.org提供了一个使用busybox编译好的Ramdisk最小系统,File:Stm32 mini rootfs.cpio.bz2, 但需要做如下改动:
使用initramfs,将下载的Stm32_mini_rootfs.cpio.bz2解压,先解压成cpio文件:
bzip2 -d Stm32_mini_rootfs.cpio.bz2
创建文件夹rootfs:
mkdir rootfs
将文件解压到rootfs文件夹中:
cpio -idmv <../Stm32_mini_rootfs.cpio
看看dev中是否有null,tty0,console节点,没有的话需要在dev文件夹中创建这三个节点。

sudo mknod console c 5 1 
sudo mknod null c 1 3 
sudo mknod tty0 c 204 64 

再rootfs文件夹下新建init文件,内容如下

#!/bin/sh # devtmpfs does not get automounted for initramfs /bin/mount -t devtmpfs devtmpfs /dev exec 0/dev/console exec 2>/dev/console exec /sbin/init $ 

配置内核使用initramfs
make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig

[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support  
    (/work/system/my-linux/rootfs) Initramfs source file(s)

上述步骤主要参考了这位老哥的实现,https://blog.csdn.net/u011371090/article/details/81587170
如果需要使用其他类型的根文件系统,比如ext4等,需要修改bootcmd,具体再研究。

编译过程

make ARCH=arm CROSS_COMPILE=arm-none-eabi- stm32_defconfig 
make mkimage -n 'linux' -A arm -O linux -T kernel -C none -a 0xc0300000 -e 0xc0300000 -d ./arch/arm/boot/zImage uImage 

UBOOT命令行手动下载,引导

setenv ipaddr 192.168.66.69 
setenv serverip 192.168.66.66 
tftp c0300000 uImage 
tftp c0500000 stm32f746-disco.dtb 
setenv bootargs "root=/dev/ram console=ttySTM0,115200" bootm c0300000 - c0500000 

UBOOT手动下载kernel至spi flash中

sf probe 
sf erase 0 1000000 
sf write c0300000 0 200000 
sf write c0500000 200000 4000 

UBOOT设置自动从spi flash中引导

可以更改源码将bootcmd写入源码中,不然每次都要手动改。

setenv bootcmd "setenv bootargs "root=/dev/ram console=ttySTM0,115200"; sf probe; sf read c0300000 0 200000;sf read c0500000 200000 4000;bootm c0300000 - c0500000;" 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!