1 基础
1.1 boot基础
- MMC 设备Uboot命令
- 有 3 个分区,第一个分区为名字为“
ssbl”,用来存放 uboot 镜像,范围为:扇区 0x400-0x13ff。第二个分区名字为“boot”,用来存放linux 内核镜像,范围为:扇区 0x1400-0x213ff。第三个分区名字为“rootfs”,这个是根文件系统分区,占用了剩余的所有扇区,也就是扇区 0x21400-0xe8fbff。 - 根文件系统缺失错误-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中。
1.2 固件烧写
- 准备连线
- 烧写过程,进行中
- 如果不想更新文件系统就不烧写,我们可以编辑 atk_emmc-stm32mp157d-atk-qt.tsv,将烧写文件系统的配置信息即最后一行,将“p”修改为“PE”,我们在 ATK-STM32MP157 的Linux驱动开发指南上有详细的解释。修改为“PE”即代表跳过,不烧写,如下
1.3 固件启动
- 烧写完成如下图,拨码到 010,eMMC 启动即可,
注意:OTG是烧写线,烧写完毕后,拔出即可。另外整个固件烧写过程,无需启动虚拟机,在Windows上完成所有下载过程
1.4 网络调试(在1.3节基础上)
在1.3节基础上,可以基于TFTP调试设备树及内核,基于NFS可以调试根文件系统- NFS调试根文件系统
- TFTP调试设备树及内核
- mp157drivers开发设备驱动
- 进入uboot
- 开始网络调试准备
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/
- 启动
- 驱动挂载
cd /lib/modules/5.4.31
depmod
modprobe keyirq.ko
cat /proc/interrupts
./keyirqApp /dev/key
rmmod keyirq.ko
2 使用网络启动调试Linux(原厂系统mmcblk2p3)
2.1 开发环境快照
- 安装包准备
2.2 设置uboot 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.3 拷贝设备树与Linux内核uImage到tftp
2.4 uboot启动(笔者开发板根文件系统分区为/dev/mmcblk2p3 )
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
3.2 设置nfs根文件系统
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)
前提条件:文件系统已经烧录到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: 没有那个文件或目录
5.2 修改linux源码顶层Makefile,解决驱动编译报错
cd /home/qinkaixin/tools/atk_install/alientek_linux
360 ARCH ?= arm
361 CROSS_COMPILE = arm-none-linux-gnueabihf-
5.3 驱动编译
5.4 以beep蜂鸣器为例
拷贝驱动模块beep.kod到NFS网络挂载的根文件系统/lib/modules/5.4.31中
注意编译的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源码根目录,修改设备树文件
- 编译设备树
拷贝设备树到tftp网络挂载的根文件系统- 重启开发板,进入/lib/modules目录,加载驱动
(注意编译的linux内核和设备树与编译驱动的linux内核要一致,不然会报错) - 执行测试