2021-02-22

jacinto psdk如何使用指南

• 4.1. 开发人员注意事项
• 4.1.1. 通过Telnet连接到EVM
• 4.1.2. 如何设置Samba服务器
• 4.1.3. 启动顺序
• 4.1.4. 将文件移动到目标系统
• 4.1.5. 如何从U-boot闪存Linux系统
• 4.1.6. SDK文件系统优化/定制
• 4.1.7. 如何更改dtb文件
• 4.1.8. 如何闪存eMMC设备
• 4.1.9. 如何可视化统计数据
• 4.1.9.1. 概述
• 4.1.9.2. 统计数据收集
• 4.1.9.3. 从目标传输到主机
• 4.1.9.4. 基于浏览器的可视化
• 4.1.10. 如何在Keystone设备中验证Linux和mcur5之间的IPC?
• 4.1.11. 如何将K3 MSMC内存配置为用作SRAM或L3缓存?
• 4.1.12. 如何从Linux的用户空间中检查一些设备树信息?
• 4.1.13. 如何集成与处理器SDK Linux J721e中打包的不同版本的开源软件?
• 4.1.14. 如何在VMware下构建ubuntulinux主机
• 4.2. 硬件EVM设置
• 4.2.1. J721E EVM硬件设置
4.1.1. 通过Telnet连接到EVM
使用Telnet
初始化文件(/etc/init.d/rcS)启动telnet服务器。如果您的开发主机与EVM位于同一子网中,那么您可以使用U-boot环境中分配的IP地址远程登录到它。下面是一个来自Linux主机的示例。
$ telnet 192.168.1.10
系统将提示您输入用户名和密码。用户名应该是root,密码应该为空(只需按回车键)。
在Windows XP主机上,单击开始按钮,然后单击运行…键入telnet并单击确定。这将打开一个telnet窗口。
Type “o < ip-addr >”并按回车键。例子:
Microsoft Telnet> o 128.247.107.12
键入root作为密码并将密码留空(只需按Enter键)
4.1.2.如何设置Samba服务器
介绍
当使用虚拟机时,你可以通过特定虚拟机的共享文件夹功能来共享文件和文件夹。另一种选择是在您的Linux主机上配置Samba服务器,尤其是在使用专用Linux主机时。
Samba允许主机与Microsoft Windows客户机或服务器交互,就像它是Windows文件和打印服务器一样。换句话说,如果您正在Windows机器上安装软件,您可以通过Windows访问主机,轻松地将/修改文件传输到主机。
安装Samba服务器

  1. Samba可以通过打开终端来安装。(应用程序→系统工具→终端)
  2. 输入su并输入安装过程中设置的密码,切换到root用户。
  3. 在Fedora上使用yum命令安装Samba: system-config-samba
    在Ubuntu安装Samba使用: sudo apt-get install system-config-samba
  4. 打开Samba GUI (System -> Administration -> Samba)。
  5. 配置共享

•点击“添加共享”
•指定要共享的目录。例如, /home/;

•选中“可写”和“可见”框
•在“访问”选项卡上,选择允许访问所有人选项

•选择“确定”
6.成立工作组
•从工具栏中,选择“首选项”->“服务器设置”

•指定“工作组”以匹配Windows环境中的工作组
•选择“确定”
7.添加用户
•从工具栏中,选择Preferences->Samba Users
•点击“添加用户”
•从“Unix用户名”下拉框中,选择您设置的用户名
•在“Windows用户名”和“密码”中,分别输入该用户的Unix用户名和密码。
•选择“OK”
8. 关闭防火墙
•系统→管理→防火墙
•选择“禁用”按钮
注意—如果您在您公司的防火墙内,您可能需要配置网络代理。
9. 启动Samba和NFS服务
•系统→管理→服务(注意-在Ubuntu 10.04 LTS中不可用。然而,Samba服务应该自动启动)
•通过浏览左侧列表启动服务,定位到nfs和smb。如果它们还没有启用,请单击“启用”按钮启用它们。
10. 测试配置
•在Linux工作站上的终端,输入命令 ifconfig,并记录IP地址
•在您的Windows机器上,进入开始->运行并键入<IP_ADDR>用Linux系统的IP地址替换
4.1.3 启动顺序
J721E启动顺序请参见“u-boot/board/ti/j721e/README”的U-boot单板自述文件。
请参考这个版本的U-boot组件分支和版本信息:
发布源代码组件版本
4.1.4 将文件移动到目标系统
介绍
本指南讨论如何将应用程序或其他文件移动到EVM的目标文件系统。
SD卡上的文件系统
TI SDK附带的SD卡有一个Linux ext3或ext4分区,用作目标文件系统。这个分区可以从Linux主机上读取。在Ubuntu 10.04中,当使用SD读卡器插入Ubuntu主机的USB端口时,这个分区将挂载在/media/rootfs上。
当用读卡器在Linux主机上挂载SD卡时,可以从主机执行“cp”命令到/media/rootfs下的子目录中,或者使用浏览器窗口将文件从主机拖放到SD卡中。
在开发期间,将SD卡从EVM切换到SD卡读卡器非常耗时。在开发过程中使用NFS是首选方法,这使得在主机和目标之间移动文件变得非常简单。
网络文件系统(NFS)
当从Linux开发主机上提供目标文件系统时,在主机和目标之间移动文件非常简单。NFS目录由SDK安装程序在主机上设置。SDK环境中的默认位置是 /targetNFS。这取决于SDK的版本和它的安装方式。主机系统中这个目录的“ls -l”将显示启动时目标的根目录。

user@U1004GT:~/ti-sdk-AM3715-evm-4.0.0.0/filesystem$ pwd
/home/user/ti-sdk-AM3715-evm-4.0.0.0/filesystem
user@U1004GT:~/ti-sdk-AM3715-evm-4.0.0.0/filesystem$ ls -l
total 60
drwxr-xr-x  2 root root 4096 2010-05-07 07:51 bin
drwxr-xr-x  2 root root 4096 2010-05-07 00:30 boot
drwxr-xr-x  2 root root 4096 2010-05-05 16:28 dev
drwxr-xr-x 24 root root 4096 2010-05-14 10:46 etc
drwxr-xr-x  3 root root 4096 2010-05-07 00:29 home
drwxr-xr-x  4 root root 4096 2010-05-07 00:30 lib
lrwxrwxrwx  1 root root   12 2010-05-13 09:35 linuxrc -> /bin/busybox
drwxr-xr-x 13 root root 4096 2010-05-14 11:01 media
drwxr-xr-x  2 root root 4096 2010-05-07 00:29 mnt
drwxr-xr-x  2 root root 4096 2010-05-05 16:28 proc
drwxr-xr-x  2 root root 4096 2010-05-07 07:51 sbin
drwxr-xr-x  2 root root 4096 2010-05-07 07:51 Settings
drwxr-xr-x  3 root root 4096 2010-05-07 00:29 srv
drwxr-xr-x  2 root root 4096 2010-05-05 16:28 sys
lrwxrwxrwx  1 root root    8 2010-05-13 09:35 tmp -> /var/tmp
drwxr-xr-x 10 root root 4096 2010-05-07 08:43 usr
drwxr-xr-x  7 root root 4096 2010-05-04 21:54 var
user@U1004GT:~/ti-sdk-AM3715-evm-4.0.0.0/filesystem$

因此,从主机的角度来看,目标文件系统只是主机的一个子目录。如果文件在主机上位于./targetNFS中,那么在目标引导到NFS后,相同的文件将显示在目标的根目录中。如果该文件在./targetNFS 的子目录下(例如./targetNFS/sub-dir),则在目标器引导到NFS后,该文件将显示在目标器的/sub-dir目录下。
TI SDK的顶级makefile支持将应用程序复制到SDK的NFS中的安装目标。有关安装目标的信息,请参阅SDK顶层的README文件。
4.1.5 如何从U-boot中Flash Linux系统
操作步骤请参见u-boot文档。最新的信息可以在u-boot README文件中找到链接如下:

https://git.ti.com/cgit/ti-u-boot/ti-u-boot/tree/board/ti/j721e/README

4.1.6 SDK文件系统优化/定制
目的
本文的目的是解释作为Processor SDK Linux J721e一部分交付的文件系统,以及如何修改该文件系统,以根据您的用例对其进行定制。为了方便您,本文讨论的工具默认安装在处理器SDK Linux J721e文件系统中。
预构建文件系统
处理器SDK Linux J721e附带一个默认的文件系统:

  1. tisdk-rootfs-image-.tar.gz -这个文件系统是通过使用一个基本文件系统,并添加所有额外的SDK组件来创建的,如3D图形、矩阵、分析工具等。它比基本文件系统稍大一些,但它拥有开发人员在使用TI处理器时需要的大多数工具。
    这个文件系统包含opkg包管理器,可以作为系统优化的起点,下一节将对此进行讨论。
    OPKG的基础知识
    opkg - 列表命令
    opkg是SDK文件系统中用于安装和删除包的包管理器。在目标设备上运行以下命令,可以获得opkg支持的完整命令列表:
target# opkg

opkg-列出已安装的软件包
要查看文件系统的包列表以及每个包的版本,可以在目标设备上运行以下命令:

target# opkg list-installed

注意
此列表仅包含有关使用包管理器安装的包的信息。opkg不会跟踪生成并复制到文件系统且未作为.ipk包安装的应用程序
opkg-列出包装内容
有时了解软件包安装了哪些文件很有用。为此,可以使用以下命令:

target# opkg files <pkgname>

其中是opkg list-installed output中给出的包的名称。此命令将生成文件系统中属于给定包的所有文件的列表。
opkg-查找文件所有者
有时,您可能会在目标文件系统中找到要删除的文件,或者只知道该文件来自何处。在这种情况下,可以使用以下命令:

target# opkg search <file>

此命令将查找安装给定文件的包。当您以后要删除特定文件时,此命令可能很有用,因为此命令可以帮助您查找要删除的包。
opkg-查找依赖项
有时,当您想要删除一个包时,找出其他哪些包依赖于您要删除的包是很有用的。而opkg remove命令会告诉你直接依赖项,你可以找到更长的依赖项列表:

target# opkg whatdepends <pkgname>

此命令将打印依赖于您输入的包的包的列表,以及依赖于这些包的包的列表,依此类推。
正在删除包
修改文件系统内容的最简单方法之一是使用opkg实用程序删除包(如果您有预构建的包,则安装)。删除包通常很简单:

target# opkg remove <pkgname>

但是,有时一个包是另一个包的依赖项。在这种情况下,您有以下选项:
•使用–force-depends选项
•此选项将强制删除软件包,但将保留依赖于此软件包的所有软件包。如果您想删除某个特定的包,但该包依赖于其他不想删除的包,则这一点非常有用。
•使用–force-removal-of-dependent-packages选项
•此选项将进入依赖项列表并删除依赖项链中的所有包。您应该检查所有要删除的包,以确保它们确实是您要删除的包,并且不包含您要删除的其他文件。
•首先移除依赖于此程序包的各个程序包
•通过这种方式,您可以精确控制哪些依赖包被删除,哪些保留在原位。

target# opkg remove --force-removal-of-dependent-packages <pkgname>

注意
opkg将打印依赖于要移除的包的包。对依赖于要删除的包使用opkg files命令通常是一个好主意,这样可以确保您真正想要保留的文件不会被删除。
注意
您还可以使用上面讨论的whatdepends选项查看包的依赖项列表
通过将opkg remove命令与列出包、查找文件所有者和列出包内容的命令结合使用,您可以快速地将完整的文件系统剥离为更小、更适合您的用例的文件系统。但是,删除包后,如果不生成.ipk文件进行安装,则当前无法重新安装该包。
添加应用程序
在大多数情况下,安装附加应用程序可以像将二进制可执行文件复制到文件系统一样简单。但是,如果您已经构建了自己的.ipk包,则可以使用opkg将这些ipk安装到目标文件系统中。使用包管理器的一个主要优点是能够使用opkg包管理器跟踪包及其内容。关于如何构建您自己的软件包的更多细节将陆续出现,但现在请参考构建SDK和此链接,以了解有关使用Arago构建自定义文件系统的更多信息。
4.1.7. 如何更改dtb文件
介绍
在某些情况下,需要手动更改目标使用的dtb文件。例如,J721E GP EVM使用HDMI和显示端口显示器。为了使用这些显示,用户需要使用所需的设备树覆盖(dtbo)
指定dtb文件
dtb和dtbo文件位于目标文件系统的“/boot”目录下。首先,确定要使用的dtb文件,例如k3-j721e-common-proc-board.dtb用于J721E GP EVM。然后确定要使用的dtbo列表,例如k3-j721e-common-proc-board-infotainment.dtbo用于信息娱乐子卡。
然后,修改“uEnv。将fdtfile指定为所需的dtb文件名,并将overlay_files指定为dtbo文件列表。
更改dtb文件后,reboot EVM,以便新的dtb文件将用于引导EVM。
设备树的选择
根据不同的用例,用户希望向内核传递不同的设备树。从4.19内核开始,设备树覆盖支持已经添加。这允许提供附加的设备树片段(aka overlays)应用于基本设备树的顶部。
通常,base dtb描述内核应该运行在哪个基板上。它包含了SoC的硬件描述,即嵌入式互连、所有外设、寄存器、内存、中断等。此外,它包含任何板特定的硬件描述,如pinmux,board mux, PHYs, PMIC等。
所有额外的子卡被建模为单独的设备树覆盖。它包含适配器卡上所有可用外设的硬件描述。Bootloader不支持自动加载这些覆盖,因此用户必须指定覆盖列表,即在将最终设备树传递给内核之前应用的dtbo文件。
设备树的典型用法是描述使用标准绑定的硬件。但是,对于应用程序用例,您可能希望向内核驱动程序传递额外的数据。e、 g.在虚拟化环境中,您可能需要描述显示驱动程序将使用哪些显示管道。设备节点是实现这一点的好方法。ProcessorSDK很少有描述这些附加属性的特定于用例的dtbo文件。
下表描述了可用于不同平台的设备树blob(dtb)和设备树覆盖(dtbo)文件的列表以及任何相关的依赖项.

No	Name of file	Description	dependencies
1	k3-j721e-common-proc-board.dtb	Base DTB for J721e EVM beta version	N/A
2	k3-j721e-proc-board-tps65917.dtb	Base DTB for J721e EVM alpha version	N/A
3	k3-j721e-common-proc-board-infotainment.dtbo	Overlay for IVI adapter card	IVI card needs to be connected
4	k3-j721e-common-proc-board-jailhouse.dtbo	Overlay for enabling Jailhouse support	#3 DTBO should be applied before this
5	k3-j721e-common-proc-board-infotainment-display-sharing.dtbo	Overlay for sharing DSS with Linux and RTOS	#3 DTBO should be applied before this
6	k3-j721e-vision-apps.dtbo	Overlay for running Processor SDK RTOS demos	N/A
7	k3-j721e-pcie-backplane.dtbo	Overlay for running PCIe Backplane demo	N/A
8	k3-j7200-common-proc-board.dtb	Base DTB for J7200 EVM	N/A
9	k3-j7200-common-proc-board-jailhouse.dtbo	Overlay for enabling Jailhouse support	N/A

uEnv.txt文件选项
uEnv.txt文件来自SD卡引导分区的文件描述了要使用的基本DTB和要另外应用的任何其他覆盖DTBO。处理器SDK附带了一些现成的uEnv.txt文件用于运行某些应用程序演示的快速使用的文件。
下表描述了uenv.txt文件以及在不同场景中引导电路板的相关依赖项。请注意,u-boot支持检测板的正确版本(alpha/beta),并可以正确加载所需的基本dtb文件。没有必要在uenv.txt中指定fdtfile.

Name of file	Usage scenario	Dependencies
uenv.txt.base	Use for booting the common processor board without support for daugter cards. Even if you have daughter cards connected, you can boot using this, kernel will not use the extra device functionality.	N/A
uenv.txt.disp_sharing	Use for running shared display use cases with Linux and RTOS	HDMI monitor connected via infotainment daughter card.
uenv.txt.jailhouse	Use for running hypervisor use cases.	HDMI monitor connected via infotainment daughter card. DP monitor connected to DISPLAY0 Display Port.
uenv.psdkra	Use for running Processor SDK RTOS demos.	All the R5 and C6x firmware symlinks updated in filesystem

4.1.8. 如何闪存eMMC设备
以下步骤将使用SD卡rootfs文件系统的副本对eMMC设备进行分区、格式化和填充。
•复制mksdboot.sh文件从主机<PATH_TO_INSTALLER>/bin/mksdboot.sh文件进入目标文件系统。
•确保脚本具有执行权限。

chmod +x mksdboot.sh

•确保电路板与uenv.txt.base文件所以SD和eMMC设备都可用于内核。
•SD(mmcblk1)和eMMC(mmcblk0)都可用时的输出示例

root@j7-evm:~# ls -l /dev/mmcblk*
brw-rw----    1 root     disk      179,   0 Jul 18 22:49 /dev/mmcblk0
brw-rw----    1 root     disk      179,  32 Jul 17 22:37 /dev/mmcblk0boot0
brw-rw----    1 root     disk      179,  64 Jul 17 22:37 /dev/mmcblk0boot1
crw-------    1 root     root      242,   0 Jul 17 22:37 /dev/mmcblk0rpmb
brw-rw----    1 root     disk      179,  96 Jul 17 22:37 /dev/mmcblk1
brw-rw----    1 root     disk      179,  97 Jul 17 22:37 /dev/mmcblk1p1
brw-rw----    1 root     disk      179,  98 Jul 17 22:37 /dev/mmcblk1p2

•卸载根内核的eMMC分区

umount /dev/mmcblk0*

•停止udev守护进程,避免在格式化eMMC时自动挂载分区

udevadm control –s

•使用mksdboot.sh脚本对eMMC设备进行分区,如下所示:

root@j7-evm:~# ./mksdboot.sh --device /dev/mmcblk0
./mksdboot.sh: line 83: [: too many arguments
-- Main device is: /dev/mmcblk1p2
************************************************************
*         THIS WILL DELETE ALL THE DATA ON /dev/mmcblk0        *
*                                                          *
*         WARNING! Make sure your computer does not go     *
*                  in to idle mode while this script is    *
*                  running. The script will complete,      *
*                  but your SD card may be corrupted.      *
*                                                          *
*         Press <ENTER> to confirm....                     *
************************************************************

ls: /dev/mmcblk0?: No such file or directory
1024+0 records in
1024+0 records out

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x02f86286.

Command (m for help): Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): Partition number (1-4, default 1): First sector (2048-31080447, default 2048): Last sector, +secto[87597.744275]  mmcblk0: p1 p2
rs or +size{K,M,G,T,P} (2048-31080447, default 31080447):
Crea[87597.750177]  mmcblk0: p1 p2
ted a new partition 1 of type 'Linux' and of size 62 MiB.
Partition #1 contains a vfat signature.

Command (m for help): Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): Partition number (2-4, default 2): First sector (129024-31080447, default 129024): Last sector, +sectors or +size{K,M,G,T,P} (129024-31080447, default 31080447):
Created a new partition 2 of type 'Linux' and of size 14.8 GiB.

Command (m for help): Partition number (1,2, default 2): Hex code (type L to list all codes):
Changed type of partition 'Linux' to 'W95 FAT32 (LBA)'.

Command (m for help): Partition number (1,2, default 2):
The bootable flag on partition 1 is enabled now.

Command (m for help): The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Formating /dev/mmcblk01 ...
mkfs.fat 4.1 (2017-01-24)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows
mke2fs 1.44.3 (10-July-2018)
64-bit filesystem support is not enabled.  The larger fields afforded by this feature enable full-strength checksumming.  Pass -O 64bit to rectify.
Discarding device blocks: done
Creating filesystem with 3868928 4k blocks and 967232 inodes
Filesystem UUID: a5586362-272d-4fb2-a0cc-56458dfc4b64
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Partitioning and formatting completed!
root@j7-evm:~# [87602.674595] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)

•现在复制SD卡rootfs分区的内容到eMMC设备rootfs分区。在目标器上依次运行如下命令.

umount /run/media/*
mkdir /mnt/sd-rootfs
mount /dev/mmcblk1p2 /mnt/sd-rootfs
mkdir /mnt/emmc-rootfs
mount /dev/mmcblk0p2 /mnt/emmc-rootfs
cp -r /mnt/sd-rootfs/* /mnt/emmc-rootfs
sync
umount /mnt/*

•重启板后,信息娱乐虚拟机可以使用eMMC的rootfs。
4.1.9. 如何可视化统计数据
4.1.9.1. 概述
在多核SoC中,不同的CPU核上运行着不同的软件组件。它们中的每一个都有统计参数,这些参数在运行演示、调试问题、测量性能参数等时非常有用。对于所有这些,有一个收集和可视化统计数据的通用方法是很有帮助的。Processor SDK Linux J721e提供了执行此任务的主机工具。其中包括三个部分:
4.1.9.2. 统计数据收集
注意
请注意
目前,只有当vision_apps或ethernet固件在辅助内核上运行时才支持统计数据可视化。
在目标上,可以使用statcol应用程序收集不同的统计参数。目前支持的参数如下:
•系统中各种辅助CPU内核的CPU负载
•根据当前用例读写DDR内存带宽
•以太网固件报告的网络带宽(如果可用)
只需如下所示在目标上运行statcol应用程序,就可以在控制台上获得打印的实时统计信息。下面显示了一个示例输出。

#target$ statcol

WS-cpuload: 4 R5F 33 C6x 52 A72 34 GPU 79
WS-ddrbw: 4 Read_avg 1853 Write_avg 1097 Read_peak 4270 Write_peak 3957
WS-ethfw-bw: 4 Port0_RX 899Kbps Port0_TX 272Kbps Port1_RX 474Mbps Port1_TX 23Mbps
WS-cpuload: 4 R5F 37 C6x 52 A72 32 GPU 73
WS-ddrbw: 4 Read_avg 1889 Write_avg 1039 Read_peak 4161 Write_peak 3217
WS-ethfw-bw: 4 Port0_RX 906Kbps Port0_TX 222Kbps Port1_RX 473Mbps Port1_TX 26Mbps

输出的每一行描述了一个带有WS前缀标记的统计参数.

4.1.9.3 从目标到主机的传输
数据收集完成后,需要将其发送到主机上进行可视化。这是使用Web sockets完成的。websocketd是一个简单的应用程序,用于通过web sockets从本机应用程序路由数据。更多信息请访问http://www.websocketd.com/
请确认EVM用以太网线连接,主机可以通过IP地址访问EVM。您可以创建一个websocket服务器,并提供statcol应用程序的输出。为此,在目标EVM上运行以下命令:

ifconfig #Note down the IP address
websocketd --devconsole --port=8090 bash -c 'unbuffer statcol'

4.1.9.4 基于浏览器的可视化
处理器SDK Linux J721e安装程序在目录板下有用于统计数据可视化的主机工具board-support/host-tools/statistics。使用主机上的web浏览器打开Stats.html文件。这个HTML页面包含用于显示来自target的统计数据的JavaScript。在Firefox浏览器中打开Stats.html的内容示例如下:

在框中输入EVM的IP地址,如果需要,更新端口号,然后按Connect按钮。在此之后,浏览器使用web套接字连接到statcol,并用统计数据显示不同的图形。通过单击切换过滤器,可以过滤出要查看的统计信息。以下屏幕截图显示了使用以太网固件运行时的预期行为:

4.1.10 如何验证Keystone设备上Linux和MCU R5之间的IPC ?
汽车应用程序具有不同的内存需求,并使用在auto-common.dtbo中定义的不同内存映射。因此,默认处理器SDK Linux J721e随firmware一起提供,只用于Keystone设备中的几个辅助核心。
尽管开箱即用的经验不允许验证Linux和MCU R5之间的处理器间通信(IPC),以下步骤描述了如何使用SDK来实现这一点.
构建IPC-echotest二进制文件的步骤
所有的IPC echotest二进制文件都构建为一个Yocto包ipc-lld-fw。由于这些二进制文件与汽车演示冲突,因此默认情况下,此软件包不在安装的SDK中构建。这可以使用Yocto构建并安装到目标上的文件系统中。
确保您已经为此设置了Yocto构建环境。有关所有详细信息,请参阅构建SDK部分。
一旦Yocto构建完成,使用bitbake构建特定的包ipc-lld-fw,如下所示:

TOOLCHAIN_BASE=<PATH_TO_TOOLCHAIN> MACHINE=<machine> bitbake -k ipc-lld-fw

这将为实现IPC echotest功能的系统中的所有remoteproc内核创建固件包。该包将位于/j7_evm-linux/ipc-lld-fw//deploy-ipks/目录下。
安装IPC echotest二进制文件
在主机上构建包之后,将其复制到目标文件系统。运行以下命令将包安装到目标文件系统。
以下指令中的update alternatives命令将IPC固件的优先级设置得非常高。这是为了确保符号链接得到适当更新。典型固件的优先级将高达20,将IPC固件优先级设置为100将赋予其最高优先级。
注意
优先级覆盖仅适用于以太网固件和显示共享固件等汽车固件。如果你安装了额外的固件,你也应该为其他人安装。

opkg install ipc-lld-fw*.ipk
update-alternatives --install /lib/firmware/j7-main-r5f0_0-fw j7-main-r5f0_0-fw /lib/firmware/pdk-ipc/ipc_echo_test_mcu2_0_release.strip.xer5f 100
update-alternatives --install /lib/firmware/j7-main-r5f0_1-fw j7-main-r5f0_1-fw /lib/firmware/pdk-ipc/ipc_echo_test_mcu2_1_release.strip.xer5f 100

在这之后,通过运行以下命令确保所有的固件都指向pdk-ipc/ version的二进制文件:

ls -l /lib/firmware/j7*

重新启动电路板,您将看到IPC echotest二进制文件加载到不同的CPU内核上。
4.1.11. 如何将K3 MSMC内存配置为用作SRAM或L3缓存?
在Keystone设备中,在MSMC互连处存在片上存储器。这可以配置为SRAM或L3缓存。
当MSMC内存配置为SRAM时,使用C7x的汽车ADAS应用程序受益匪浅。或者,当内存配置为缓存时,CPU基准应用程序的性能会得到提升。
通常,MSMC内存需要在SRAM和高速缓存之间进行拆分,拆分边界以1MB对齐。系统固件在引导时根据board config数据结构在cache和SRAM之间划分SRAM。
重建系统固件映像(sysfw.itb)与右板配置更改为所需的行为。以下是实现这一目标的步骤:
在安装程序中修改system-firmware-image-gen repo中的“soc/j721e/evm/board-cfg.c”文件。

/* boardcfg_msmc */
.msmc = {
        .subhdr = {
                .magic = BOARDCFG_MSMC_MAGIC_NUM,
                .size = sizeof(struct boardcfg_msmc),
        },
        .msmc_cache_size = 0x0,
},

这里,msmc_cache_size变量可以取从0x0到0xf的值,其中0x0描述零缓存,0xf描述全缓存。注意,由于硬件限制,配置为缓存的总内存被四舍五入到1MB。
下表描述了J721e平台的一个示例.

msmc_cache_size	Description
0x0	All of MSMC memory (i.e. 8MB) configured as SRAM
0x3	2MB of MSMC memory configured as cache, rest 6MB is SRAM
0x6	3MB of MSMC memory configured as cache, rest 5MB is SRAM
0xf	All of MSMC memory (i.e. 8MB) configured as cache

4.1.12。如何从Linux的用户空间查看一些设备树信息?
您可能需要检查一些dtb条目的值,以便进行调试,检查修改后的dtb是否真的得到了更新,等等。虽然你不能有一个类似.dts-file的设备树视图,但是你可以使用/proc/device-tree中的条目来检查值。
在Linux的命令提示符中,在/proc/device-tree目录下应该会看到类似如下的内容:

root@j7-evm:~# ls /proc/device-tree/
#address-cells  firmware                l3-cache0
#size-cells     fixedregulator-evm12v0  main_r5fss_cpsw9g_virt_mac0
__symbols__     fixedregulator-sd       memory@80000000
aliases         fixedregulator-vsys3v3  model
chosen          fixedregulator-vsys5v0  name
compatible      gpio-keys               pmu
connector       interconnect@100000     reserved-memory
cpus            interrupt-parent        serial-number
dma_buf_phys    ion                     sound@0
dummy-panel     l2-cache0               timer-cl0-cpu0

以下是您可能需要的一些典型用法:
•假设您不知道要检查的设备树条目的确切路径。在/proc/device-tree中有一个__symbol__目录,这在这种情况下非常有用。对于设备树中的每个符号标签,它都有一个条目。您可以通过在该条目上运行cat命令来找到该符号的确切路径。下面是一个例子来演示这个用法:

root@j7-evm:~# cat /proc/device-tree/__symbols__/main_i2c0
/interconnect@100000/i2c@2000000

root@j7-evm:~# ls /proc/device-tree/interconnect@100000/i2c@2000000/
#address-cells   clock-names  gpio@20     name       pinctrl-names
#size-cells      clocks       gpio@22     phandle    power-domains
clock-frequency  compatible   interrupts  pinctrl-0  reg

•如果是字符串类型的设备树条目,可以使用cat命令查看。但是,如果值是整数或一些数字数据,则必须运行xxd命令,而不是cat,以获得可读格式的输出。下面是一个例子来演示这个用法:
#字符串值的示例

root@j7-evm:~# cat /proc/device-tree/interconnect@100000/i2c@2000000/compatible
ti,j721e-i2cti,omap4-i2c

#整数值示例

root@j7-evm:~# xxd -g4 /proc/device-tree/interconnect@100000/i2c@2000000/clock-frequency
00000000: 00061a80        
                 ....

#以上值为十六进制。您可以使用以下命令计算它的十进制值

root@j7-evm:~# echo $((0x00061a80))
400000

•设备树变化的一个常见场景是调整像R5F这样的remoteproc处理器的内存。通过对特定的处理器核心运行类似下面的命令,您可以检查它是否得到了正确的更新。
#查找R5Fs的符号

root@j7-evm:~# ls /proc/device-tree/__symbols__/main_r5fss*
/proc/device-tree/__symbols__/main_r5fss0                          /proc/device-tree/__symbols__/main_r5fss0_core1_dma_memory_region  /proc/device-tree/__symbols__/main_r5fss1_core0_memory_region
/proc/device-tree/__symbols__/main_r5fss0_core0                    /proc/device-tree/__symbols__/main_r5fss0_core1_memory_region      /proc/device-tree/__symbols__/main_r5fss1_core1
/proc/device-tree/__symbols__/main_r5fss0_core0_dma_memory_region  /proc/device-tree/__symbols__/main_r5fss1                          /proc/device-tree/__symbols__/main_r5fss1_core1_dma_memory_region
/proc/device-tree/__symbols__/main_r5fss0_core0_memory_region      /proc/device-tree/__symbols__/main_r5fss1_core0                    /proc/device-tree/__symbols__/main_r5fss1_core1_memory_region
/proc/device-tree/__symbols__/main_r5fss0_core1                    /proc/device-tree/__symbols__/main_r5fss1_core0_dma_memory_region

#从符号中找到位置

root@j7-evm:~# cat /proc/device-tree/__symbols__/main_r5fss0_core0_memory_region
/reserved-memory/r5f-memory@a2100000

root@j7-evm:~# cat /proc/device-tree/__symbols__/main_r5fss0_core0_dma_memory_region
/reserved-memory/r5f-dma-memory@a2000000

#检查值

root@j7-evm:~# xxd -g4 /proc/device-tree/reserved-memory/r5f-memory@a2100000/reg
00000000: 00000000 a2100000 00000000 01f00000  ................

root@j7-evm:~# xxd -g4 /proc/device-tree/reserved-memory/r5f-dma-memory@a2000000/reg
00000000: 00000000 a2000000 00000000 00100000  .............…

4.1.13. 如何集成与处理器SDK Linux J721e中打包的不同版本的开源软件?
如果用户由于现有的bug、功能限制或其他原因需要迁移到不同的组件版本(旧的或新的),TI将不支持版本迁移。作为参考,TI提供了在将组件集成到处理器SDK Linux J721e时更新的一些配方的列表。

├── QT5:
│    ├──Baseline:
│    │     └──meta-qt5:recipes-qt/qt5/: recipes and patches from community
│    │
│    └──Arago (TI) updates:
│         ├──meta-arago:
│         │ ├──meta-arago-distro/recipes-qt/qt5: recipes update and additional patches
│         │ ├──meta-arago-extra/recipes-qt/examples:local qt5 examples
│         │ ├──meta-arago-distro/recipes-qt/examples:local qt5 examples recipe update and patches
│         │ ├──meta-arago-distro/recipes-core/packagegroups: no changes are expected
│         │ │   ├──packagegroup-arago-qte.bb
│         │ │   ├──packagegroup-arago-tisdk-qte.bb
│         │ │   └──packagegroup-arago-tisdk-qte-sdk-host.bb
│         │ ├──meta-arago-extras\recipes-core\packagegroups: no changes are expected
│         │ │   └──packagegroup-arago-qte-toolchain-target.bb
│         │ │
│         │ ├──meta-arago-distro/conf/layer.conf: No changes needed for QT configurations
│         │ └──meta-arago-distro/conf/distro/arago.conf
│         └──meta-processor-sdk:
│               └──recipes-qt/qt5: additional recipe updates and patches
├──Wayland/Weston:
│    ├──Baseline:
│    │     └──oe-core/meta/recipes-graphics/wayland: recipes and patches from community
│    │
│    └──Arago (TI) updates:
│         ├──meta-arago:
│         │ ├──meta-arago-distro/recipes-graphics/wayland: recipes update and additional patches
│         │ ├──meta-arago-extras/recipes-graphics/wayland/wayland-protocols
│         │ ├──meta-arago-distro/recipes-graphics/wayland/wayland-ivi-extension: wayland-ivi recipes
│         │ ├──meta-arago-distro/recipes-graphics/wayland/weston-conf: weston configuration
│         │ └──meta-arago-distro/conf/distro/arago.conf: DISTRO_FEATURES

Note: There are many modules that depend on wayland. For example: chromium-wayland, qt5/qtwayland, gstreamer1.0-plugins-bad(waylandsink), glmark2 and gtk+3
├──SGX (Not recommended to modify):
│    ├──Baseline:
│    │
│    ├──meta-ti:
│    │  ├──recipes-graphics/libgles/ti-sgx-ddk-um_<version>
│    │  └──recipes-bsp/powervr-drivers/ti-sgx-ddk-km_<version>
│    │
│    ├──meta-arago:
│    │  ├──meta-arago-extras/recipes-graphics/img-pvr-sdk
│    │  ├──meta-arago-distro/recipes-tisdk/ti-tisdk-makefile/ti-tisdk-makefile/Makefile_ti-sgx-ddk-km
│    │  └──meta-arago-distro/conf/distro/include/arago-prefs.inc: define virtual/egl, virtual/libgles1 and virtual/libgles2
│    │
│    │ Note: There are many modules that depend on sgx, but that does not affect sgx update.
│    │
│    └──Arago (TI) updates:
│       └──meta-processor-sdk:
│           └──recipes-graphics/libgles/ti-sgx-ddk-um_version: for non-sgx build only
├──Gstreamer:
│    ├──Baseline:
│    │
│    ├──meta-openembedded:
│    │  └──meta-multimedia/recipes-multimedia/gstreamer-0.10: recipes and patches from community
│    │
│    │
│    ├──oe-core:
│    │  └──meta/recipes-multimedia/gstreamer: recipes and patches from community
│    │      ├──gstreamer1.0-plugins-base
│    │      ├──gstreamer1.0-plugins-bad
│    │      ├──gstreamer1.0-plugins-good
│    │      ├──gstreamer1.0-plugins-ugly
│    │      └──gstreamer1.0-libav
│    │
│    └──Arago (TI) updates:
│       └──meta-arago:
│       ├──meta-arago-extras/recipes-multimedia/gst-plugins-ti: TI-specific recipes for TI plugins
│       ├──meta-arago-extras/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad: recipes update and additional patches
│       ├──meta-arago-distro/conf/distro/arago.conf: configuration
│       └──meta-arago-distro/recipes-core/packagegroups/packagegroup-arago-tisdk-multimedia-sdk-target.bb: package

如果用户希望了解更多关于Yocto项目或Arago构建的信息,请参考下面的视频链接和通过Yocto构建处理器SDK Linux的文档。

• https://training.ti.com/customizing-yocto-for-production-introduction

4.1.14。如何在VMware下构建Ubuntu Linux主机
警告
此内容已不再维护。它被留在这里,以防它能帮助别人,但它不会被维护,最终会过时。如果您选择使用虚拟机在PC上托管您的Linux开发版本,VM提供者将提供比我们在这里提供的更好、更完整的最新信息。
介绍
这个指南演示了如何在Windows 7下运行一个虚拟的Ubuntu Linux机器和VMware。请只使用32位的Ubuntu 14.04版本,因为这是所谓的LTS(长期支持)。有一些SDK脚本将会检查这个发布身份。
要求:
•能上网的windows 7主机,至少1G RAM和40G空闲硬盘空间。
这里的说明用于设置40G虚拟机。整个40G不是一次性拿走的,但随着机器的使用和软件的安装,机器可以增长,占用40G。
下载Ubuntu 14.04 LTS ISO镜像文件
获取Ubuntu 14.04 LTS光盘的ISO镜像文件: http://releases.ubuntu.com/14.04/。2 .在“desktop CD”区域下选择“PC (Intel x86) desktop CD”。
单击下载并按照说明下载并保存ISO镜像。记住你把它保存在哪里-你很快就需要ISO了!(CD镜像)。
下载VMware并安装
获取方式:http://www.vmware.com
Vmware Player是一个免费的从网站上下载的软件,用户可以使用从Ubuntu下载的ISO镜像从头开始创建一个完整的虚拟机。这是必要的注册一个帐户在VMware为了获得下载区域。获取VMware的一般步骤如下:
•登录vmware网站
•从产品菜单中选择VMware Player
•按照以下步骤下载VMware Player
注意:我们已经测试了v7.0.0,没有已知的问题。截至2015年2月,v7.0.0是最新版本。
•运行可执行文件安装VMware
•接受license和所有默认设置。
使用VMware创建一个新的虚拟机
在开始新的安装之前,假定Windows主机与DHCP服务器有适当的internet连接,并且Windows主机有足够的硬盘空间用于新的虚拟机。
以下步骤以VMware 7.0.0版本为例进行说明。其他版本的具体步骤可能略有不同
•开始VMware。
•在文件菜单中选择“创建一个新的虚拟机…”
•选择稍后安装操作系统。单击“下一步”。
•选择Linux作为“客户操作系统”,选择Ubuntu作为“版本”。单击“下一步”。
•提供一个“虚拟机名称”和“位置”,机器将存储在Windows主机上。这里的默认设置很好。单击“下一步”。
•对于“最大磁盘大小(GB)”,如果可能,最好从40G开始。这意味着它在Windows主机上会占用40G的空间。在继续之前,请确保Windows主机至少拥有这些内容。告诉VMware将虚拟磁盘分割成2G文件也是一个很好的做法。这将使图像在必要时更容易复制和传输。单击“下一步”。
•点击“完成”,完成虚拟机的创建。
机器名现在将列在VMware的主页下。在第一次玩机器之前,有必要修改一些机器设置。在主页选择虚拟机,然后点击右边的“编辑虚拟机设置”。

点击CD/DVD,将连接更改为“使用ISO镜像文件”。点击“浏览…”,选择之前下载的Ubuntu ISO镜像文件。点击网络适配器,将网络连接更改为“桥接”,勾选“复制物理网络连接状态”。
向虚拟机添加串口
如果您计划使用串口终端应用程序,则必须向虚拟机添加一个串口。该端口必须是主机PC上存在的物理串口。点击“Add…”,选择“Serial Port”。单击“下一步”。选择“使用主机物理串口”。单击“下一步”。单击Finish。点击“Ok”。
由于这是主机PC上的一个物理端口,主机PC和虚拟机不能同时使用。虚拟机启动后,串口将无法被主机PC使用。如果虚拟机启动时正在使用串口,则虚拟机启动后将无法访问串口。因此,如果想让虚拟机获得对主机PC物理串口的控制,虚拟机启动时主机PC上不能运行超级终端或terterm等应用程序。
在Ubuntu中使用minicom串口的进一步说明在这里。
Minicom是Sitara SDK的首选应用程序。minicom的安装和设置是由Sitara SDK安装程序自动完成的。
现在点击“Play virtual machine”。由于这是第一次启动机器,并且Ubuntu ISO镜像在虚拟光盘驱动器中,Ubuntu OS将自己安装到虚拟机中。
点击Ubuntu安装,并在安装过程中做出适当的选择。这将有助于使用SDK安装脚本。

整个安装过程需要20-30分钟。当它完成时,机器将重新启动。现在,机器将提示输入安装过程中创建的用户名和密码。
在机器重新启动进入Ubuntu后,将Ubuntu ISO从虚拟光驱中取出是很有帮助的。单击虚拟机菜单,选择“设置…”。点击CD/DVD,将连接从“使用ISO镜像文件”更改为“使用物理驱动器”。可以从下拉列表中选择实际的驱动器号。如果主机上没有物理驱动器,可以简单地从主机上删除CD/DVD设备。
安装虚拟机工具
VMware tools是对VMware的一个非常有用的补充。它允许你调整VMware屏幕的大小,剪切和粘贴文本,以及从Ubuntu机器到Windows主机的拖放文件。
在虚拟机窗口点击Player -> Manage -> Install VMware Tools

VMware tools包含在ISO文件中,VMware会自动挂载。这个驱动器将显示在Ubuntu桌面上,就像它是DVD驱动器中的磁盘一样。

在驱动器上有一个名为VMwareTools-9.9.0-2304977.tar.gz的tar文件(或者版本号稍有不同)。将tar压缩包解压到/home/目录中。您将看到创建了一个vmware-tools-distrib文件夹,并在其中创建了一个名为vmware-install.pl的文件。执行vmware-install.pl安装VMware Tools。Perl脚本必须作为超级用户执行。在Ubuntu中,这是通过在命令前加上“sudo”来实现的。当提示输入密码时,输入用户帐户的密码。在Ubuntu中,没有“root”帐号。然而,安装Ubuntu时创建的第一个用户帐户可以通过“sudo”命令成为超级用户。在安装VMware Tools的过程中,选择所有默认设置。
示例如下所示。

sitara@sitara-virtual-machine:~$ cd
sitara@sitara-virtual-machine:~$ tar -xzvf /media/sitara/VMware\ Tools/VMwareTools-9.9.0-2304977.tar.gz
sitara@sitara-virtual-machine:~$ sudo ./vmware-tools-distrib/vmware-install.pl

确认有效的网络连接
第一次登录到计算机后,弹出一个终端窗口。这可以在Ubuntu的应用程序菜单下找到。Applications –> Accessories –> Terminal。在此终端输入pwd。这应该返回/home/。现在ifconfig类型。这应该会返回关于网络连接的信息。eth0下的IP地址应该与Windows主机的IP地址相似,但不能相同。

sitara@sitara-virtual-machine:~$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:0c:29:da:a8:6e
inet addr:128.247.107.65 Bcast:128.247.107.255 Mask:255.255.254.0
inet6 addr: fe80::20c:29ff:feda:a86e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:759 errors:0 dropped:0 overruns:0 frame:0
TX packets:32 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:62873 (62.8 KB) TX bytes:4937 (4.9 KB)
Interrupt:19 Base address:0x2024

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:720 (720.0 B) TX bytes:720 (720.0 B)

VMware下如何读取USB - SD读卡器
有时需要将SD卡连接到虚拟机(例如,运行由SDK提供的创建SD卡脚本,该SDK对可以与目标板一起使用的SD卡进行分区、格式化和填充)。当带SD卡的USB读卡器插入主机的USB插槽时,虚拟机将自动检测驱动器并从SD卡上挂载分区,使SD卡对运行在虚拟机中的Linux可用.
如果这不是自动发生的(即无法从Linux VM访问SD卡),可以通过单击Player menu -> Removable Devices然后选择读卡器手动完成。从该子菜单可以连接或断开USB读卡器.

4.2. 硬件EVM设置
• 4.2.1. J721E EVM硬件设置
4.2.1. J721E EVM硬件设置
说明
J721E评估模块提供了一个经济实惠的平台,可以快速开始评估Jacinto™ DRA8xx处理器,加速信息娱乐、ADAS、网关和许多其他汽车应用程序的开发。
J721E评估模块由SoM(模块上系统)和公共处理器板组成
J7ES SOM
系统模块是一个具有SoC专用插座和PMIC、DDR内存等重要平台专用硬件的小板
有两种变体。以下是具有不同版本SoM的EVMs的图像:

  1. Alpha板
    注意
    Alpha evm在SoM板上有“临时PMIC”标签。

  2. Beta板
    注意
    Beta-evm在SoM板上没有“临时PMIC”标签。

board的内容
•J721e系统芯片
•电源控制器
•4 GiB DDR RAM
•OSPI NOR闪存
•OSPI NOR flash
•Hyperflash
公共处理器板是具有外围设备以提供最常见功能的主板。它允许连接到不同的适配器卡。
带ALPHA-SOM的公共处理器板

带有BETA-SOM的公共处理器板
board的内容
有关将外围设备连接到公共处理器板的详细信息,请参阅EVM连接
•12V电源输入
•主UART的4个UART到USB端口
•2xUART到USB端口MCU域UART
•5个以太网端口
•2个显示端口
•2个FPDlink显示连接器
•7 x 3.5毫米音频插孔
•2个PCIe连接器
•SD卡插槽
•8GiB eMMC
信息娱乐子卡
信息娱乐子卡是适配器板,它有附加的外围设备,用于信息娱乐用例。它支持HDMI显示、FPDlink显示额外的音频通道、CSI摄像头等

board的内容
•14x 3.5毫米音频插孔
•2x FPDlink显示连接器
•并口Omnivision摄像机连接器
•CSI摄像机连接器
•HDMI显示连接器
GESI子卡
GESI(网关/以太网交换机/工业)子卡是为网关和工业用例提供额外外设的适配器板。它支持额外的以太网端口和CAN端口等

board的内容
•5个以太网端口
•profinet连接器
•电机控制集箱
•额外的CAN headers
开关设置
最常用的启动方式是使用SD卡。以下是设置普通处理器板启动方式为SD的开关设置。

当您希望从CCS等调试器加载二进制文件时,必须将普通处理器板设置为无引导模式。下面是实现相同功能的开关设置。

EVM连接
连接以下外围设备以使用Linux处理器SDK

  1. MAIN_UART是一个USB连接器,用于连接4个主UART设备,这将在Linux机器中注册/dev/ttyUSB[0-3]。
  2. MCU_UART是一个USB连接器,用于连接2个MCU UART设备。这将在Linux机器中注册/dev/ttyUSB[4-5]。
    注意
    按顺序连接主UART和MCU UART,以便正确分配设备编号。
    3.将显示端口1080p监视器连接到commonProcBoard的Display0端口。
    注意
    只能使用首选分辨率为1080p的显示器,不支持任何其他分辨率。
    4.在commonProcBoard的RJ45连接器[4]处连接以太网,如图所示。
    5.将micro SD卡插入[5]中所示的插槽
    6.如果要运行RTOS演示或使用CCS,请连接XDS110连接器[6]。
    7.将1080p HDMI显示器连接到信息娱乐子卡上的HDMI端口[7]端口。
    注意
    对于Linux演示,将引导开关设置保持在SD模式下;对于网关演示,将引导开关设置保持在noboot模式下
    8.连接12V电源
    9.电路板上的电源
  3. 文档压缩文件
    请单击下面的链接下载整个文档的HTML格式快照。。
    Download processor-sdk-linux-docs.tar.gz
    使用下面的命令解压缩压缩包:
    tar -xzvf processor-sdk-linux-docs.tar.gz
    然后,您可以打开登录页(processor-sdk-linux-docs-[version]/linux/index.html)在浏览器中浏览内容。
  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值