Loading

TL138-EVM工业评估板学习笔记(一)双核开发环境搭建

TL138-EVM工业评估板学习笔记(一)双核开发环境搭建

0 基本硬件资源

0.1 CPU

处理器是TI公司的OMAP-L138,双核架构:armV9+dspC674X。

0.2 ROM

NAND Flash采用Spansio(飞索半导体)的S34ML01G200TFI000 。
I2C EEPROM采用MICROCHIP(微芯)的AT24C02C 。
SPI Flash采用winbond(华邦电子)的W25Q32FVSSIG 。

0.3 RAM

内存采用Micron Technology(镁光科技)的ddr2,芯片丝印上有两行代码,第一行3PM15,第二行D9RZT,D9RZT对应的是官方的FBGA Code, 可在官网查看型号,D9RZT对应的是芯片型号为MT47H64M16NF-25E IT:M 。

1 前言

OMAP-L138可以直接对 arm or dsp 进行裸机编程,可以当成单片机来用,需要的软件有

  • CCS
  • startware 函数库
  • bios/sys 实时操作系统内核(可选)

烧录的话,arm这边可以使用TI的AISgen软件将.out文件转换为.ais文件,然后使用调试器or串口orSD卡进行烧录;然后dsp这边可以使用烧录器进行烧录。烧录相关姿势与芯片上的bootloader有关,可以阅读参考资料[9]加以学习。

如果想要使用双核开发,最好依赖于操作系统,本文主要聚焦于linux镜像系统的制作(基于SD卡),创建一个可以跑双核任务的开发环境。本着知其然,知其所以然的态度,我在跟随创龙用户手册搭建的过程中也会记录自己的思考,如有不对之处,还请各位大佬指正🥳

2 镜像卡制作

镜像卡的制作,即制作可以运行linux系统的SD卡,这里创龙提供了比较完备的资料,一些压缩包已经准备好了。

本节2.1 2.2 2.3 是准备工作,2.4节进行了linux内核编译操作,2.5节进行了uboot编译操作,2.6节进行了rootfs拷贝,2.7节进行了镜像卡制作。

2.1 虚拟机环境搭建

主机系统win11

软件安装

  • VMwareWorkstation 16.2.0 , 镜像ubuntu12.04

至于为啥镜像版本找这么老的,主要是我不想踩多余的坑,因为版本问题出现的坑太多,时间就是金钱,,,先跟着创龙的教程走一遍,其余的有时间再折腾吧。

反正目前根据实际经验,ubuntu16.04应该是可以开发 arm host 端的程序的;同时,根据和他人博客经验[8],ubuntu16.04貌似不能开发dsp端的程序,所以还是12.04吧。

2.2 buntu12.04的软件源更新

ubuntu12.04停止维护,因此ubuntu主站的软件源也不支持12.04了,想要使用apt-get install需要更换软件源地址

sudo gedit /etc/apt/sources.list

将其中的内容更换为

deb http://old-releases.ubuntu.com/ubuntu precise main restricted universe multiverse    
deb http://old-releases.ubuntu.com/ubuntu precise-security main restricted universe multiverse    
deb http://old-releases.ubuntu.com/ubuntu precise-updates main restricted universe multiverse    
deb http://old-releases.ubuntu.com/ubuntu precise-proposed main restricted universe multiverse    
deb http://old-releases.ubuntu.com/ubuntu precise-backports main restricted universe multiverse    
deb-src http://old-releases.ubuntu.com/ubuntu precise main restricted universe multiverse    
deb-src http://old-releases.ubuntu.com/ubuntu precise-security main restricted universe multiverse    
deb-src http://old-releases.ubuntu.com/ubuntu precise-updates main restricted universe multiverse    
deb-src http://old-releases.ubuntu.com/ubuntu precise-proposed main restricted universe multiverse    
deb-src http://old-releases.ubuntu.com/ubuntu precise-backports main restricted universe multiverse   

注意:以上源地址适用于12.04,其余版本慎用!

然后就可以愉快地更新软件源了

sudo apt-get update

更新完软件源就可以愉快地使用apt-get install啦。

首先,可以使用apt-get install 安装一些必要的软件

sudo apt-get install nautilus-open-terminal #右键打开终端
sudo apt-get install vim #vim
sudo apt-get install python3 #python3
sudo apt-get install tree #tree

2.3 安装交叉编译工具链

咱的ubuntu系统的处理器是x86架构的,但是我们想要编译获得能在arm上运行的程序就需要交叉编译工具链,Codesourcery(已被收购)和Linaro可提供直接执行的免费工具链,

下载arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,这个版本比较老,我是直接从创龙的资料里拿的,找了找,Linaro提供的版本都是2014年以后的,Codesourcery又大变样,我懒得找了,有个博客收集了各种版本的交叉工具链,貌似是给的百度网盘,地址我贴在参考资料[14]了,老东西就是不方便😒。apt里也能找到gcc-4.4-arm-xxx,但是我没试。

解压缩到指定目录

sudo tar jxvf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /home/ti/

添加环境变量

export PATH=$PATH:/home/ti/arm-2009q1/bin

每次重启均需添加一次,方便起见可以将该命令写在 /etc/profile 文件 或者 /etc/bash.bashrc 文件里。当启动bash时,an interactive login shell 会执行 /etc/profile,an interactive non-login shell 会执行 /etc/bash.bashrc,目前来看,两者貌似区别不大,都可以达成添加环境变量的目的。

查看

baiyug@ubuntu:/home/ti/omapl138$ arm-none-linux-gnueabi-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
Configured with: /scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/src/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-203' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/libc --with-gmp=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/obj/host-libs-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/mitchell/builds/4.3-arm-none-linux-gnueabi-respin/lite/install/arm-none-linux-gnueabi/bin
Thread model: posix
gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) 

2.4 编译linux源码

建立文件夹存放Linux3.3源码

sudo mkdir -p /home/ti/omapl138
sudo mkdir /home/ti/omapl138/linux-3.3

下载linux3.3源码,我用的创龙光盘里的压缩包,linux3.3的原始版本可以从linux官网下载,然后TI官网有PROCESSOR-SDK-LINUX-OMAPL138提供了相关的linux源码和uboot源码,不过我看老版本貌似被淘汰了。我猜,创龙提供的linux源码是根据TI在2013发布的原始版本PROCESSOR-SDK-LINUX-OMAPL138进行的二次开发,从光盘资料中的linux-feature-support.pdf 来看,从2013至2020年,创龙内部进行了几次更新,包括但不限于适配自家产品的驱动更新。

解压linux3.3源码

sudo tar jxvf linux-3.3-g81233f1-v2.3.tar.bz2 -C /home/ti/omapl138/linux-3.3

进入linux3.3源码目录,并调用root权限,如果不调用root权限,编译内核时可能会找不到arm-none-linux-gnueabi-gcc命令,可能是因为我把工具链装在了root权限的位置

cd /home/ti/omapl138/linux-3.3
sudo -i

清理内核编译信息,如果是第一次编译,应该就不需要清理

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- distclean

配置内核,这里我选择的是创龙的配置

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- da850_omapl138_tl_defconfig

如果,需要自定义配置,可以使用make menuconfig命令,然后选择自己需要的配置。

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig

安装uboot-mkimage便于生成uImage镜像

sudo apt-get install uboot-mkimage

编译内核

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- uImage -j4

正常情况下编译是没有问题的

Image Name:   Linux-3.3.0
Created:      Tue Apr  1 17:39:52 2025
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    2950296 Bytes = 2881.15 kB = 2.81 MB
Load Address: c0008000
Entry Point:  c0008000
  Image arch/arm/boot/uImage is ready

编译完成后,可在内核源码的"arch/arm/boot/"目录下找到uImage。

至此,linux内核的核心镜像已经编译完成,这个镜像提供了操作系统的主要功能和主要驱动,必须时刻加载,此外,还有一些modules,这些modules是一些额外的功能,在需要时才会加载。

编译modules

make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- modules -j4
 Building modules, stage 2.
  MODPOST 25 modules
  CC      arch/arm/mach-davinci/tl138-ats-board.mod.o
  CC      arch/arm/mach-davinci/c674x-irq-events.mod.o
  CC      arch/arm/mach-davinci/tl138-spiflash.mod.o
  CC      arch/arm/mach-davinci/tl138evm-ad5724r.mod.o
  CC      arch/arm/mach-davinci/tl138evm-ad7606-par.mod.o
  CC      arch/arm/mach-davinci/tl138evm-ad7606-spi.mod.o
  CC      arch/arm/mach-davinci/tl138evm-emifa-sram.mod.o
  CC      arch/arm/mach-davinci/tl138evm-mcp251x.mod.o
  CC      arch/arm/mach-davinci/tl138evm-smsc911x.mod.o
  CC      arch/arm/mach-davinci/tl138evm-tl16754-serials.mod.o
  CC      arch/arm/mach-davinci/tl138f-ats-board.mod.o
  CC      arch/arm/mach-davinci/tl138f-fpga-prog.mod.o
  CC      drivers/ata/ahci_platform.mod.o
  CC      drivers/ata/libahci.mod.o
  CC      drivers/ata/libata.mod.o
  CC      drivers/input/touchscreen/ads7846.mod.o
  CC      drivers/mtd/devices/m25p80.mod.o
  CC      drivers/net/can/mcp251x.mod.o
  CC      drivers/scsi/scsi_wait_scan.mod.o
  CC      drivers/spi/spidev.mod.o
  CC      drivers/staging/iio/dac/ad5724r_spi.mod.o
  CC      fs/ntfs/ntfs.mod.o
  CC      sound/soc/codecs/snd-soc-tlv320aic3x.mod.o
  CC      sound/soc/davinci/snd-soc-davinci-mcasp.mod.o
  CC      sound/soc/davinci/snd-soc-evm.mod.o
  LD [M]  arch/arm/mach-davinci/c674x-irq-events.ko
  LD [M]  arch/arm/mach-davinci/tl138-ats-board.ko
  LD [M]  arch/arm/mach-davinci/tl138-spiflash.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-ad5724r.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-ad7606-par.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-ad7606-spi.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-emifa-sram.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-mcp251x.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-smsc911x.ko
  LD [M]  arch/arm/mach-davinci/tl138evm-tl16754-serials.ko
  LD [M]  arch/arm/mach-davinci/tl138f-ats-board.ko
  LD [M]  arch/arm/mach-davinci/tl138f-fpga-prog.ko
  LD [M]  drivers/ata/ahci_platform.ko
  LD [M]  drivers/ata/libahci.ko
  LD [M]  drivers/ata/libata.ko
  LD [M]  drivers/input/touchscreen/ads7846.ko
  LD [M]  drivers/mtd/devices/m25p80.ko
  LD [M]  drivers/net/can/mcp251x.ko
  LD [M]  drivers/scsi/scsi_wait_scan.ko
  LD [M]  drivers/spi/spidev.ko
  LD [M]  drivers/staging/iio/dac/ad5724r_spi.ko
  LD [M]  fs/ntfs/ntfs.ko
  LD [M]  sound/soc/codecs/snd-soc-tlv320aic3x.ko
  LD [M]  sound/soc/davinci/snd-soc-davinci-mcasp.ko
  LD [M]  sound/soc/davinci/snd-soc-evm.ko

可以使用modules_install命令将modules安装到指定目录,或者直接安装在系统卡roofs分区。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules_install INSTALL_MOD_PATH=/xxx/xxx

2.5 编译uboot源码

uboot是板子开机就运行的一段程序,相当于windows里的bios,主要负责初始化硬件设备,加载内核镜像,启动内核。最直观的是,这里的uboot会将uart2作为调试台,因此,板子上电后,可以查看uart2的输出,看到系统启动的打印,以及开机后通过串口连接系统的shell。

uboot源码应当是TI官网能下载的,不过和linux源码一样,2013版本的找不到了,创龙提供的源码也是根据老版本进行的二次开发,在资料中uboot-feature-support.pdf可以看到其对uboot源码做了更新。

首先,还是将源码拷贝虚拟机中

sudo mkdir -p /home/ti/omapl138/uboot
sudo tar jxvf u-boot-geb4d167-v2.2.tar.bz2 -C /home/ti/omapl138/uboot/

然后编译,基本上和linux源码编译一致

sudo -i
cd /home/ti/omapl138/uboot
make CROSS_COMPILE=arm-none-linux-gnueabi- distclean
make CROSS_COMPILE=arm-none-linux-gnueabi- da850sdi_tl_config
make CROSS_COMPILE=arm-none-linux-gnueabi- u-boot.ais -j4
Image Type:   TI Davinci AIS Boot Image
AIS magic :   41504954
AIS cmd   :   PLL & Clock configuration
AIS cmd   :   DDR2 Configuration
AIS cmd   :   EMIFA Async
AIS cmd   :   PSC setup
AIS cmd   :   PSC setup
AIS cmd   :   PSC setup
AIS cmd   :   PSC setup
AIS cmd   :   PSC setup
Image at  :   0xc1080000 size 0x0005b300

编译完成后,可在uboot源码的"/home/ti/omapl138/uboot"目录下找到u-boot.ais

实际上,这里uboot编译和上面的linux编译都很简单,因为关键的config配置创龙已经提供了,当需要自己根据硬件配置编译参数时,就可能会遇到各种各样的问题了。

2.6 文件系统

这一部分的基本信息和linux源码、uboot源码一致,都是TI官网的PROCESSOR-SDK-LINUX-OMAPL138提供,问题也是一样,都是没找到老版本。

创龙这边也是对TI的原版进行了二次开发,在资料中rootfs-feature-support.pdf可以看到其对rootfs做了更新。

文件系统貌似不用编译,可以直接拷贝到虚拟机

sudo mkdir /home/ti/omapl138/rootfs
sudo tar jxvf rootfs-amsdk-06.00.00.00-v2.8.tar.bz2 -C /home/ti/omapl138/rootfs

2.7 制作镜像

至此,镜像卡所需的基本组件已经介绍了一遍,最重要的就是linux镜像、uboot镜像、文件系统。这里使用ubuntu环境下制作镜像的方法。

SD卡所设定的分区如下

分区 格式 windows下可见性 linux下可见性 功能
boot FAT32 可见 可见 存放U-Boot、内核等
rootfs EXT3 不可见 可见 存放文件系统
rootfs-backup EXT3 不可见 可见 备份文件系统

将制卡工具包拷贝到虚拟机

mkdir -p /home/ti/omapl138/mksdboot
sudo tar -xvf mksdboot_22_23_28_17.tar.gz -C /home/ti/omapl138/mksdboot/

可以使用tree命令查看一下这个包的内容

baiyug@ubuntu:/home/ti/omapl138/mksdboot/mksdboot_22_23_28_17$ tree -L 4
.
├── boot
│   ├── u-boot.ais
│   └── uImage
├── filesystem
│   ├── modules
│   │   └── 3.3.0-08380-g81233f1.tar.bz2
│   ├── rootfs
│   │   └── rootfs-amsdk-06.00.00.00-v2.8.tar.bz2
│   ├── tests
│   │   └── product-test-omapl138-v1.7.tar.gz
│   └── tools
│       └── make-system-omapl138-v1.1.tar.gz
└── mksdboot.sh

6 directories, 7 files

其中中boot目录下就是之前编译好的uboot和linux镜像,
filesystem目录下的modules目录下是之前编译好的modules压缩包,
filesystem目录下的rootfs目录下是之前的文件系统压缩包,
filesystem目录下的tests目录下存放生产测试压缩包,
filesystem目录下的tools目录下存放部分shell脚本,这些脚本会拷贝至SD卡的boot分区,
mksdboot.sh就是Linux SD系统启动卡制作脚本。

其中,我认为最重要的是boot目录下的u-boot.ais和uImage,以及filesystem目录下的modules压缩包和rootfs压缩包。有这些应该就可以制作镜像了。其余的压缩包是创龙提供的一些预制菜,我感觉不是必要的。

实际上脚本做的工作就是,给sd卡建立分区,并将boot等组件拷贝或解压到相应的分区。脚本的main函数如下:

# Program entry function
main() {
    echo "System time: $(date "+%H:%M:%S")"

    echo -e "\n1/8:"
    check_existence_of_needed_files
    echo "2% done!"

    echo -e "\n2/8:"
    check_env
    echo "3% done!"

    echo -e "\n3/8:"
    check_validation_of_sd_card
    echo "5% done!"

    prompt_warning_message

    echo -e "\n4/8:"
    partition_sd_card
    echo "10% done!"

    echo -e "\n5/8:"
    format_sd_partitions
    echo "30% done!"

    mount_sd_partitions

    echo -e "\n6/8:"
    copy_bootloader_files
    echo "40% done!"

    #Extract filesystem to rootfs partition.
    echo -e "\n7/8:"
    extract_filesystem ${ROOTFS_MP}
    echo "70% done!"

    #Extract filesystem to rootfs-backup partition.
    echo -e "\n8/8:"
    extract_filesystem ${ROOTFS_BK_MP}
    echo "98% done!"

    echo ""
    umount_sd_partitions

    echo ""
    echo "System time: $(date "+%H:%M:%S")"
    echo "Make SD card system boot done!"
    echo "100% done!"
}

制卡脚本用到了pv这个软件,实际上是用来查看进度的。
PV由Andrew Wood开发,是Pipe Viewer的简称,意思是通过管道显示数据处理进度的信息。这些信息包括已经耗费的时间,完成的百分比(通过进度条显示),当前的速度,全部传输的数据,以及估计剩余的时间。

sudo apt-get install pv

查看sd卡的设备节点名字,这里插入sd卡后,可以看到多了一个设备节点sdb以及它有一个分区sdb1,那么sd卡的设备节点名字就是sdb

baiyug@ubuntu:~/Desktop$ ls /dev/ | grep sd
sda
sda1
sda2
sda5
baiyug@ubuntu:~/Desktop$ ls /dev/ | grep sd
sda
sda1
sda2
sda5
sdb
sdb1

然后可以使用脚本制卡

baiyug@ubuntu:/home/ti/omapl138/mksdboot/mksdboot_22_23_28_17$ sudo ./mksdboot.sh --device /dev/sdb
System time: 22:31:35

1/8:
Checking existence of needed files...
2% done!

2/8:
Checking make card envirgnment...
3% done!

3/8:
Checking capacity of SD card...
-> mksdboot data size is 610 Mb.
-> SD card size is 30436 Mb.
5% done!

*******************************************************
*     THIS WILL DELETE ALL THE DATA ON /dev/sdb       *
*                                                     *
*     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....                    *
*******************************************************


4/8:
Partitioning SD card...
Umounting partitions...
done!
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.586521 s, 1.8 MB/s
Done!
10% done!

5/8:
-> formating BOOT partition...
mkfs.vfat 3.0.12 (29 Oct 2011)
-> formating rootfs partition...
mke2fs 1.42 (29-Nov-2011)
Filesystem label=rootfs
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
780288 inodes, 3116544 blocks
155827 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3191865344
96 block groups
32768 blocks per group, 32768 fragments per group
8128 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

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

-> formating rootfs-backup partition...
mke2fs 1.42 (29-Nov-2011)
Filesystem label=rootfs-backup
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
778240 inodes, 3112960 blocks
155648 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=3187671040
95 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

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

30% done!

-> mount boot partition
-> mount rootfs partition
-> mount rootfs-backup partition

6/8:
Copying bootloader files to BOOT partition.
714+1 records in
714+1 records out
365908 bytes (366 kB) copied, 0.162672 s, 2.2 MB/s
40% done!

7/8:
Extracting filesystem to /tmp/3046-rootfs
95.6MB 0:00:30 [3.15MB/s] [==================================>] 100%            
70% done!

8/8:
Extracting filesystem to /tmp/3046-rootfs-backup
95.6MB 0:00:34 [ 2.8MB/s] [==================================>] 100%            
98% done!

Umounting partitions...
done!

System time: 22:34:23
Make SD card system boot done!
100% done!

2.8 系统启动验证

将制作好的镜像卡插入开发板,并将拨码开关拨到MMC/SD0,然后使用串口工具查看


 _____                    _____           _         _
|  _  |___ ___ ___ ___   |  _  |___ ___  |_|___ ___| |_
|     |  _| .'| . | . |  |   __|  _| . | | | -_|  _|  _|
|__|__|_| |__,|_  |___|  |__|  |_| |___|_| |___|___|_|
              |___|                    |___|

Arago Project http://arago-project.org omapl138-Tronlong ttyS2

Arago 2013.05 omapl138-Tronlong ttyS2

omapl138-Tronlong login: root (automatic login)

root@omapl138-Tronlong:~#

可以看到,系统已经启动成功,并且root用户已经自动登录。

2.9 感想

总的来说,制作镜像卡的过程还是比较简单的,因为开发板资料比较完备;实际上,我认为制卡的过程最重要的还是镜像系统和硬件的适配,这一部分是创龙配好的,以后如果需要DIY系统和硬件,还要进一步学习linux源码和uboot源码。

3 双核例程运行

3.1 编译环境搭建

编译环境的系统就是虚拟机上的ubuntu12.04,本次的双核例程采用TI的syslink库以及IPC库,编译器用了TI的ccs和arm-none-linux-gnueabi-gcc。

首先需要安装一些必要的软件,包括

  • CCS5(主要编译工具,包含了c6000 compiler 和 xdctool)
  • StarterWare (函数库)
  • ipc ( Inter/Intra Processor Communication 多核通信处理库)
  • bios (实时操作系统内核)
  • syslink (多核接口库,需单独编译)
  • arm-none-linux-gnueabi-gcc (交叉编译工具)

编译最简单的helloWorld例程

下面是编译例程的顶层makefile调用的products.mak文件,其中包含了一些路径信息,需要根据自己的实际情况修改。

#
#  ======== products.mak ========
#

DEPOT = /home/baiyug

BIOS_INSTALL_DIR         = $(DEPOT)/ti/bios_6_35_04_50
CGT_ARM_PREFIX           = arm-none-linux-gnueabi-
IPC_INSTALL_DIR          = $(DEPOT)/ti/ipc_1_25_03_15
SYSLINK_INSTALL_DIR      = $(DEPOT)/ti/syslink_2_21_01_05
CGT_C674_ELF_INSTALL_DIR = $(DEPOT)/ti/ccsv5/tools/compiler/c6000_7.4.4
XDC_INSTALL_DIR          = $(DEPOT)/ti/xdctools_3_25_03_72
STARTWARE_INSTALL_DIR    = $(DEPOT)/OMAPL138_StarterWare_1_10_04_01

顶层makefile调用了SLAVELOADER

#
#  ======== makefile ========
#
SLAVELOADER=$(SYSLINK_INSTALL_DIR)/packages/ti/syslink/bin
SLAVELOADER_DEBUG:=$(SLAVELOADER)/OMAPL1XX/samples/slaveloader_debug
SLAVELOADER:=$(SLAVELOADER)/OMAPL1XX/samples/slaveloader_release

这里的SLAVELOADER就是编译syslink生成的。实际上,在编译syslink的过程中遇到了bug,bug详见 https://e2e.ti.com/support/processors-group/processors/f/processors-forum/219380/looking-for-help-building-syslink ,根据大佬回复,需要增加一些宏定义以避免符号问题,对代码的修改如下

syslink版本:2_21_01_05
linux版本:3.3

After looking at this a bit more,  it's still unclear why the newer Linux kernels don't properly define the macros (IO_PHYS, IO_SIZE, IO_ADDRESS, etc).  These marcos are defined in a device specific kernel header file, located at:

(LINUXKERNEL)/arch/arm/mach-davinci/include/mach/hardware.h

There are three files is SysLink that rely on these symbols:

ti/syslink/ipc/hlos/knl/notifyDrivers/arch/omapl1xx/Omapl1xxIpcInt.c

ti/syslink/family/hlos/knl/omapl1xx/omapl1xxdsp/Linux/omapl1xx_phy_shmem.c

ti/syslink/family/hlos/knl/omapl1xx/omapl1xxdsp/omapl1xxpwr.c

To workaround this, I've added the following to the above SysLink files:

#undef __ASM_ARCH_HARDWARE_H
#include <mach/hardware.h>

This will allow you to build SysLink (including examples) successfully.

然后,同样需要修改makefile,主要修改syslink的顶层products.mak文件,修改方式详见参考资料[22],然后执行make syslink即可。

编译成功后会输出

Building /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader.o (debug, release)
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/lib
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader/debug
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader/release
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/bin/OMAPL1XX/samples
Building /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader (debug, release)
mkdir -p /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/bin/OMAPL1XX/samples
Compiling: /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/samples/hlos/slaveLoader/SlaveLoader.c
Building library /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader.o_debug
Compiling: /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/samples/hlos/slaveLoader/usr/Linux/SlaveLoaderOS.c
Building /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader.exe_debug
Compiling: /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/samples/hlos/slaveLoader/SlaveLoader.c
Building library /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader.o_release
Compiling: /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/samples/hlos/slaveLoader/usr/Linux/SlaveLoaderOS.c
Building /home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/obj/OMAPL1XX/samples/slaveloader.exe_release
make[2]: Leaving directory `/home/baiyug/ti/syslink_2_21_01_05/packages/ti/syslink/samples/hlos/slaveLoader/usr/Linux'
make[1]: Leaving directory `/home/baiyug/ti/syslink_2_21_01_05/packages'

这里注意编译生成的slaveloader_debug和slaveloader_release的文件地址,和待编译的顶层makefile中的调用需一致,正常情况下是一致的。

然后执行make编译dsp程序和host程序,然后执行make install获得可执行文件目录
最终的文件结构如下:

.
├── dsp
│   ├── bin
│   │   ├── debug
│   │   │   ├── obj
│   │   │   │   ├── main_dsp.oe674
│   │   │   │   ├── server_dsp.xe674.map
│   │   │   │   └── Server.oe674
│   │   │   └── server_dsp.xe674
│   │   └── release
│   │       ├── obj
│   │       │   ├── main_dsp.oe674
│   │       │   ├── server_dsp.xe674.map
│   │       │   └── Server.oe674
│   │       └── server_dsp.xe674
│   ├── configuro
│   │   ├── compiler.defs
│   │   ├── compiler.opt
│   │   ├── config.bld
│   │   ├── custom.mak
│   │   ├── linker.cmd
│   │   ├── package
│   │   │   ├── build.cfg
│   │   │   ├── cfg
│   │   │   │   ├── Dsp_pe674.c
│   │   │   │   ├── Dsp_pe674.cfg
│   │   │   │   ├── Dsp_pe674.cfg.dot
│   │   │   │   ├── Dsp_pe674.cfg.xml
│   │   │   │   ├── Dsp_pe674.dep
│   │   │   │   ├── Dsp_pe674.h
│   │   │   │   ├── Dsp_pe674.mak
│   │   │   │   ├── Dsp_pe674.oe674
│   │   │   │   ├── Dsp_pe674.oe674.dep
│   │   │   │   ├── Dsp_pe674.rov.xs
│   │   │   │   ├── Dsp_pe674.rta.xml
│   │   │   │   ├── Dsp_pe674.xdc.inc
│   │   │   │   ├── Dsp_pe674.xdl
│   │   │   │   └── Dsp.xe674.mak
│   │   │   ├── configuro.ccs
│   │   │   ├── configuro.class
│   │   │   ├── configuro.java
│   │   │   ├── configuro.pjt
│   │   │   ├── configuro.sch
│   │   │   ├── internal
│   │   │   ├── lib
│   │   │   ├── package.bld.xml
│   │   │   ├── package_configuro.c
│   │   │   ├── package.defs.h
│   │   │   ├── package.xdc.dep
│   │   │   ├── package.xdc.inc
│   │   │   └── rel
│   │   │       ├── configuro.xdc.inc
│   │   │       └── configuro.xdc.ninc
│   │   ├── package.bld
│   │   ├── package.mak
│   │   ├── package.xdc
│   │   └── package.xs
│   ├── Dsp.cfg
│   ├── main_dsp.c
│   ├── makefile
│   ├── Server.c
│   └── Server.h
├── host
│   ├── App.c
│   ├── App.h
│   ├── bin
│   │   ├── debug
│   │   │   ├── app_host
│   │   │   ├── app_host.map
│   │   │   └── obj
│   │   │       ├── App.ov5T
│   │   │       ├── App.ov5T.dep
│   │   │       ├── main_host.ov5T
│   │   │       └── main_host.ov5T.dep
│   │   └── release
│   │       ├── app_host
│   │       ├── app_host.map
│   │       └── obj
│   │           ├── App.ov5T
│   │           ├── App.ov5T.dep
│   │           ├── main_host.ov5T
│   │           └── main_host.ov5T.dep
│   ├── main_host.c
│   └── makefile
├── install
│   ├── debug
│   │   ├── app_host
│   │   ├── run.sh
│   │   ├── server_dsp.xe674
│   │   └── slaveloader
│   └── release
│       ├── app_host
│       ├── run.sh
│       ├── server_dsp.xe674
│       └── slaveloader
├── makefile
├── makefile~
├── pax_global_header
├── products.mak
├── products.mak~
├── readme.txt
├── run.sh
└── shared
    ├── config.bld
    └── SystemCfg.h

3.2 hello world 上版测试

将install目录通过网线上传到板子的系统上,推荐使用mobaXterm,在这之前要配好系统的network

使用ssh连接系统,运行程序,网络端打印了arm端的host的调试信息

root@omapl138-Tronlong:~/ws/demo/tl-helloworld-uart2/install/debug# chmod 777 -R ~/ws/demo/tl-helloworld-uart2/install/debug
root@omapl138-Tronlong:~/ws/demo/tl-helloworld-uart2/install/debug# ./run.sh
+ ./slaveloader startup DSP server_dsp.xe674
Attached to slave procId 0.
Loading procId 0.
Loaded file server_dsp.xe674 on slave procId 0.
Started slave procId 0.
+ ./app_host DSP
--> App_exec:
App_exec: event received from procId=0
<-- App_exec: 0
+ ./slaveloader shutdown DSP
Stopped slave procId 0.
Unloaded slave procId 0.
Detached from slave procId 0.

同时,串口端会打印DSP端的一些调试信息

root@omapl138-Tronlong:~# [   47.775385] SysLink version : 2.21.01.05
[   47.775412] SysLink module created on Date:Aug 27 2017 Time:00:24:22
[DSP] --> main:
[DSP] --> smain:
[DSP] smain: Ipc_start() successful
[DSP] smain: Ipc_attach() successful
[DSP] --> Server_exec:
[DSP] Server_exec: sent hello world event to host
[DSP] <-- Server_exec: 0

在串口上运行程序会同时打印arm端和dsp端的调试信息

root@omapl138-Tronlong:~/ws/demo/tl-helloworld-uart2/install/debug# ./run.sh
+ ./slaveloader startup DSP server_dsp.xe674
Attached to slave procId 0.
Loading procId 0.
Loaded file server_dsp.xe674 on slave procId 0.
Started slave procId 0.
[DSP] --> main:
[DSP] --> smain:
+ ./app_host DSP
[DSP] smain: Ipc_start() successful
[DSP] smain: Ipc_att--> App_exec:
ach() successful
[DSP] --> Server_exec:
[DSP] SApp_exec: event received from procId=0
<-- App_exec: 0
erver_exec: sent hello world event to host
[DSP] <-- Server_exec: 0
+ ./slaveloader shutdown DSP
Stopped slave procId 0.
Unloaded slave procId 0.
Detached from slave procId 0.

可以看到,串口端的打印,arm端和dsp端的调试信息可能会互相干扰,所以最好是ssh运行程序,然后,串口只看串口输出,ssh连接终端查看终端shell输出。或者,在程序内注明HOST or DSP前缀,便于调试。

参考资料

[1] 创龙用户手册:TL138-EVM工业评估板硬件说明书
[2] 镁光科技官网查看FBGA Code
[3] 镁光(Micron)存储器根据丝印找具体型号(datasheet)的方法
[4] Ubuntu12.04 更新源方法
[5] 有关Linaro的介绍
[6] linaro公司:交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别
[7] 创龙用户手册:TL138-EVM搭建OMAPL138的Linux开发环境
[8] DSP+ARM多核异构开发环境搭建OMAPL138
[9] ApplicationReport: UsingtheOMAP-L132/L138Bootloader
[10] 一个windows镜像地址
[11] arm交叉编译 扫盲贴
[12] codesourcery 和Linaro简介
[13] linaro工具链release地址
[14] ARM-Linux开发:arm-none-Linux-gnueabi-gcc下载安装 - ZhangPYi - 博客园
[15] Linux Kernel Image and Modules Introduction
[16] 知乎:uboot是什么
[17] Dash SK, Ashokbhai VP, Sanmugasundaram R, Srinivasan D (2016) Transplantation of U-boot and Linux Kernel to OMAP-L138. In: Proceedings of IEEE international conference on microelectronics, computing and communications (MicroCom), National Institute of Technology, Durgapur, India, pp 1–5. https://doi.org/10.1109/MicroCom.2016.7522407
[18] TI:Processor SDK Linux Software Developer’s Guide
[19] CSDN:解决Linux(Ubuntu)系统下复制粘贴文件权限不够的问题
[20] TI:IPC_1_25_03_15下载地址
[21] TI:syslink下载地址
[22] SysLink Install Guide

posted @ 2025-04-07 17:46  Baiyug  阅读(126)  评论(0)    收藏  举报