Menu Close

基于模板实现 Linux 下 PS uart 和 PL uart

此文章介绍了如何基于模板使用 open read 和 close 命令实现 Linux 下 PS uart 以及添加 axi uart IP 实现 Linux 下 PL uart。

相关参考文章:SOC 教学教案

 

首先我们将为工程创建一个新的文件夹。

%title插图%num

接下来我们使用以下命令在文件夹中创建一个新的 PetaLinux 工程。

sptl
petalinux-create -t project --template zynq -n appdevtest

%title插图%num

使用 cd 进入到工程文件夹,并进行配置。注意使用相应的 .sdk 文件。

cd appdevtest
petalinux-config --get-hw-description ~/petalinux_app_dev_tests/FII_7030_APP.sdk/

%title插图%num

配置界面将随之打开。

%title插图%num

请选择并进入 Linux Components Selection。

%title插图%num

请选中 First Stage Bootloader 以及 Auto update ps_init。

%title插图%num

接下来我们将进入到 Subsystem AUTO Hardware Settings。

%title插图%num

进入 Serial Settings。

%title插图%num

选择 Primary stdin/stdout 并将其设为 ps7_uart_0。

%title插图%num

更改完后请保存并退出。

%title插图%num

下面我们将配置 Linux 内核。

petalinux-config -c kernel

%title插图%num

我们不需要在图形界面中做任何修改。保存退出即可。

%title插图%num

下面我们可以使用以下命令编译整个工程。

petalinux-build

%title插图%num

%title插图%num

使用以下命令创建 boot 文件。

petalinux-package --boot --fsbl --fpga --u-boot --force

%title插图%num

把 BOOT.BIN 和 image.ub 复制到 SD 卡的 BOOT 分区,并且把 roots.cpio 解压到 rootfs 分区。

接下来我们为应用程序创建一个分别的文件夹,我们将其命名为 appdevtest_app。

%title插图%num

在文件夹里我们将创建一个新的 C 语言文件,命名为 appdevtestapp.c。

%title插图%num

应用程序的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h> /* File Control Definitions */
#include <termios.h> /* POSIX Terminal Control Definitions */
#include <unistd.h> /* UNIX Standard Definitions */ 
#include <errno.h> /* ERROR Number Definitions */
#include <string.h>

int main()
{
    int fid;
    int a;
    int b;
    char resultstr[] = "\nMessage recieved is: \n";

    printf("App has started running \n");
    printf("\n");

    fid = open("/dev/ttyPS0", O_WRONLY);

    char string1[100];

    printf("Enter a message to be sent to ttyPS0: ");
    fgets(string1, 100, stdin);

    write(fid, resultstr, strlen(resultstr));
    write(fid, string1, strlen(string1));
    close(fid);

    printf("\n");


    fid = open("/dev/ttyUL1", O_WRONLY);

    char string2[100];

    printf("Enter a message to be sent to ttyUL1: ");
    fgets(string2, 100, stdin);
    write(fid, resultstr, strlen(resultstr));
    write(fid, string2, strlen(string2));
    close(fid);

    printf("\n");
    printf("App has finished running \n");

    return 0;
}

其中的 system 指令允许指定的字符串以 UNIX 指令的形式被运行。

我们将再执行以下指令从此应用文件中创建一个 .o 文件。

arm-linux-gnueabihf-gcc appdevtestapp.c -o appdevtestapp.o

%title插图%num

我们将把此文件复制到 SD 卡上。为了简单,我们将其放到 BOOT 分区中。

%title插图%num

现在我们可以把 SD 卡插入开发板并将其启动。

请确保您的设备连接着 ARM_UART 以及 RISC-V JTAG 端口的输出。

接下来我们将运行以下指令挂载我们 SD 卡上的两个分区。

cd /mnt
mkdir sd1
mkdir sd2
mount /dev/mmcblk0p1 /mnt/sd1
mount /dev/mmcblk0p2 /mnt/sd2

%title插图%num

下面我们将进入 .o 文件的目录中,应该是 /mnt/sd1,也就是 BOOT 分区。

%title插图%num

我们可以执行以下指令运行。

./appdevtestapp.o

%title插图%num

我们可以看到相应的信息从相应的接口被输出。

Posted in 教材与教案

发表评论

相关链接