ST MP157 MPU网络Linux内核调试过程及问题解决

633 阅读3分钟

1 基础

1.1 boot基础

  • MMC 设备Uboot命令 image.png
  • 有 3 个分区,第一个分区为名字为“ssbl”,用来存放 uboot 镜像,范围为:扇区 0x400-0x13ff。第二个分区名字为“boot”,用来存放linux 内核镜像,范围为:扇区 0x1400-0x213ff。第三个分区名字为“rootfs”,这个是根文件系统分区,占用了剩余的所有扇区,也就是扇区 0x21400-0xe8fbff。 image.png
  • 根文件系统缺失错误-end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0),Linux 内核启动以后是需要根文件系统的,根文件系统存在哪里是由 uboot 的 bootargs 环境变量指定的,它会传递给 Linux 内核作为命令行(command line)参数。比如设置root=/dev/mmcblk2p3也就是说根文件系统存储在/dev/mmcblk2p3 中,也就是 EMMC 的分区 3中。 image.png

1.2 固件烧写

  • 准备连线 image.png image.png image.png image.png
  • 烧写过程,进行中 image.png
  • 如果不想更新文件系统就不烧写,我们可以编辑 atk_emmc-stm32mp157d-atk-qt.tsv,将烧写文件系统的配置信息即最后一行,将“p”修改为“PE”,我们在 ATK-STM32MP157 的Linux驱动开发指南上有详细的解释。修改为“PE”即代表跳过,不烧写,如下 image.png

1.3 固件启动

  • 烧写完成如下图,拨码到 010,eMMC 启动即可,注意:OTG是烧写线,烧写完毕后,拔出即可。另外整个固件烧写过程,无需启动虚拟机,在Windows上完成所有下载过程 image.png image.png image.png

1.4 网络调试(在1.3节基础上)

  • 在1.3节基础上,可以基于TFTP调试设备树及内核,基于NFS可以调试根文件系统 image.png
  • NFS调试根文件系统 image.png
  • TFTP调试设备树及内核 image.png
  • mp157drivers开发设备驱动 image.png
  • 进入uboot image.png
  • 开始网络调试准备
1:IP设置
setenv ipaddr 192.168.0.105
setenv ethaddr b8:ae:1d:01:01:01
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.111
saveenv

2:nfs调试
nfs C2000000 192.168.0.111:/home/qinkaixin/linux/nfs/rootfs/test

3:设置nfs根文件系统
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.0.111:/home/qinkaixin/linux/nfs/rootfs,proto=tcp rw ip=192.168.0.105:192.168.0.111:192.168.0.1:255.255.255.0::eth0:off'
saveenv

4:tftp网络调试
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv

boot
  • 驱动挂载
** 1 进入驱动开发目录,修改Makefile,注意KERNELDIR
- vim Makefile

    KERNELDIR := /home/qinkaixin/tools/atk_install/alientek_linux
    CURRENT_PATH := $(shell pwd)

    obj-m := key.o

    build: kernel_modules

    kernel_modules:
            $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

    clean:
            $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

** 2 拷贝驱动到NFS根文件系统
- sudo cp beep.ko beepApp /home/qinkaixin/linux/nfs/rootfs/lib/modules/5.4.31/ -f

** 3 拷贝编译后的设备树stm32mp157d-atk.dtb到tftpboot
qinkaixin@qinkaixin-virtual-machine:~/tools/atk_install/alientek_linux$ vim /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/dts/stm32mp157d-atk.dtsi
qinkaixin@qinkaixin-virtual-machine:~/tools/atk_install/alientek_linux$ make dtbs
  DTC     arch/arm/boot/dts/stm32mp157d-atk.dtb
  DTC     arch/arm/boot/dts/stm32mp157d-atk-mipi.dtb
  DTC     arch/arm/boot/dts/stm32mp157d-atk-hdmi.dtb
  
- cp /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/dts/stm32mp157d-atk.dtb /home/qinkaixin/linux/tftpboot/
** 4 拷贝编译后的内核uImage到tftpboot
- cp /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/uImage /home/qinkaixin/linux/tftpboot/
  • 启动 image.png
  • 驱动挂载 image.png image.png image.png image.png
cd /lib/modules/5.4.31

depmod

modprobe keyirq.ko

cat /proc/interrupts

./keyirqApp /dev/key

rmmod keyirq.ko

2 使用网络启动调试Linux(原厂系统mmcblk2p3)

2.1 开发环境快照

image.png

  • 安装包准备 image.png

2.2 设置uboot IP

image.png

setenv ipaddr 192.168.0.105
setenv ethaddr b8:ae:1d:01:01:01
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.111
saveenv

2.3 拷贝设备树与Linux内核uImage到tftp

image.png

2.4 uboot启动(笔者开发板根文件系统分区为/dev/mmcblk2p3 )

image.png image.png

setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk2p3 rootwait rw'
saveenv
boot

3 文件系统NFS网络挂载及网络调试

3.1 NFS 服务开启及版本兼容

sudo apt-get install nfs-kernel-server rpcbind
sudo vi /etc/exports

/home/qinkaixin/linux/nfs *(rw,sync,no_root_squash)

Linux网络下载镜像时“nfs报错:ERROR: File lookup fail”解决方法

导致此错误得原因是:uboot中使用得NFS版本为V2版本,而ubuntu中的NFS版本为V3,V4及以上版本,从而导致uboot不能再NFS服务器中找到文件
cat /etc/default/nfs-kernel-server

RPCNFSDCOUNT="-V 2 8"
RPCNFSDPRIORITY=0
RPCMOUNTDOPTS="-V 2 --manage-gids"
NEED_SVCGSSD=""
RPCSVCGSSDOPTS="--nfs-version 2,3,4 --debug --syslog"

sudo service nfs-kernel-server restart

uoot中进行调试:
nfs C2000000 192.168.0.111:/home/***/linux/nfs/rootfs/test
  • 编译好的文件系统放置到NFS image.png

3.2 设置nfs根文件系统

image.png image.png image.png

1:IP设置
setenv ipaddr 192.168.0.105
setenv ethaddr b8:ae:1d:01:01:01
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.111
saveenv


setenv ipaddr 192.180.10.10
setenv ethaddr b8:ae:1d:01:01:01
setenv gatewayip 192.180.10.1
setenv netmask 255.255.255.0
setenv serverip 192.168.10.60
saveenv

2:nfs调试
nfs C2000000 192.168.0.111:/home/qinkaixin/linux/nfs/rootfs/test

nfs C2000000 192.180.10.60:/home/qinkaixin/linux/nfs/rootfs/test

3:设置nfs根文件系统
setenv bootargs 'console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.0.111:/home/qinkaixin/linux/nfs/rootfs,proto=tcp rw ip=192.168.0.105:192.168.0.111:192.168.0.1:255.255.255.0::eth0:off'
saveenv

4:tftp网络调试
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv

boot

4 文件系统EMMC挂载及网络调试(自编译镜像非原厂系统mmcblk1p3)

image.png image.png 前提条件:文件系统已经烧录到EMMC

Linux EMMC启动(自编译镜像非原厂系统):
1:IP设置
setenv ipaddr 192.168.0.105
setenv ethaddr b8:ae:1d:01:01:01
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.111
saveenv
2:根文件系统在EMMC
STM32MP> mmc list
STM32 SD/MMC: 0
STM32 SD/MMC: 1 (eMMC)
setenv bootargs 'console=ttySTM0,115200 root=/dev/mmcblk1p3 rootwait rw'
3:tftp网络调试
setenv bootcmd 'tftp c2000000 uImage;tftp c4000000 stm32mp157d-atk.dtb;bootm c2000000 - c4000000'
saveenv
boot

5 驱动开发调试

5.1 驱动编译报错

  • ./include/uapi/linux/types.h:5:10: fatal error: asm/types.h: 没有那个文件或目录 image.png

5.2 修改linux源码顶层Makefile,解决驱动编译报错

image.png image.png image.png

cd /home/qinkaixin/tools/atk_install/alientek_linux

360 ARCH            ?= arm
361 CROSS_COMPILE = arm-none-linux-gnueabihf-

5.3 驱动编译

image.png image.png

5.4 以beep蜂鸣器为例

  • 拷贝驱动模块beep.kod到NFS网络挂载的根文件系统/lib/modules/5.4.31中

image.png image.png

  • 注意编译的linux内核和设备树与编译驱动的linux内核要一致,不然会报错
**进入驱动开发目录,修改Makefile,注意KERNELDIR
- vim Makefile

    KERNELDIR := /home/qinkaixin/tools/atk_install/alientek_linux
    CURRENT_PATH := $(shell pwd)

    obj-m := key.o

    build: kernel_modules

    kernel_modules:
            $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules

    clean:
            $(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean

**拷贝驱动到NFS根文件系统
- sudo cp beep.ko beepApp /home/qinkaixin/linux/nfs/rootfs/lib/modules/5.4.31/ -f
**拷贝编译后的设备树stm32mp157d-atk.dtb及内核uImage到tftpboot
- cp /home/qinkaixin/tools/atk_install/alientek_linux/arch/arm/boot/dts/stm32mp157d-atk.dtb /home/qinkaixin/linux/tftpboot/

  • 进入linux源码根目录,修改设备树文件 image.png image.png image.png
  • 编译设备树 image.png
  • 拷贝设备树到tftp网络挂载的根文件系统 image.png
  • 重启开发板,进入/lib/modules目录,加载驱动(注意编译的linux内核和设备树与编译驱动的linux内核要一致,不然会报错) image.png
  • 执行测试 image.png