当前位置:   article > 正文

ZYNQ7020-linux下使用pl端扩展串口,内核无法启动,串口无反应解决方案_zynq linux串口扩展

zynq linux串口扩展

写在前面:本文用于记录自己在zynq7020-串口开发上遇到的一些小问题,问题如何被解决的可以参考点这里,建议首先把本篇文章看完

抛出问题

Q1:UBOOT可以启动,内核无法启动

使用串口IP的时候出现了,uboot可以启动,但是内核启动不了,启动就会被kill…如下图:
在这里插入图片描述

出现如图所示的问题,恭喜!你找到答案了,如果不是这个问题,下面的文章也就不用看了,(学习如何使用串口除外)。
解决办法:在vivado中将串口中断连线连接到PS中断连线上,不连接无法启动内核。。。。参考新建工程第二小节

Q2:配置完串口后,UBOOT 和 内核都无输出打印

        如果在Q1没问题的基础上,出现这种问题,多半是设备树没有正确配置,加入串口IP后,系统默认串口是PL端的串口。

解决办法:参考生成系统第二小节。


一、vivado中使用PL端串口IP

        工程中我使用的是:UART Lite,直接在vivado中搜索串口,会出现两个IP,如图所示。
在这里插入图片描述

选择本文所用的UART Lite,这两个IP的区别在于,UART 16550更加高级(具体自己查资料),因为我的项目使用UART Lite足够了。


新建工程

        新建工程说一句,尽量不要使用特殊的名字命名工程,最好不要用数字,因为后期做系统的时候稍微有些麻烦,尤其是产生fsbl文件的时候。可以采用如下:
>project_zynq
但尽量不要使用:
projject_zynq_V.1.20
1、PS配置自己需要的功能即可。(本文直接参考的正点原子7020教程,直接在他的工程上进行的修改,感谢!!!!)如图所示:需要网口的单独添加网口。这里删除了网口IP,如果需要直接参考最终连线图。
在这里插入图片描述


2、添加IP后,连线不需要我们手动,直接自动连接即可,IP如图所示。在这里插入图片描述


注意此时发现IP核的中断端口并未连接,因此需要手动连接,如图:
在这里插入图片描述


注意:这里不连接,后期内核无法启动。。。。这就是问题核心所在。。。。,连接完成后如图所示。(这里我加入了网口,因为编程需要,所以添加单独的模块。。最好加上。。)

在这里插入图片描述


**IP核默认是9600波特率,**如果需要修改的,双击IP核打开直接修改。
在这里插入图片描述


全部连接完成后,点击运行分析,这里还需要分配管脚,先分析,完成再生产bitl流。
在这里插入图片描述


分配管脚:这里的管脚我是随便写的,根据需要自己修改…
在这里插入图片描述


点击生成hdf文件。。

在这里插入图片描述


最后导出hdf文件。输出在xxx.sdk文件夹下。
在这里插入图片描述


二、制作系统

说明:在zynq上制作系统的方法有很多种,可以直接peatlinux,也可以单独来做。以下内容军参考正点原子ZYNQ7020linux开发教程-第20章,单独编译每个部分。教程文档最后有,需要的可以直接下载。
在这里插入图片描述

1、首先根据hdf文件,生成设备树等文件,具体按照教程走。在hsi中生成设备树的时候,会出现提示:如果前面没有连接串口IP 的中断引脚, 这里会提示一个警告:串口中断的引脚未连接。第一次遇到这个警告我没在意,结果这就是问题。必须连接这个中断到对应的控制器上
在这里插入图片描述

这一步会生成xxx.bit文件,将其重命名为system.bit

2、输入hsi命令后:

open_hw_design navigator_7020_wrapper.hdf
set_repo_path /home/liuyu/device-tree/device-tree-xlnx-xilinx-v2018.3
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
generate_target -dir ./dts
close_sw_design device-tree
set hwdsgn navigator_7020_wrapper
set_repo_path /home/liuyu/embeddedsw/embeddedsw-xilinx-v2018.3
generate_app -hw $hwdsgn -os standalone -proc ps7_cortexa9_0 -app zynq_fsbl -compile -sw fsbl -dir ./fsbl
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

命令执行完成会生成设备树文件。如下图所示:将下图中的navigator_7020_wrapper.bit 修改成system.bit
在这里插入图片描述
进入到dts文件夹下。
在这里插入图片描述

首先修改system-top.dts。这里是另外的一个坑点,外加的串口IP,在zynq中默认是排在前面的,这就直接导致了,采用默认的设备树文件会导致系统默认串口的改变,下需要将system-top.dts的串口顺序换一下,修改后如下所示。
在这里插入图片描述

3、换好后将pl.stdi pcw.dtsi zynq_7000.dtsi system-top.dts文件复制到uboot:arch/arm/dts中,进行编译,首先生成u-boot可执行文件,将u-boot改成boot.elf,然后生成BOOT

执行下面这条命令编译 u-boot:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
  • 1

编译完成之后得到 u-boot,将其重命名为 u-boot.elf,执行下面这条命令生成 BOOT.BIN 文件:
Navigator_7020.sdk这个位置需要更改
注意下面的工程路径也需要修改:

petalinux-package --boot -p /home/liuyu/petalinux/v2018.3/ALIENTEK-ZYNQ --fsbl /home/liuyu/hdf/TEST_TEST.sdk/fsbl/executable.elf --u-boot ./u-boot.elf -o ./BOOT.BIN --force
  • 1

4、同样将上面几个文件复制到内核目录:arch/arm/boot/dts中,这里需要进一步修改设备树,加入ZYNQ的一些信息,
此时可以加入内核心跳led,指示系统是否正常运行,在调试过程中尤为重要,具体可以参考正点原子的linux开发教程第XXX页。
修改完设备树后,首先编译内核:这一步骤会生成zimage文件
这里需要注意,在内核中需要打开对应的饿串口端口支持。
在这里插入图片描述
执行下面这条命令编译内核出内核镜像文件 zImage:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j16
  • 1

编译成功之后,zImage 内核镜像文件所在路径为 arch/arm/boot/zImage。
然后编译设备树: 这一步会生成system-top.dtb文件,并重命名为system.dtb
需要修改设备树。在 arch/arm/boot/dts文件夹下的system-top.dts,这就是最终的设备树,按照自己需要修改。
dts文件如下:

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: HSI 2018.3
 * Today is: Tue Jun  1 10:09:12 2021
 */


#define GPIO_ACTIVE_HIGH   0
#define GPIO_ACTIVE_LOW    1

/dts-v1/;
#include "zynq-7000.dtsi"
#include "pl.dtsi"
#include "pcw.dtsi"
#include <dt-bindings/interrupt-controller/irq.h>
#include <dt-bindings/input/linux-event-codes.h>
/ {
	model = "Alientek ZYNQ Development Board";
	chosen {
		bootargs = "console=ttyPS0,115200 earlyprintk root=/dev/mmcblk0p2 rw rootwait";
		stdout-path = "serial0:115200n8";
	};
	aliases {
		ethernet0 = &gem0;
		ethernet1 = &gem1;
		i2c0 = &i2c0;
		i2c1 = &i2c1;
		
		serial0 = &uart0;
		serial1 = &uart1;
		serial2 = &axi_uartlite_0;
		spi0 = &qspi;
	};
	memory {
		device_type = "memory";
		reg = <0x0 0x40000000>;
	};

/*
	user-leds {
		compatible = "gpio-leds";

		led@0 {
			label = "ps_led0";
			gpios = <&gpio0 0 GPIO_ACTIVE_HIGH>;
			linux,default-trigger = "heartbeat";
			default-state = "on";
		};
	};
*/
};


&gem0 {
	local-mac-address = [00 0a 35 00 1e 53];
};

&qspi {
	#address-cells = <1>;
	#size-cells = <0>;
	flash0: flash@0 {
		compatible = "n25q512a","micron,m25p80";
		reg = <0x0>;
		#address-cells = <1>;
		#size-cells = <1>;
		spi-max-frequency = <50000000>;
		partition@0x00000000 {
			label = "boot";
			reg = <0x00000000 0x00500000>;
		};
		partition@0x00500000 {
			label = "bootenv";
			reg = <0x00500000 0x00020000>;
		};
		partition@0x00520000 {
			label = "kernel";
			reg = <0x00520000 0x00a80000>;
		};
		partition@0x00fa0000 {
			label = "spare";
			reg = <0x00fa0000 0x00000000>;
		};
	};
};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85

然后编译生成设备树文件。。。 这一步会生成system-top.dtb文件,并重命名为system.dtb

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb
  • 1

5、将上面的四个文件 system.bit BOOT zimage system.dtb 拷入SD卡,然后启动开发板。启动后可以选择是从SD加载根目录还是网络挂载,默认是SD卡。
在这里插入图片描述
步骤具体参考领航者 ZYNQ 之 Linux 开发指南20.7小节,
打开开发板,应该可以正常加载串口了;

在这里插入图片描述

如图就是PL端的串口,这个图片是我后期制作的,并不会当前工程的,但是名字大同小异的,都是ttyUL开头的。

资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/172449
推荐阅读
相关标签
  

闽ICP备14008679号