Difference between revisions of "EE586L/CCSv4 FAQ"

From WikiBiron
(Log on DSK)
 
(40 intermediate revisions by 2 users not shown)
Line 4: Line 4:
  
 
As this is a new and completely different version of CCS the TAs are still learning the software as well. If you don't see your question answered here please email the TAs who will be glad to help and add your question to the pool of knowledge.
 
As this is a new and completely different version of CCS the TAs are still learning the software as well. If you don't see your question answered here please email the TAs who will be glad to help and add your question to the pool of knowledge.
 +
 +
== Install ccsv4 ==
 +
 +
You can download CCSv4 here:
 +
http://processors.wiki.ti.com/index.php/Download_CCS
 +
or if you prefer CCSv5 is already available, and is Linux compatible. However, the TAs will not be responsible for supporting CCSv5. You can download CCSv5 here:
 +
http://processors.wiki.ti.com/index.php/Category:Code_Composer_Studio_v5
 +
 +
You can refer to the instruction of installing CCSv4 here: http://biron.usc.edu/~sungwonl/EE586/CCSv4_Installation_Instruction.pdf
  
 
== Importing Legacy CCS v3.x Projects ==
 
== Importing Legacy CCS v3.x Projects ==
Line 63: Line 72:
 
*** '''Constant access model''' - Set to Far
 
*** '''Constant access model''' - Set to Far
 
*** '''Data access model''' - Set to Far
 
*** '''Data access model''' - Set to Far
 +
 +
== License Server ==
 +
For Code Composer to function properly you must be using a licensed version. In the lab we use a license server to handle the licensing of our PCs. If a PC you are working with becomes unlicensed do the following to re-activate the connection to the license server.
 +
* In CCS select '''Help->Licensing Options...'''
 +
** Then mark the box '''Activate a License'''
 +
** In Step 2 - Install a License File, select '''Specify a License Server''' and use the address: sipi-dsp-11.usc.edu and port: 57566 (Spring 2013 only)
  
 
== Using the Debugger ==
 
== Using the Debugger ==
  
 
== GEL Files/Sliders ==
 
== GEL Files/Sliders ==
In CCSv4 the GEL Files/Sliders operate differently than in previous iterations.  
+
*For more details, check this pointer: http://processors.wiki.ti.com/index.php/FAQ_-_CCSv4#GEL
 +
*In CCSv4 the GEL Files/Sliders operate differently than in previous iterations.  
 
* Load GEL
 
* Load GEL
 
** While debugging select '''Tools->GEL File''' to load a GEL file for the current debugging session
 
** While debugging select '''Tools->GEL File''' to load a GEL file for the current debugging session
Line 83: Line 99:
 
Other potential uses of breakpoints include:
 
Other potential uses of breakpoints include:
 
* '''Update View''' - can be used to refresh a Graph or Image automatically
 
* '''Update View''' - can be used to refresh a Graph or Image automatically
 +
 +
== SVN Instruction ==
 +
This only covers SVN using Code Composer. However, you are free to use other clients on your laptops.
 +
By default, CCSV is not delivered with SVN plugin thus you need to install it before use: refer to http://biron.usc.edu/~sungwonl/EE586/SVN_Installation_2012.pdf
 +
To access SVN server, you first need to get an ID/passwd from TAs. Each group will be assigned a group folder (Group_xx), user name (Group_xx) and you select a password.
 +
You can refer to details: http://biron.usc.edu/~sungwonl/EE586/SVNinstruction.pdf
 +
 +
== SYS/BIOS (BIOS 6.34) ==
 +
User's Guide for SYS/BIOS v6.34 : http://www.ti.com/lit/ug/spruex3l/spruex3l.pdf
 +
 +
== Log on DSK ==
 +
* You can use printf-like functions to leave logs from DSK board.
 +
* To exploit the feature, you need to use SYS/BIOS (BIOS 6.xx) and enable 'Realtime analysis' in the SYS/BIOS setup.
 +
* Please read the instruction:  http://biron.usc.edu/~sungwonl/EE586/BIOS_Bottleneck_Analysis.pdf
 +
* For more details about the log functions, refer to User's guide above and to http://rtsc.eclipse.org/cdoc-tip/xdc/runtime/Log.html#warning
 +
 +
  #include <xdc/cfg/global.h>
 +
  #include <xdc/runtime/Log.h>
 +
  int xx = 1, yy = 100;
 +
  // refer to the above link to see more functions
 +
  Log_info0("Main Started");  // no argument
 +
  Log_info1("xx = %d", xx);    // 1 argument
 +
  Log_info2("xx = %d, yy=%d", xx, yy); // 2 arguments
 +
 +
== Measure CPU cycles in ccsv4 ==
 +
* Refer to a document from TI: http://processors.wiki.ti.com/index.php/Profile_clock_in_CCS
 +
* As discussed in the document, we need to setup breakpoints at the beginning and the end of the block that you want to profile.
 +
* If you choose automatic reset option in Target->Clock->Setup of debug mode, the clock is reset every time it breaks.
 +
* If you want to convert the cycles to time, divide the number of cycles you measured with CPU clock speed of the board you are using.
 +
** For example, for Davinci board with 600 MHz CPU,  time (seconds) = (# of clock cycles) / ( 6 * 10^8).
 +
** FYI, DSK6416 is running with 1 GHz and DSK6713 with 225 MHz.
 +
 +
== Optimization ==
 +
* Measure running time in CPU cycles
 +
** Use a function TIMER_getCount() like in example below.
 +
*** The reason why you multiply by 8 is because the maximum resolution of the timer in '''C6416''' is 8 CPU cycles in this example.
 +
*** If you use '''C6713''', it should be 4. For details, refer to [http://focus.ti.com/lit/an/spra887/spra887.pdf] for C6416 and [http://focus.ti.com/lit/an/spra947a/spra947a.pdf] for C6713.
 +
 +
  include <csl_timer.h>
 +
  // Configure timer
 +
  hTimer = TIMER_open(TIMER_DEVANY,0);
 +
  TIMER_configArgs(hTimer, 0x000002C0, 0xFFFFFFFF, 0x00000000); 
 +
  start    = TIMER_getCount(hTimer);    // called twice to avoid L1D miss.
 +
  start    = TIMER_getCount(hTimer);
 +
  stop    = TIMER_getCount(hTimer);
 +
  overhead = stop - start;
 +
  start = TIMER_getCount(hTimer); // begin "profile area"
 +
  '''foo(); // Any function / routine you want to measure '''
 +
  stop = TIMER_getCount(hTimer); // end "profile area"
 +
  t = (stop-start-overhead) * '''8''';
 +
  printf("# cycles to run foo(): %d\n", t);
 +
 +
* We strongly recommend to use EDMA for the transmission of data from video daughter card to DSK board
 +
** Experiment result (loopback examples) : Comparison in terms of frames per seconds
 +
*** DSK6713 / VM3224K2(new video daughtercard) / '''cam2lcd2    ''' : 7.5 frames / sec
 +
*** DSK6713 / VM3224K2(new video daughtercard) / '''cam2lcd3_EDMA''' : 10 frames / sec
 +
*** DSK6713 / VM3224K2(new video daughtercard) / '''cam2lcd3_QDMA''' : 10 frames / sec
 +
** We havn't tested with DSK 6416 and older video daughter card but we expect similar performance gain of EDMA.
 +
 +
 +
== Examples ==
 +
The following codes are provided as one of examples used as assignments for EE586L at University of Southern California. They are skeleton codes so that they don't fully function without appropriate addition to it. We make no representations or warranties of any kind concerning the safety, suitability, lack of viruses, inaccuracies, typographical errors, or other harmful components of these examples. There are inherent dangers in the use of any software, and you are solely responsible for determining whether these codes are compatible with your equipment and other software installed on your equipment. You are also solely responsible for the protection of your equipment and backup of your data, and we will not be liable for any damages you may suffer in connection with using, modifying, or distributing these examples.
 +
 +
* DSK 6713
 +
** Ring Modulation [http://biron.usc.edu/~sungwonl/EE586/RingModLab_New.zip]
 +
** Audio Noise Template [http://biron.usc.edu/~sungwonl/EE586/Audio_Noise_Template.zip]
  
 
== DSP Lab Equipment ==
 
== DSP Lab Equipment ==
Line 88: Line 170:
  
 
* DSP Boards
 
* DSP Boards
** 12 6713
+
** 10 6713
** 2 6416
+
** 8 6416 / 6416T
** 3 6416T (1 Ghz Processor)
+
** 8 6437 Davinci
  
 
* Daughter Cards
 
* Daughter Cards
** 6 - ND Tech Video Daughtercard
+
** 5 - ND Tech Video Daughtercard
 
*** Analog Video Input (composite)/ LCD Display Output
 
*** Analog Video Input (composite)/ LCD Display Output
 
*** Works with 6713 and 6416
 
*** Works with 6713 and 6416
 
*** [http://www.nd-tech.com/web/main.html?menu=product&sub=sub9 User Manual]
 
*** [http://www.nd-tech.com/web/main.html?menu=product&sub=sub9 User Manual]
** 4 - Old Video Daughtercard
+
** 2 - Old Video Daughtercard
 
*** Composite and S-Video Input/ Composite and S-Video Output
 
*** Composite and S-Video Input/ Composite and S-Video Output
 
*** Works with 6416 only
 
*** Works with 6416 only
Line 123: Line 205:
  
  
== Optimization ==  
+
== eInfoChips Video Daughtercard ==
* Measure running time in CPU cycles
+
* If you have a problem with horizontal banding when using the eInfoChips video daughtercard (the one without the LCD) you have to modify the values passed to the configure the EMIF interface function. The values (the 0x0? number) below are the correct values, and the values in the sample code are incorrect. The correct values should match the value given in the comment.  
** Use a function TIMER_getCount() like in example below.
+
 
*** The reason why you multiply by 8 is because the maximum resolution of the timer in '''C6416''' is 8 CPU cycles in this example. If you use '''C6713''', it should be 4. For details, refer to [http://focus.ti.com/lit/an/spra887/spra887.pdf].
+
    /* Configure the EMIF */
 +
    //set read/write setup, strob and hold to 6, 4 and 1
 +
    EMIFA_RSET(CECTL2,
 +
    EMIFA_CECTL_RMK(
 +
    EMIFA_CECTL_WRSETUP_OF(0x06), // Write Setup width: 6
 +
    EMIFA_CECTL_WRSTRB_OF(0x04),  // Write Strobe width: 4
 +
    EMIFA_CECTL_WRHLD_OF(0x01),  // Write Hold width: 1
 +
    EMIFA_CECTL_RDSETUP_OF(0x06), // Read Setup width: 6
 +
    EMIFA_CECTL_TA_OF(0x03),      // Turn-around Time: 3 (default)
 +
    EMIFA_CECTL_RDSTRB_OF(0x04),  // Read Strobe width: 4
 +
    EMIFA_CECTL_MTYPE_ASYNC32,    // Memory Type: Async 32 bit wide
 +
    EMIFA_CECTL_WRHLDMSB_OF(0x00),// Write Hold MSB
 +
    EMIFA_CECTL_RDHLD_OF(0x01)    // Read Hold width: 1
 +
    ));
 +
 
 +
* If it does not work even after you change EMIF interface function above, then change Runtime Model Options in properties of your project. Go to C/C++ Build -> C6000 Compiler -> Runtime Model Options.
 +
** Set '''Const access model''' and '''Data access model''' as '''far'''
 +
 
 +
* YCrCb / Frame structure
 +
** For video with Rx by Ry resolution, each frame is represented by Rx * Ry /2 pixels because it's interlaced.
 +
** For color representation, Y component is expressed by 16 bits, Cr and Cb by 8 bits each. But, in the implementation of eInfoChips Video Daughtercard, each component of neighboring 2 pixels is represented by one variable which has twice larger bits in the constecated form. For example, Y components for 2 adjacent pixels are implemented by one 32bit (unsigned int) variable.  
 +
** Example (SWLoopBack) : Capture video then play it on external display
  
  // Configure timer
+
    /* Example of SWLoopBack */
  hTimer = TIMER_open(TIMER_DEVANY,0);  
+
    // Define pointers to YCrCb's of encoder and decoder
  TIMER_configArgs(hTimer, 0x000002C0, 0xFFFFFFFF, 0x00000000)
+
    unsigned int *pDstY = NULL, *pSrcY = NULL;
  start    = TIMER_getCount(hTimer);   // called twice to avoid L1D miss.
+
    unsigned short *pDstCb = NULL, *pSrcCb = NULL;
  start    = TIMER_getCount(hTimer);  
+
    unsigned short *pDstCr = NULL, *pSrcCr = NULL;
  stop    = TIMER_getCount(hTimer);  
+
    // in the main()
  overhead = stop - start;
+
    while(1) {
  start = TIMER_getCount(hTimer); // begin "profile area"
+
        // Get the pointer to the Frame Captured
  '''foo(); // Any function / routine you want to measure '''
+
        pDecFrame = vDecGetFrame();
  stop = TIMER_getCount(hTimer); // end "profile area"
+
        // Get pointer to Y components
  t = (stop-start-overhead) * '''8''';
+
        pDstY = (unsigned int*)(pEncFrame->y);
  printf("# cycles to run foo(): %d\n", t);
+
        pSrcY = (unsigned int*)(pDecFrame->y);
 +
        // Get pointer to Cb components
 +
        pDstCb = (unsigned short*)(pEncFrame->cb);
 +
        pSrcCb = (unsigned short*)(pDecFrame->cb);
 +
        // Get pointer to Cr components
 +
        pDstCr = (unsigned short*)(pEncFrame->cr);
 +
        pSrcCr = (unsigned short*)(pDecFrame->cr);
 +
        // Divide by 4 to scan all the pixels in a frame
 +
        // Why 4 ? 
 +
        // because frames are interlaced and one data point represents 2 pixels of the frame
 +
        frameWords = (352*288)/4;
 +
        // Scan all the pixels in a frame
 +
        for ( i=0; i<frameWords; i++) {
 +
            // Copy values from decoder to encoder
 +
            *pDstY = *pSrcY;
 +
            *pDstCb = *pSrcCb;
 +
            *pDstCr = *pSrcCr;
 +
            // Increase pointers by one
 +
            pDstY++; pSrcY++;
 +
            pDstCb++; pSrcCb++;
 +
            pDstCr++; pSrcCr++;
 +
        }
 +
        // Send a Frame to Encoder
 +
        pEncFrame = vEncSendFrame( pEncFrame);
 +
    }

Latest revision as of 15:56, 15 April 2013

Code Composer Studio v4 Frequently Asked Questions

Below are solutions to some of the commonly encountered problems with CCSv4.

As this is a new and completely different version of CCS the TAs are still learning the software as well. If you don't see your question answered here please email the TAs who will be glad to help and add your question to the pool of knowledge.

Install ccsv4

You can download CCSv4 here: http://processors.wiki.ti.com/index.php/Download_CCS or if you prefer CCSv5 is already available, and is Linux compatible. However, the TAs will not be responsible for supporting CCSv5. You can download CCSv5 here: http://processors.wiki.ti.com/index.php/Category:Code_Composer_Studio_v5

You can refer to the instruction of installing CCSv4 here: http://biron.usc.edu/~sungwonl/EE586/CCSv4_Installation_Instruction.pdf

Importing Legacy CCS v3.x Projects

The textbook provides many example projects showing the functionality of the board. However, these examples were written for a previous iteration of Code Composer Studio.

Follow these steps to import legacy projects and convert them to the project format of CCSv4:

  • Launch CCS and select a workspace.
    • Workspaces are used to store your personal projects, so having an individual workspace prevents other groups from modifying your projects.
    • Create a workspace other than the default, such as, EE586_Group01 or your name.
  • Select Project -> Import Legacy CCSv3.3 Project
    • In the Dialog box that appears, browse for the project file that you would like to import and select the Copy projects into workspace radio button. Click Next
    • At the next screen select the default Code Generation Tools (already selected). Click Next.
    • On the Enable DSP/BIOS Tools screen select Automatically determine DSP/BIOSv5.x support enablement.
    • On the Set Advance Options screen do not check the box for using a common root.

Project Properties

Below are the common project property settings used in the book examples. If you are having compiling/linking issues check these settings.

Access the project properties by selecting Project->Properties. All of the following settings are located under the C/C++ Build tab located on left side of the Properties dialog box, and under the Configuration Settings->Tool Settings tab in the center of the dialog box.

  • C6000 Compiler
    • Basic Options:
      • Target Processor Version - should be 6700 or 6400 for the C6713 and C6416 boards, respectively
    • Predefined Symbols:
      • Pre-define NAME - either "CHIP_6713" or "CHIP_6416", also some projects use "DEBUG" or "_DEBUG"
    • Include Options:
      • Add dir to #include search path - the include directories of all the libraries used in the project must be included here
      • Note: you must locate these folders specifically on your PC as the locations might vary
      • ..\csl\include
      • ..\dsk6416\include or ...\dsk6713\include
      • ..\C6400\imglib\include if using the IMGLIB
  • C6000 Linker
    • File Search Path:
      • Add <dir> to library search path - the lib directories of all the libraries used in the project
      • Note: you must locate these folders specifically on your PC as the locations might vary
      • ..\csl\lib
      • ..\dsk6416\lib or ...\dsk6713\lib

Common Compling/Linking Errors

Note: these errors are due to incorrect project property settings. If you are not putting your semicolons in, you won't find your answers here!


  • Where is the rts6xxx.lib file??
    • The rts library files can be found in the folder:
    • ..\Texas Instruments\C6000 Code Generation Tools 7.0.4\lib


  • ERROR: Compiler error, 'Can't find file ...'
  • Solution:
    • When importing book examples some of the files included in the project can not be found.
    • Delete the file from the project, then select Project->Link Files to Active Project and locate the missing files
    • Common examples
      • csl6713.lib, dsk6713bsl.lib - located in the ..\csl\lib and ...\dsk6713\lib directories, respectively
      • C6713dskinit.h, C6713dskint.c - located in the Support folder supplied with the book examples


  • ERROR: Linking error which mentions FAR memory access
  • Solution:
    • Project Properties -> C\C++ Build -> C6000 Compiler -> Runtime Model Options
      • Constant access model - Set to Far
      • Data access model - Set to Far

License Server

For Code Composer to function properly you must be using a licensed version. In the lab we use a license server to handle the licensing of our PCs. If a PC you are working with becomes unlicensed do the following to re-activate the connection to the license server.

  • In CCS select Help->Licensing Options...
    • Then mark the box Activate a License
    • In Step 2 - Install a License File, select Specify a License Server and use the address: sipi-dsp-11.usc.edu and port: 57566 (Spring 2013 only)

Using the Debugger

GEL Files/Sliders

  • For more details, check this pointer: http://processors.wiki.ti.com/index.php/FAQ_-_CCSv4#GEL
  • In CCSv4 the GEL Files/Sliders operate differently than in previous iterations.
  • Load GEL
    • While debugging select Tools->GEL File to load a GEL file for the current debugging session
    • Select Scripts->'GEL NAME' to access the GEL you loaded. Typically this will load the Slider.
  • Using GEL Slider
    • Unlike CCSv3.x modifications to variables due to the GEL Slider only occur when the simulation is halted in CCSv4
    • To update variables without having to halt the simulation:
      • Set a breakpoint at the line in your code where the modifiable variable is accessed.
      • Right click the breakpoint and select Breakpoint Properties
      • In the breakpoint properties dialog, under Debugger Response->Action select Refresh All Windows

Breakpoint Properties

Above we used the breakpoint properties to update variables using the GEL sliders.

Other potential uses of breakpoints include:

  • Update View - can be used to refresh a Graph or Image automatically

SVN Instruction

This only covers SVN using Code Composer. However, you are free to use other clients on your laptops. By default, CCSV is not delivered with SVN plugin thus you need to install it before use: refer to http://biron.usc.edu/~sungwonl/EE586/SVN_Installation_2012.pdf To access SVN server, you first need to get an ID/passwd from TAs. Each group will be assigned a group folder (Group_xx), user name (Group_xx) and you select a password. You can refer to details: http://biron.usc.edu/~sungwonl/EE586/SVNinstruction.pdf

SYS/BIOS (BIOS 6.34)

User's Guide for SYS/BIOS v6.34 : http://www.ti.com/lit/ug/spruex3l/spruex3l.pdf

Log on DSK

 #include <xdc/cfg/global.h>
 #include <xdc/runtime/Log.h>
 int xx = 1, yy = 100; 
 // refer to the above link to see more functions
 Log_info0("Main Started");   // no argument
 Log_info1("xx = %d", xx);    // 1 argument
 Log_info2("xx = %d, yy=%d", xx, yy); // 2 arguments

Measure CPU cycles in ccsv4

  • Refer to a document from TI: http://processors.wiki.ti.com/index.php/Profile_clock_in_CCS
  • As discussed in the document, we need to setup breakpoints at the beginning and the end of the block that you want to profile.
  • If you choose automatic reset option in Target->Clock->Setup of debug mode, the clock is reset every time it breaks.
  • If you want to convert the cycles to time, divide the number of cycles you measured with CPU clock speed of the board you are using.
    • For example, for Davinci board with 600 MHz CPU, time (seconds) = (# of clock cycles) / ( 6 * 10^8).
    • FYI, DSK6416 is running with 1 GHz and DSK6713 with 225 MHz.

Optimization

  • Measure running time in CPU cycles
    • Use a function TIMER_getCount() like in example below.
      • The reason why you multiply by 8 is because the maximum resolution of the timer in C6416 is 8 CPU cycles in this example.
      • If you use C6713, it should be 4. For details, refer to [1] for C6416 and [2] for C6713.
 include <csl_timer.h>
 // Configure timer
 hTimer = TIMER_open(TIMER_DEVANY,0); 
 TIMER_configArgs(hTimer, 0x000002C0, 0xFFFFFFFF, 0x00000000);  
 start    = TIMER_getCount(hTimer);    // called twice to avoid L1D miss.
 start    = TIMER_getCount(hTimer); 
 stop     = TIMER_getCount(hTimer); 
 overhead = stop - start;
 start = TIMER_getCount(hTimer); // begin "profile area"
 foo(); // Any function / routine you want to measure 
 stop = TIMER_getCount(hTimer); // end "profile area"
 t = (stop-start-overhead) * 8;
 printf("# cycles to run foo(): %d\n", t);
  • We strongly recommend to use EDMA for the transmission of data from video daughter card to DSK board
    • Experiment result (loopback examples) : Comparison in terms of frames per seconds
      • DSK6713 / VM3224K2(new video daughtercard) / cam2lcd2  : 7.5 frames / sec
      • DSK6713 / VM3224K2(new video daughtercard) / cam2lcd3_EDMA : 10 frames / sec
      • DSK6713 / VM3224K2(new video daughtercard) / cam2lcd3_QDMA : 10 frames / sec
    • We havn't tested with DSK 6416 and older video daughter card but we expect similar performance gain of EDMA.


Examples

The following codes are provided as one of examples used as assignments for EE586L at University of Southern California. They are skeleton codes so that they don't fully function without appropriate addition to it. We make no representations or warranties of any kind concerning the safety, suitability, lack of viruses, inaccuracies, typographical errors, or other harmful components of these examples. There are inherent dangers in the use of any software, and you are solely responsible for determining whether these codes are compatible with your equipment and other software installed on your equipment. You are also solely responsible for the protection of your equipment and backup of your data, and we will not be liable for any damages you may suffer in connection with using, modifying, or distributing these examples.

  • DSK 6713
    • Ring Modulation [3]
    • Audio Noise Template [4]

DSP Lab Equipment

List of the equipment we currently have in the lab.

  • DSP Boards
    • 10 6713
    • 8 6416 / 6416T
    • 8 6437 Davinci
  • Daughter Cards
    • 5 - ND Tech Video Daughtercard
      • Analog Video Input (composite)/ LCD Display Output
      • Works with 6713 and 6416
      • User Manual
    • 2 - Old Video Daughtercard
      • Composite and S-Video Input/ Composite and S-Video Output
      • Works with 6416 only
      • Does not work with audio
    • 4 - eDSP Multi Channel Audio card
      • 4 Channel line/mic input - 4 Channel output
      • 6713 and 6416T Compatible
      • Product Website
  • Audio Equipment
    • 4 Behringer ECM8000 Measurement Microphone
      • Omnidirectional measurement microphones
      • Flat frequency response, good for beamforming, etc.
    • 4 dbx RTA-M Measurement Microphone
      • Similar to above, omnidirectional measurement microphones
    • 4 Shure SM48 Vocal Microphone
      • Good for recording voice for speaker recognition, etc.
    • 3 Microphone Preamplifiers
      • High quality preamplifiers, get strong signal into board
  • Video Equipment
    • 4 Toshiba Teli CS5260BD Video Cameras
    • 1 JAI S3200 Video camera w/ high quality zoom lens
    • 5 Older Video Cameras


eInfoChips Video Daughtercard

  • If you have a problem with horizontal banding when using the eInfoChips video daughtercard (the one without the LCD) you have to modify the values passed to the configure the EMIF interface function. The values (the 0x0? number) below are the correct values, and the values in the sample code are incorrect. The correct values should match the value given in the comment.
    /* Configure the EMIF */
    //set read/write setup, strob and hold to 6, 4 and 1
    EMIFA_RSET(CECTL2,
    EMIFA_CECTL_RMK(
    EMIFA_CECTL_WRSETUP_OF(0x06), // Write Setup width: 6
    EMIFA_CECTL_WRSTRB_OF(0x04),  // Write Strobe width: 4
    EMIFA_CECTL_WRHLD_OF(0x01),   // Write Hold width: 1
    EMIFA_CECTL_RDSETUP_OF(0x06), // Read Setup width: 6
    EMIFA_CECTL_TA_OF(0x03),      // Turn-around Time: 3 (default)
    EMIFA_CECTL_RDSTRB_OF(0x04),  // Read Strobe width: 4
    EMIFA_CECTL_MTYPE_ASYNC32,    // Memory Type: Async 32 bit wide
    EMIFA_CECTL_WRHLDMSB_OF(0x00),// Write Hold MSB
    EMIFA_CECTL_RDHLD_OF(0x01)    // Read Hold width: 1
    ));
  • If it does not work even after you change EMIF interface function above, then change Runtime Model Options in properties of your project. Go to C/C++ Build -> C6000 Compiler -> Runtime Model Options.
    • Set Const access model and Data access model as far
  • YCrCb / Frame structure
    • For video with Rx by Ry resolution, each frame is represented by Rx * Ry /2 pixels because it's interlaced.
    • For color representation, Y component is expressed by 16 bits, Cr and Cb by 8 bits each. But, in the implementation of eInfoChips Video Daughtercard, each component of neighboring 2 pixels is represented by one variable which has twice larger bits in the constecated form. For example, Y components for 2 adjacent pixels are implemented by one 32bit (unsigned int) variable.
    • Example (SWLoopBack) : Capture video then play it on external display
   /* Example of SWLoopBack */
   // Define pointers to YCrCb's of encoder and decoder
   unsigned int *pDstY = NULL, *pSrcY = NULL;
   unsigned short *pDstCb = NULL, *pSrcCb = NULL;
   unsigned short *pDstCr = NULL, *pSrcCr = NULL;
   // in the main()
   while(1) {
       // Get the pointer to the Frame Captured
       pDecFrame = vDecGetFrame();
       // Get pointer to Y components
       pDstY = (unsigned int*)(pEncFrame->y);
       pSrcY = (unsigned int*)(pDecFrame->y);
       // Get pointer to Cb components
       pDstCb = (unsigned short*)(pEncFrame->cb);
       pSrcCb = (unsigned short*)(pDecFrame->cb);
       // Get pointer to Cr components
       pDstCr = (unsigned short*)(pEncFrame->cr);
       pSrcCr = (unsigned short*)(pDecFrame->cr);
       // Divide by 4 to scan all the pixels in a frame
       // Why 4 ?  
       // because frames are interlaced and one data point represents 2 pixels of the frame
       frameWords = (352*288)/4;
       // Scan all the pixels in a frame
       for ( i=0; i<frameWords; i++) {
           // Copy values from decoder to encoder
           *pDstY = *pSrcY;
           *pDstCb = *pSrcCb;
           *pDstCr = *pSrcCr;
           // Increase pointers by one
           pDstY++; pSrcY++;
           pDstCb++; pSrcCb++;
           pDstCr++; pSrcCr++;
       }
       // Send a Frame to Encoder
       pEncFrame = vEncSendFrame( pEncFrame);
   }