stm32中Linux系统移植

目录

一,搭建ubuntu的环境

二、安转服务与辅助Windows软件

1、ssh远程软件的安装

2、安装配置samba服务

3,安装和配置NFS

4,安装和配置tftp服务

5,安装相关的软件包

二,linux内核移植

1,将开发板和电脑相连

2,安装交叉工具链

 3,编译linux内核


一,搭建ubuntu的环境

ubuntu配置: 硬盘大小:60G以上,内存:4G

这是移植内核ubuntu的环境大小最小标准。

配置网络服务

打开网络配置文件sudo vim /etc/netplan/01-network-manager-all.yaml

按下面的配置设置自己的IP

# Let NetworkManager manage all devices on this system
network:
  version: 2
# renderer: NetworkManager
  ethernets:
        ens33:
                dhcp4: no
                dhcp6: no
                addresses: [192.168.60.5/24]       //修改IP
                gateway4: 192.168.60.1             //修改网关
                nameservers:
                        addresses: [202.96.128.86]
重启网络服务sudo netplan apply

二、安转服务与辅助Windows软件

1、ssh远程软件的安装

查看我以前的https://mp.csdn.net/mp_blog/creation/editor/new/129177915这个文章有说到。这样就可以使用

使用MobaXterm远程连接ubuntu。这可以粘贴复制,有助于下面的操作“用不用看你自己”。

2、安装配置samba服务

1,下载安装 samba 服务器
    farsight@ubuntu:~$ sudo apt-get update
    farsight@ubuntu:~$ sudo apt-get install samba samba-common
   
2,修改配置文件:/etc/samba/smb.conf
    //打开配置文件:
            farsight@ubuntu:~$ sudo vim /etc/samba/smb.conf
    //在文件末尾添加下面内容:
            [farsight]    //改为希望在 Windows 中看到共享目录的名字—自定义
            path = /home/farsight    //路径改为要共享的目录路径
            browseable = yes
            public = yes
            available = yes
            writable = yes
            valid users = farsight //用户名改为:当前 ubuntu 系统的用户名
3,给 samba 用户 ,如:farsight 设置密码
        farsight@ubuntu:~$ sudo smbpasswd -a farsight          
4,重启 samaba 服务
    farsight@ubuntu:~$ sudo /etc/init.d/smbd restart
    [ ok ] Restarting smbd (via systemctl): smbd.service    
5,测试
    在windows系统中,按win+r,输入:\\ubuntu的IP,查看是否用文件共享成功
    点击进去需要权限在Ubunto中输入 sudo chmod 0777 farsight
    
//个人建议不要设密码麻烦,在环境中“valid users = farsight //用户名改为:当前 ubuntu 系统的用户名”这个就可不用设置。

3,安装和配置NFS

1,安装 NFS 服务器端
    farsight@ubuntu:~$ sudo apt-get install nfs-kernel-server
/*
2,将文件系统 rootfs.tar.xz 拷贝到 /opt 目录,并解压
    farsight@ubuntu:/opt$ tar -xvf rootfs.tar.xz
3,将解压后的文件系统路径配置到nfs中
    //打开配置文件
    sudo vim /etc/exports
    //在文件末尾添加下面一行
    /opt/rootfs    *(rw,sync,no_root_squash,no_subtree_check)
    //重启nfs服务
    sudo /etc/init.d/nfs-kernel-server restart
    sudo exportfs -a
*/   看你自己是否有内核文件了,没有就安装测试就好了。记得把/opt使用samba服务共享这样有助于移植文件。
4,测试 ---将文件系统挂在到家目录下的mnt,检查是否成功
    farsight@ubuntu:~$ sudo mount -t nfs 192.168.60.5:/opt/rootfs  ./mnt      //挂在测试
    farsight@ubuntu:~$ ls mnt/
    bin  dev  etc  lib  linuxrc  mnt  proc  root  sbin  sys  tmp  usr  var//显示的内容
    farsight@ubuntu:~$ sudo umount ./mnt        //卸载
​
//NFS是用来挂载下载文件系统用的,记得一定得测试

4,安装和配置tftp服务

1,下载 tftp 服务器
    farsight@ubuntu:~$ sudo apt-get update
    farsight@ubuntu:~$ sudo apt-get install tftp-hpa tftpd-hpa
2,在根目录下建立 tftp 工作目录
    farsight@ubuntu:~$ sudo mkdir /tftpboot
    //  /tftpboot这个文件可以使用samba服务共享一下先。
3,修改 tftpboot 文件夹权限
    farsight@ubuntu:~$ sudo chmod 0777 /tftpboot/
4,配置
    1》打开文件
        sudo vim /etc/default/tftpd-hpa
    2》将 /var/lib/tftpboot 改为 /tftpboot
        # /etc/default/tftpd-hpa
        TFTP_USERNAME="tftp"
        TFTP_DIRECTORY="/tftpboot"
        TFTP_ADDRESS=":69"
        TFTP_OPTIONS="--secure"
5,重启 tftp 服务
    sudo service tftpd-hpa restart或sudo /etc/init.d/tftpd-hpa restart
    [ ok ] Restarting tftpd-hpa (via systemctl): tftpd-hpa.service.//显示的
​
6,测试
    1>在/tftpboot中存放一个文件,比如:1.txt
    2>在用户家目录下,下载1.txt
        farsight@ubuntu:~$ tftp 192.168.60.5
        tftp> get 1.txt
        tftp> quit
        farsight@ubuntu:~$ cat 1.txt
        /*
        #include 
​
        int main(void)
        {
                printf("hello world\n");hello
                printf("hello world\n");hello
                return 0;hello
        }
        int main(void)
        {
                printf("hello \n");hello
                return 0;
        }
​        */1.txt的内容

5,安装相关的软件包

sudo apt-get update
​
sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping

sudo apt-get install libsdl1.2-dev xterm
​
sudo apt-get install make xsltproc docbook-utils fop dblatex xmlto
​
sudo apt-get install python-git-doc
​
sudo apt-get install ncurses-dev libncurses5-dev libncursesw5-dev lib32ncurses5 libssl-dev linux-headers-generic u-boot-tools device-tree-compiler bison flex g++ libyaml-dev
​
sudo apt-get install coreutils bsdmainutils sed curl bc lrzsz corkscrew cvs subversion mercurial nfs-common nfs-kernel-server libarchive-zip-perl dos2unix texi2html diffstat libxml2-utils
//以上是需要下载的相关,下载时注意一定得安装成功了,安装时速度不会太快。​

二,linux内核移植

1,将开发板和电脑相连

值得一提的是,桥接模式。开发板是不能同时链接多个网的,所以得自己选择网卡,通信桥接有线网卡,就是windows链接的网络名字,在ubuntu里的虚拟网络编辑器可以找到,自动桥接模式里可以更改,这就是板子与虚拟机桥接相连。在下载时就要选着无线网卡,让板子可以与外界通信下载软件。

//百度吧,我也不知道为什么,图片上传不成功,有找到的朋友可以交流一下,谢谢。 

2,安装交叉工具链

1》在ubuntu中创建相关的目录
    farsight@ubuntu:~$ mkdir fsmp1a
    farsight@ubuntu:~$ cd fsmp1a/
    farsight@ubuntu:~/fsmp1a$ mkdir kerner  driver   tools //可以使用samba服务共享一下。
/*
2》将交叉工具链拷贝到tools中,并解压
    farsight@ubuntu:~/fsmp1a/tools$ tar -xvf en.SDK-x86_64-stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24.tar.xz
    
3》 进入解压后的sdk目录,执行下面的脚步文件,安装交叉工具链
    farsight@ubuntu:~/fsmp1a/tools/stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sdk$ ./st-image-weston-openstlinux-weston-stm32mp1-x86_64-toolchain-3.1-openstlinux-5.4-dunfell-mp1-20-06-24.sh
   //会有一个成功的标识successfully
*/  交叉编译器的工具得自己找了,目前我还不知道这个这么找,都是用的被人给的现成的“”,有知道的朋友能否告知一二。

4》导入sdk(使之生效)
    source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
​//每打开一个终端都要执行这个命令,让交叉编译器生效。记得测试。
5》测试:
    //执行下面命令
    $CC --version
    //安装成功,显示下面信息
    arm-ostl-linux-gnueabi-gcc (GCC) 9.3.0
    Copyright (C) 2019 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

 3,编译linux内核

获取内核源码:

从官网下载 https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ linux-5.4.31.tar.xz 2》芯片原厂 高通,三星,MTK,海思,RK,全志等

1》将内核原码拷贝到ubuntu中,并解压
farsight@ubuntu:~/fsmp1a/kerner$ tar -xvf en.SOURCES-stm32mp1-openstlinux-5-4-dunfell-mp1-20-06-24.tar.xz
​
2》将解压后的源码拷贝到kenel目录下
    cp -raf stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/sources/arm-ostl-linux-gnueabi/linux-stm32mp-5.4.31-r0/ ./
​
3》进入目录linux-stm32mp-5.4.31-r0
    解压linux标准内核源码:tar -xvf linux-5.4.31.tar.xz
4》进入解压后的内核源码目录,并打补丁
    cd linux-5.4.31/    //命令        //下面那个生成标准板配置文件在这个目录下
    
for p in `ls -1 ../*.patch`; do patch -p1 < $p; done //命令
 //该命令会将上层目录下所有的 patch 补丁文件应用到当前的内核中 
    linux-5.4.31/这就是内核所在目录,下面很多操作都会在这个目录下进行

生成标准板配置文件   //~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31:$ 
1》  生成 multi_v7_defconfig 默认配置
        ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31:$ 
        make ARCH=arm multi_v7_defconfig "fragment*.config" //命令
        
2》在默认 multi_v7_defconfig 配置中加入 ST 官方提供的 fragment config(打补丁)
        ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31:$ 
        for f in `ls -1 ../fragment*.config`; do scripts/kconfig/merge_config.sh -m -r .config $f; done  //命令
        ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31:$ 
        yes '' | make ARCH=arm oldconfig  //命令
        
3》 生成自己的默认配置文件
        ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31:$ 
        cp .config arch/arm/configs/stm32_fsmp1a_defconfig   //命令
        
4》取消 git 中的 SHA1
        ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31:$ 
        echo "" > .scmversion  //命令
​
5》在arch/arm/configs可以查看到开发板要使用的内核配置文件
        peter@ubuntu:~/fs-mp1a/linux/fsmp1a-linux-5.4.31$ 
        ls arch/arm/configs/stm32*   //命令
        arch/arm/configs/stm32_defconfig  arch/arm/configs/stm32_fsmp1a_defconfig  //显示的内容    
​
//标准版基本配置已经配置好,在编译前如果需要编译额外的功能或者驱动,可以使用 meunconfig 来对内核进行配置。这一步不成功的话,下面的设备树和内核文件的编译都会有问题,尤其是修改内核配置时,会缺少选项STM32、ARM等选项是没有的。发现有问题就再来生成标准配置文件一次
编译设备树文件
在linux内核中,设备树文件一般在: arch/arm/boot/dts/
​/*
1》将我们的设备树文件拷贝到 arch/arm/boot/dts/
    D:\peter\2303\初级驱动\设备树文件*  ----> arch/arm/boot/dts/
 arch/arm/boot/dts/stm32mp15xx-fsmp1x.dtsi
 arch/arm/boot/dts/stm32mp157a-fsmp1a.dts
 
2》修改 arch/arm/boot/dts/Makefile
    //打开Makefile文件
     vim  arch/arm/boot/dts/Makefile
     //添加下面一行:
     992       stm32mp157a-fsmp1a.dtb\
​*/  //这个设备树文件是自己写的,目前我也不知道如果是网找的话应该如何做,大家有空交流。
3》导入交叉编译器
    source /opt/st/stm32mp1/3.1-openstlinux-5.4-dunfell-mp1-20-06-24/environment-setup-cortexa7t2hf-neon-vfpv4-ostl-linux-gnueabi
    
4》编译设备树
     make ARCH=arm -j4  dtbs LOADADDR=0xC2000040
     例如:
     peter@ubuntu:~/fs-mp157/linux/linux-stm32mp-5.4.31-r0/linux-5.4.31$ 
                make ARCH=arm -j4  dtbs LOADADDR=0xC2000040   //命令
      
      scripts/kconfig/conf  --syncconfig Kconfig
      UPD     include/config/kernel.release
      HOSTCC  scripts/dtc/data.o
      HOSTCC  scripts/dtc/fstree.o
      HOSTCC  scripts/dtc/flattree.o
      HOSTCC  scripts/dtc/dtc.o
      HOSTCC  scripts/dtc/livetree.o
      HOSTCC  scripts/dtc/treesource.o
      HOSTCC  scripts/dtc/srcpos.o
      HOSTCC  scripts/dtc/checks.o
      HOSTCC  scripts/dtc/util.o
      LEX     scripts/dtc/dtc-lexer.lex.c
      YACC    scripts/dtc/dtc-parser.tab.[ch]
      HOSTCC  scripts/dtc/yamltree.o
      HOSTCC  scripts/dtc/dtc-lexer.lex.o
      HOSTCC  scripts/dtc/dtc-parser.tab.o
      HOSTLD  scripts/dtc/dtc
      DTC     arch/arm/boot/dts/stm32f769-disco.dtb
      DTC     arch/arm/boot/dts/stm32f746-disco.dtb
      DTC     arch/arm/boot/dts/stm32f469-disco.dtb
      DTC     arch/arm/boot/dts/stm32f429-disco.dtb
      DTC     arch/arm/boot/dts/stm32429i-eval.dtb
      DTC     arch/arm/boot/dts/stm32746g-eval.dtb
      DTC     arch/arm/boot/dts/stm32h743i-eval.dtb
      DTC     arch/arm/boot/dts/stm32h743i-disco.dtb
      DTC     arch/arm/boot/dts/stm32mp157a-avenger96.dtb
      DTC     arch/arm/boot/dts/stm32mp157a-dk1.dtb
      DTC     arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb
      DTC     arch/arm/boot/dts/stm32mp157d-dk1.dtb
​//显示的内容,可以做个参考
    或
     make ARCH=arm -j4  stm32mp157a-fsmp1a.dtb LOADADDR=0xC2000040
    例如:
     make ARCH=arm -j4  stm32mp157a-fsmp1a.dtb LOADADDR=0xC2000040
     DTC     arch/arm/boot/dts/stm32mp157a-fsmp1a.dtb
编译内核       //这个目录下的操作~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/
​
添加 MAE0621A 网卡驱动(开发板 V3.0 之前版本可跳过此步骤)FS-MP1A V3.0 版本配套网卡主控芯片是 MAE0621A,内核中并没有提供其的驱动,所以需要移植 MAE0621A 的驱动 将【华清远见-FS-MP1A开发资料\02-程序源码\04-Linux系统移植\04-移植相关文件\02-Linux 内核移植\ MAE0621A 驱动】下的 phy_device.c 和 maxio.c 文件复制到内核源码下的 drivers/net/phy/目录下。
*/
1》拷贝驱动源文件到内核源码 drivers/net/phy/
    ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/$:> cp -rf phy_device.c drivers/net/phy/  //命令
   ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/$:> cp -rf maxio.c drivers/net/phy/  //命令
    
2》修改drivers/net/phy/中的Kconfig和Makefile
     vim  drivers/net/phy/Kconfig       //命令        //修改Kconfig
    config REALTEK_PHY
    tristate "Realtek PHYs"
    ---help---
    Supports the Realtek 821x PHY.
   
    456     config MAXIO_PHY                //这几行为新增
    457     tristate "MAXIO PHYS"
    458     ---help---
    459     Supports the Maxio MAEXXXX PHY.
​
    //在 drivers/net/phy/Makefile 文件中添加 MAE0621A 驱动的编译项。
    vim drivers/net/phy/Makefile       //命令
    obj-$(CONFIG_MDIO_THUNDER) += mdio-thunder.o 
    obj-$(CONFIG_MDIO_XGENE) += mdio-xgene.o
 45 obj-$(CONFIG_MAXIO_PHY) += maxio.o          //添加该行
*/   就像上面一样这些文件是自己的,灵活一点咯。
3》  配置内核,添加网卡源码到内核中  //这个目录下的操作~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/
    由于内核源码默认配置已经支持 eMMC和网卡,在此列出主要选项,如下:
    ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/$:   make menuconfig //命令//空格键改变括号里的东西。回车确定,左右可以选中进入退出
    Device Drivers --->
        Generic Driver Options  ---> 
           [*] Support for uevent helper         //支持热插拔,在/proc下生成/proc/sys/kernel/hotplug
    Device Drivers --->
        <*> MMC/SD/SDIO card support --->
           [*] STMicroelectronics STM32 SDMMC Controller//上面有不成功的这个就不会显示,就是生成标准板配置文件哪里,从哪里再来一次。
​
    Device Drivers --->
    [*] Network device support --->
        [*] Ethernet driver support --->
            <*> STMicroelectronics Multi-Gigabit Ethernet driver
            <*> STMMAC Platform bus support
            <*> Support for snps,dwc-qos-ethernet.txt DT binding.
            <*> Generic driver for DWMAC
            <*> STM32 DWMAC support
​
添加 MAE0621A 驱动(开发板 V3.0 之前版本可跳过此步骤)
    ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/$:
         make menuconfig //命令
    Device Drivers --->
        [*] Network device support --->
            -*- PHY Device support and infrastructure --->
            < > Quality Semiconductor PHYs
            <*> Realtek PHYs
            <*> MAXIO PHYS                  //选择该菜单
            < > Driver for Renesas PHYs
4》编译内核
        ~/fsmpla/kerner/linux-stm32mp-5.4.31-r0/linux-5.4.31/$:
        make ARCH=arm -j4 uImage LOADADDR=0xC2000040  //命令
       
      AS      arch/arm/boot/compressed/lib1funcs.o
      AS      arch/arm/boot/compressed/ashldi3.o
      AS      arch/arm/boot/compressed/bswapsdi2.o
      AS      arch/arm/boot/compressed/piggy.o
      LD      arch/arm/boot/compressed/vmlinux
   //显示的内容,会很长一段时间。

下面就是开发版上的事情了,可以看看我以前的文章。https://mp.csdn.net/mp_blog/creation/editor/new/129177915

你可能感兴趣的:(linux,stm32,物联网)