
In this article, we will look at the DM816x / C6A816x / AM389x debugging card and the C6Accel framework (also known as C6EZAccel), and also consider how to set up the system for running embedded test applications.
It all started with an interesting idea to use the algorithms of the now very popular computer vision library OpenCV on a microprocessor. However, having studied a little topic, the idea was clarified. Why not implement the algorithms not just on the ARM core, but on a specialized core for digital DSP signal processing? Thus, we will unload the ARM core, speed up the execution of algorithms, and, you see, the most cumbersome application will work in real time.
')
So, what to use to solve the problem? It turned out a bit of options ...
Consider everything logically and consistently. Let's start with the fact that it allows you to work with a DSP processor - this is the C6Accel framework. Well, it supports OpenCV (and 2.x) only in the latest version - 2.01.00.11. In turn, this framework is written under C6A81xx / DM81xx microprocessors. By the title of the article, you have already guessed that we got the hand of DM8168, which requires the TI EZSDK software interface (the latest version is 05/05/02/00).
For those who want more details, there are useful links at the end of the article.
1. Description of the DM816x / C6A816x / AM389x debug board

Computing module DM816x / C6A816x / AM389x, developed by Texas Instruments together with Spectrum Digital, enables development of a DM816x DaVinci MPU (DM8168, DM8167, DM8166, DM8165), C6A816x C6-Integra DSP + ARM processors (C6A8168, C6A816x, C6-Integra DSP + ARM processors (C6A8168, C6A816x); AM389x Sitara ARM MPUs (AM3894, AM3892).
This miracle of technology is intended for a wide range of solutions, such as video recorders (DVRs) for surveillance, video conferencing systems, television broadcasting systems, media servers, single-board computers, computing gateway machines, routers, servers, industrial automation, user-machine interfaces (HMIs ), service point terminals for data collection, machine vision, applications for testing, measuring, tracking, monitoring, etc.

Now look at the object itself. It consists of two blocks of printed circuit boards:
- computing module 8168 (above);
- daughter board expansion I / O (bottom).
Due to the large number of components, we turn our attention only to especially important ones.

The figure above shows the computing module 8168 with the following components indicated:
1. and
2. are the switches â„–3 (SW3) and â„–4 (SW4), respectively.

Standardly, the board is loaded from NAND flash memory (however, there are many other modes, for example, booting from an SD card), therefore switches No. 3 and No. 4 were set to the desired position: SW3 [9: 0] = ”0000010010” and SW4 [1: 0] = ”10” [NAND / SPI].
3. Serial port (COM port).
4. HDMI port.
5. Ethernet port.
6. USB port.
7. Component video connector.
8. Slot for SD card.
9. Power socket.
10. Power switch.
11. Microprocessor DM8168 (emulates AM3894 and C6A816).
Functional diagram:

Characteristics:
• VLIW-processor C674x DSP (up to 1 GHz, command type - with fixed and floating point).
• ARM Cortex-A8 RISC processor (up to 1.2 GHz).
• SGX530 3D Graphics Crusher.
• High-definition video processing subsystem (HDVPSS).
• 3 programmable high-definition video processing coprocessor (HDVICP2) responsible for capturing, encoding, decoding and analyzing multiple video streams, as well as supporting the standards H.264, MPEG4, H263, VC1 / RTV, AVS, RV10, ON2, JPEG, MPEG2, Divx.
• Wide range of peripheral modules:
- 2 Gigabit Ethernet channels;
- 2 PCI Express channels;
- 2 SATA channels with integrated physical layer;
- 2 USB 2.0 channels with an integrated physical layer;
- interfaces DDR3, MMC / SD, HDMI and DVI.
For further work, we connected to components 3, 5, 9 and set up switches 1, 2, 10.
2. Description of the C6Accel framework
C6Accel is a completely free software development tool from Texas Instruments (TI). It is designed to simplify the development of DSP code on TI's dual-core heterogeneous SoC processors, namely for ARM + DSP devices that run Linux on ARM and contain a DSP from the C6000 family.
2.1. What does C6Accel consist of?
C6EZAccel consists of digital signal processing algorithms that follow the interface of algorithms called
XDAIS (eXpressDsp Algorithm Interoperability Standard). TI also provides a framework called the
Codec Engine , which allows you to efficiently execute algorithms written using the XDAIS interface. TI supplies all of its codecs as part of its SoC software and recommends using the Codec Engine. C6EZAccel also consists of a library on the ARM side, which is an add-on to the Codec Engine, which provides APIs (application programming interfaces). And they, in turn, allow the application code on the ARM side to trigger the execution of XDAIS algorithms on the DSP. This library contains cache management, address translation, parameter passing and error handling from an application running on ARM.
2.2. How does C6Accel work?
The ARM application code (or middleware that uses it) calls C6Accel. It uses a library of APIs and / or Codec Engine, compatible with iUniversal APIs, which, like VISA APIs, are used to call Audio / Video / Speech codecs. Then these APIs scan the Codec Engine interface and invoke the C6Accel algorithm on the DSP, which identifies the function call and enables the corresponding functionality on the DSP using the parameters passed from the application.

3. Using EZSDK and C6Accel
Enough theory, let's get down to practice. EZSDK 05.05.02.00 is supported only in
Ubuntu 10.04 LTS 32-bit or
Ubuntu 11.10 32-bit . Therefore, those who do not have one of these operating systems installed (of course, we worked under a newer version) will have to use a virtual machine, for example, VirtualBox. Instructions for installing and configuring it are available
here .
Further, the following notation is used:
- host $ - command to execute on the host;
- target # - a command to execute on the target OS.
3.1. Installation and assembly of EZSDK
Before you start working with EZSDK, download and install the
CodeSourcerychain 2009q-203 C compiler. Just unpack the archive into your home directory.
Download
EZSDK 05.05.02.00 and execute:
host $ sudo ./ezsdk_dm816x-evm_5_05_02_00_setuplinux
The installer will start. Specify the location of the CodeSourcery Toolchain, i.e. / home /% username% / arm-2009q1 / bin, and the path to install the EZSDK is / home /% username% / ezsdk.
The developers of this software took care of us and made an interactive script (one of the reasons for strict binding to the OC version):
host $ export EZSDK="${HOME}/ezsdk" host $ sudo ${EZSDK}/setup.sh
The script will install the necessary packages and ask for clarification:
- The installation path of the target file system is / home /% username% / targetfs;
- tftp root directory path is / tftpboot;
- the serial port path is / dev / ttyUSB0 (for connecting via USB) or / dev / ttyS0 (for connecting via COM-port);
- ip-address of the host machine - each has its own (for example, we have 10.54.4.44);
- the location of the Linux kernel is the 1st of the suggested list, i.e. TFTP;
- location of the root file system - the 1st of the proposed list, i.e. NFS;
- The name of the kernel image loaded from TFTP is uImage-dm816x-evm.bin;
- whether to create a script for minicom - agree;
- whether to run the created script now - refuse.
Correct this script: open it in a text editor and replace the text "mem = 364M @ 0x80000000 mem = 320M @ 0x9FC00000" with "mem = 364M", since in the future it will be impossible to load the necessary kernel modules.
Next, to perform any operations on the board, you need to run minicom with the settings specified in the script with the command
host $ minicom -S setup_uimage-tftp_fs-nfs.minicom
Next you need to restart the board.
Now when assembling EZSDK there is a problem due to the absence of some component. You can fix it by unpacking the
8272.pcie.tar.gz archive to the / home /% username% / ezsdk / example-applications directory.
Finally we will build EZSDK teams.
host $ cd ${HOME}/ezsdk host $ sudo make all host $ sudo make install
3.2. Installation and assembly of C6Accel
Download
C6Accel 2.01.00.11 and follow:
host $ sudo ./c6accel_2_01_00_11_Linux-x86_Setup.bin
Specify the installation path / home /% username% / c6accel.
The SYS / BIOS real-time operating system is part of the EZSDK, but versions later than 6.32.02.09 do not support Real Time Data eXchange (RTDX), which is required when building C6Accel. Therefore, we will install
SYS / BIOS 6.32.02.09 specifically for C6Accel:
host $ sudo ./bios_setuplinux_6_32_02_39.bin
Specify the installation path / home /% username% / c6accel / bios_6_32_02_39.
Fix the paths in the Rules.make file in / home /% username% / c6accel to the following:
DVSDK_INSTALL_DIR=$(HOME)/ezsdk TARGETFS_INSTALL_DIR = $(HOME)/targetfs C6ACCEL_INSTALL_DIR=$(HOME)/c6accel BIOS_INSTALL_DIR = $(HOME)/c6accel/bios_6_32_02_39 DSPDEVKIT_INSTALL_DIR= $(DVSDK_INSTALL_DIR)/dsp-devkit LINUXDEVKIT_INSTALL_DIR = $(DVSDK_INSTALL_DIR)/linux-devkit PLATFORM = dm816x-evm
And, in the end, we will assemble the C6Accel teams:
host $ cd ${HOME}/c6accel host $ sudo make all host $ sudo make install
3.3. DSP Test Execution
It's nice that C6Accel contains an example to test the execution of code on a DSP processor. Run the script to load the cmem and dsplink modules (these are the ARM and DSP bundle libraries with which CodecEngine is loaded) and run the testing application.
target
Hooray! The messages in the console show that everything is in order and nothing is broken.************************************************** ****************************
Sample application for testing kernels in C6Accel started.
************************************************** ****************************
CERuntime complete
C6Accel handle created
-
Test for Vision / Analytics functions in C6Accel:
-
Testing the function: VLIB_histogram_1D_dU8 ...
VLIB_histogram_1D_U8 passed the test!
Testing the function: VLIB_histogram_1D_U16 ...
VLIB_histogram_1D_U16 passed the test!
Testing the function: VLIB_histogram_nD_U16 ...
VLIB_histogram_nD_U16 passed the test!
Testing the function: VLIB_weightedHistogram_1D_U8 ...
VLIB_weightedHistogram_1D_U8 passed the test!
Testing the function: VLIB_weightedHistogram_nD_U16 ...
VLIB_weightedHistogram_nD_U16 failed the test!
VLIB_unpackMask32 passed the test!
VLIB_packMask32 passed the test!
VLIB_subtractBackGroundS16 passed the test!
VLIB_subtractBackGroundS32 passed the test!
Testing the function: VLIB_extractLumaFromUYUV ...
C6accel test for VLIB_extractLumaFromUYUV passed the test!
Testing the function: VLIB_convertUYVYsemipl_to_YUVpl ...
VLIB_convertUYVYsemipl_to_YUVpl passed the test!
Testing the function: VLIB_convertUYVYpl_to_YUVint ...
VLIB_convertUYVYpl_to_YUVint passed the test!
Testing the function: VLIB_convertUYVYint_to_YUVpl ...
VLIB_convertUYVYint_to_YUVpl passed the test!
Testing the function: VLIB_convertUYVYint_to_RGBpl ...
VLIB_convertUYVYint_to_RGBpl passed the test!
Testing the function: VLIB_ConvertUYVYint_to_YUV420pl ...
VLIB_ConvertUYVYint_to_YUV420pl passed the test!
Testing the function: VLIB_convertUYVYint_to_LABpl ...
VLIB_convertUYVYint_to_LABpl passed the test!
Testing the function: VLIB_convertUYVYint_to_HSLpl ...
VLIB_convertUYVYint_to_HSLpl passed the test!
Testing the function: VLIB_convertUYVYint_to_LABpl_LUT ...
Completed initialization.
VLIB_convertUYVYint_to_LABpl2 passed the test!
Testing VLIB_harrisScore_7x7 ...
VLIB_harrisScore_7x7 passed the test!
Initializing Legendre Polynomial
Computing Legendre Moments
Testing the function: VLIB_legendreMoments ...
VLIB_legendreMoments passed the test!
Testing the function: VLIB_normalFlow_16 ...
VLIB_normalFlow_16 passed the test!
Testing the function: VLIB_kalmanFilter_4x6 functions ...
VLIB_kalmanFilter_ VLIB_recursiveFilterHoriz1stOrderS16 ...
VLIB_recursiveFilterHoriz1stOrderS16 passed the test!
Testing VLIB_recursiveFilterVert1stOrader.der ...
VLIB_recursiveFilterVert1stOrder passed the test!
Testing VLIB_recursiveFilterVert1stOrderS16 ...
VLIB_recursiveFilterVert1stOrderS16 passed the test!
Testing the function: VLIB_bhattacharyaDistance_U32 ...
VLIB_bhattacharyaDistance_U32 passed the test!
Testing the function: VLIB_L1DistanceS16 ...
VLIB_L1DistanceS16 functions passed the test
VLIB_dilate_bin_mask passed the test!
VLIB_dilate_bin_square passed the test!
VLIB_dilate_bin_cross passed the test!
VLIB_erode_bin_mask passed the test!
VLIB_erode_bin_square passed the test!
VLIB_erode_bin_cross passed the test!
Testing VLIB_trackFeaturesLucasKanade_7x7 ...
VLIB_trackFeaturesLucasKanade_7x7 passed the test!
VLIB Canny functions Test results:
IMG_conv_7x7: passed the test!
VLIB_xyGradient: passed the test!
VLIB_nonMaximumSuppressionCanny: passed the test!
VLIB_doublethresholding: passed the test!
VLIB_edgeRelaxation: passed the test!
Calling Chained Canny API:
Chained Canny edge detection function failed the test!
Testing the function: VLIB_integralImage8 ...
VLIB_integralImage8 passed the test!
Testing the function: VLIB_integralImage16 ...
VLIB_integralImage16 passed the test!
Testing the function: VLIB_imagePyramid8 ...
VLIB_imagePyramid8 passed the test!
Testing the function: VLIB_imagePyramid16 ...
VLIB_imagePyramid16 passed the test!
Testing the function: VLIB_gauss5x5PyramidKernel_8 ...
VLIB_gauss5x5PyramidKernel_8 passed the test!
Testing the function: VLIB_gauss5x5PyramidKernel_16 ...
VLIB_gauss5x5PyramidKernel_16 passed the test!
Testing the function: VLIB_gradientH5x5PyramidKernel_8 ...
VLIB_gradientH5x5PyramidKernel_8 passed the test!
Testing the function: VLIB_gradientV5x5PyramidKernel_8 ...
VLIB_gradientV5x5PyramidKernel_8 passed the test!
VLIB_initMeanWithLumaS16 passed the test!
VLIB_updateEWRMeanS16 passed the test!
VLIB_initMeanWithLumaS32 passed the test!
VLIB_updateEWRMeanS32 passed the test!
VLIB_initVarWithConstS32 passed the test!
VLIB_updateEWRVarianceS32 passed the test!
VLIB_initVarWithConstS16 passed the test!
VLIB_updateEWRVarianceS16 passed the test!
VLIB_updateUWRMeanS16 passed the test!
VLIB_updateUWRVarianceS16 passed the test!
-
Test for Image processing functions in C6Accel:
-
Tests for Histogram functions successful
Test for Median Filtering functions successful
Tests for Convolution functions successful
Tests for Correlation functions successful
Tests for Sobel Filter successful
Test for Image multiplication functions successful
Tests for image addition functions successful
Tests for Image substraction functions successful
Tests for Color Space Conversion functions successful
C6accel_IMG_ycbcr422pl_to_ycbcr422sp () successful
C6accel_IMG_ycbcr422sp_to_ycbcr422ile () successful
C6accel_IMG_ycbcr422sp_to_ycbcr420pl successful
-
C6Accel Test for Fixed Point
-
Tests for FFT functions successful
Tests for Invers FFT functions successful
Test for Auto Correlation function successful
Tests for DoT
Tests for Matrix multiplication successful
Tests for FIR Filtering functions successful
Test for IIR Filter successful
-
Test for Fixed point Math functions in C6Accel
-
Test for Arithmetic functions
Tests for Conversion RTS functions successful
Tests for IQmath Conversion functions successful
Tests for Mathematical IQmath functions successful
Tests for Arithmetic IQmath functions successful
Tests for Trignometric IQmath functions successful
-
Test for Floating Point Math Functions in C6Accel
-
Test for Arithmetic functions
Tests for Conversion RTS functions successful
Tests for Floating point
Tests for Floating Point RTS
-
Test for Floating Point Signal processing Functions in C6accel
-
Test for Floating point DSP FFT function successful
Test for Floating point DSP vector multiplication successful
Test for Floating point DSP vector reciprocal function successful
Test for Floating point DSP vector reciprocal function successful
Test for Floating point DSP vector weighted sum function successful
Test for float point
Tests for Floating point
Tests for Floating point DSP Matrix Multiplication functions successful
Test for Floating point DSP matrix transpose function successful
Tests for Floating point DSP autocorrelation functions successful
Tests for Floating point
Test for Floating point DSP FIR filter successful
Test for Floating point DSP Inverse FFT function successful
Test for Floating point DSP BIQUAD Filter successful
Test for Floating point to Double precision successful
Test for complex
-> Asynchronous Calls
Tests for FFT functions successful
Tests for Sobel Filter successful
Test for Arithmetic functions
************************************************** ****************************
All tests done.
************************************************** ****************************
4. Comparison test of OpenCV functions on ARM and DSP
OpenCV (Open Source Computer Vision Library) is a library of computer vision, image processing and general-purpose numerical algorithms with an open source code. The library is written in C and C ++, but it is supported by Java, Python, etc. It works under Linux, Windows and Mac OS X.
OpenCV is an easy-to-use library of computer vision with over 500 functions that can work in real time. They cover many areas, such as quality control in manufacturing, security systems, image processing in medicine, user interfaces, stereoscopic vision and robotics.
Since the OpenCV library is portable software, it can be compiled on most systems with a C / C ++ compiler. OpenCV is successfully used on ARM, MIPS, Xscale and other processors.
It is worth noting that in C6Accel 2.01.00.11 there are not all OpenCV functions, but only 50.
4.1. Installing and building OpenCV
Follow the
instructions to build
OpenCV 2.2.0 under the ARM platform. When executing them, remember that CodeSourcery Toolchain is already installed.
Copy the shared libraries of OpenCV to the target file system.
host $ cp ${HOME}/build/lib/* ${HOME}/targetfs/usr/lib
4.2. Build and run the test
The first problem encountered was an error when loading images. For some reason, they do not like pictures with the png extension, the error is localized in the cvCreateImage function. Ok, change to another extension, for example, bmp. This can be done like this:
host $ cd ${HOME}/c6accel/soc/app/c6accel_opencv_testapp/opencv_images host $ for fname in *.png; do convert "$fname" "$fname.bmp"; done
And of course, let's not forget to change the extensions in the source code. In the appMain.c and c6accel_opencv_testfxns.c files located in the / home /% username% / c6accel / soc / app / c6accel_opencv_testapp directory, replace all occurrences of the “.png” line with “.png.bmp”, the text editor gedit is convenient for this purpose Ctrl + H.
The second problem turned out to be an error when executing the C6Accel_test_Matchshapes function and the cvFindCornerSubPix function failure (due to the known bug
http://code.opencv.org/issues/963 ).
In the appMain.c file, comment out the line with the function C6Accel_test_Matchshapes. And in the file c6accel_opencv_testfxns.c we comment out the text from the line
//cvFindCorner SubPix issue to be resolved
and inclusive up to the line
printf("Called ARM FindCornerSubPix function (time: %f ms)\n", t_algo / 1000.0 / n);
Finally, build and run the test application.
host $ cd ${HOME}/c6accel host $ sudo make opencv_app host $ sudo make opencv_app_install target
Hooray! After much suffering, everything worked.
The result of the application is summarized in the table.OpenCV function
| Average time fulfillment on ARM, ms
| Average time fulfillment on DSP, ms
| Mark about choosing DSP
| The difference between the performance results on ARM and DSP (distance in space L2, unless otherwise noted)
|
cvCanny
| 43.218000
| 42.804000
| +
| 0.000000
|
get Affine transform matrix
| 0.557000
| 0.411000
| +
| 0.000000
|
Affine transform
| 46.325000
| 36.554000
| +
| 7926.342031
|
2D Rotation Matrix
| 0.314000
| 0.378000
| -
| 0.000000
|
Rotation using Affine
| 55.380000
| 40.985000
| +
| 774.451419
|
cvIntegral
| 6.537000
| 8.232000
| -
| 0.000000
|
cvMinMaxLoc
| 3.083000
| 1.660000
| +
| The results are the same.
|
cvNorm
| 1.881000
| 1.336000
| +
| 0.000000
|
Adds
| 9.573000
| 12.434000
| -
| 0.000000
|
Absdiff
| 9.036000
| 14.349000
| -
| 0.000000
|
Absdiffs
| 10.555000
| 12.670000
| -
| 0.000000
|
Add
| 8.931000
| 15.852000
| -
| 0.000000
|
cvDilate
| 3.182000
| 1.282000
| +
| 0.000000
|
cvErode
| 3.093000
| 1.281000
| +
| 0.000000
|
cvLaplace
| 180.171000
| 11.968000
| +
| 0.000000
|
cvPyrDown
| 4.265000
| 4,917,000
| -
| 0.000000
|
cvFilter2D
| 519.593000
| 21.259000
| +
| 3651.030129
|
cvFindContours
| 11.915000
| 17.753000
| -
| The results are the same.
|
Equalizehist
| 5.809000
| 8.921000
| -
| 0.000000
|
SetZero
| 0.634000
| 3.871000
| -
| 132898.252336
|
Rectangle
| 5.847000
| 1,307,000
| +
|
Circle
| 3.652000
| 3.323000
| +
|
Flip
| 12.372000
| 12.071000
| +
| 0.000000
|
Copy
| 2.479000
| 6.072000
| -
|
Sobel
| 5.463000
| 7.197000
| -
| 0.000000
|
Convertscale
| 5,139,000
| 6.044000
| -
|
Adaptive threshold
| 89.986000
| 33.231000
| +
| 0.000000
|
cvMulSpectrums
| 91.865000
| 15.221000
| +
| 0.086427
|
cvDFT
| 597.131000
| 99.666000
| +
|
cvNormalize
| 57.318000
| 13.576000
| +
|
cvSmooth
| 109.345000
| 57.467000
| +
| 1771.619316
|
HoughLines2D
| 2314.028000
| 634.262000
| +
| 46306.904723
|
cvCornerHarris
| 653.550000
| 168.213000
| +
| 0.136828
|
cvCornerEigenValsAndVecs
| 3430.892000
| 870.525000
| +
| 350.751214
|
cvCornerMinEigenVal
| 1384.182000
| 1.155000
| +
| -
|
cvMulSpectrums
| 91.711000
| 15.323000
| +
| 0.086427
|
cvDFT
| 597.707000
| 99.412000
| +
|
cvNormalize
| 58.782000
| 13.751000
| +
|
GoodFeaturesToTrack
| 1259.277000
| 279.508000
| +
| -
|
FindCornerSubPix
| -
| 449.029000
|
|
cvMatchTemplate
| 1576.569000
| 221.753000
| +
| 3.741657
|
cvThreshold
| 2.182000
| 4.442000
| -
| 0.000000
|
cvBoundingRect
| 0.036000
| 0.302000
| -
| The difference between the resulting areas - 0.000000
|
cvDrawContour
| 0.030000
| 0.989000
| -
|
cvContourArea
| 0.049000
| 0.231000
| -
|
Plotting
| -
| 183.243000
|
|
Cvtcolor
| 16.283000
| 13.804000
| +
| 0.000000
|
Resize
| 18.357000
| 17.617000
| +
|
cvCalcOpticalFlowPyrLK
| 2472.993000
| 146.874000
| +
| Both results consist of 445 features.
|
HaarDetectObjects
| 2522.499000
| 460.350000
| +
| Both results consist of 5 elements.
ARM:
0: 46, 48 (42x42)
1: 174, 48 (37x37)
2: 240, 51 (38x38)
3: 110, 48 (40x40)
4: 92, 37 (131x131)
DSP:
0 47, 49 (40x40)
1: 175, 49 (35x35)
2: 240, 52 (37x37)
3:17, 198 (34x34)
4: 110, 48 (38x38)
|
Based on the results, conclusions can be drawn:
- Some functions have a difference between the results of execution. The architecture of signal processors, as compared with general-purpose microprocessors, has some peculiarities associated with the desire to speed up the execution of typical DSP tasks. DSPs are focused, first of all, on the multiple execution of multiplication with the calculation on the fly of addresses of the multiplied elements of the arrays. An algorithm implemented in various basic operations can produce different results.
- Not all functions work faster on DSP than on ARM. One can notice a pattern: these are functions of basic operations on matrices or functions that consist mainly of them. Such “bad” functions can be performed on the ARM, while others are carried on the DSP. In the event of an overload of the ARM processor, the use of some “bad” functions on the DSP can be tolerated.
- When using the "good" function on the DSP, you can achieve improvements by several times and even more than an order of magnitude. These are usually the most time consuming functions.
Thus, balancing between speed, processor load and execution results can significantly optimize application performance.
Useful links:
- DM816x / C6A816x / AM389x board
- Download DM816x
- EZSDK User Guide
- C6Accel framework
- A good book on OpenCV + partial translation into Russian
- Article on the use of OpenCV on ARM and DSP processors