sync_pci.c
上传用户:dahaojd
上传日期:2008-01-29
资源大小:14357k
文件大小:8k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*
  2.  *  Copyright 2003 by Texas Instruments Incorporated.
  3.  *  All rights reserved. Property of Texas Instruments Incorporated.
  4.  *  Restricted rights to use, duplicate or disclose this code are
  5.  *  granted through contract.
  6.  *  
  7.  */
  8. /* "@(#) DDK 1.10.00.23 07-02-03 (ddk-b12)" */
  9. /*
  10.  *  ======== sync_pci.c ========
  11.  * 
  12.  *  PCI Driver Sync Test for for Valley Tech vt1423 board which tests
  13.  *  DSP master transfers. The test repeatly transfers data from dsp memory
  14.  *  to 21555 registers (pci write) and from 21555 registers to dsp memory
  15.  *  (pci read). The data pattern is based on channel number, such as 
  16.  *  0x01010101 or 0x81818181 for channel one, 0x05050505 or 0x85858585 for
  17.  *  channel five. Uses the 21555 Bridge Scratchpad registers (32 bytes)  
  18.  *  
  19.  *  User defines the following parameters:
  20.  *  -- VT1423_PCI_PRIORITY: if defined, tasks will have different priorities
  21.  *  -- CHAN_NUM: Number of channels to be opened
  22.  *  -- TRANSFER_COUNT: bytes to be transfered
  23.  *  -- PCI_ADDR_START: PCI start address 
  24.  *  -- LOG_DATA: if defined, will print the memory read/write data
  25.  *  -- TIMEOUT: timeout if pci driver no response 
  26.  *  -- SLEEP_TIME: task sleep time
  27.  */
  28. #include <std.h>
  29. #include <log.h>
  30. #include <sys.h>
  31. #include <tsk.h>
  32. #include <gio.h>
  33. #include <c64xx_pci.h>   
  34. #include <csl_pci.h>
  35. extern far LOG_Obj trace;
  36. #define LOG_DATA                        
  37. /* User defined constants */
  38. #define VT1423_PCI_PRIORITY
  39. #define CHAN_NUM        4       
  40. #define TRANSFER_COUNT_RAW      (32/CHAN_NUM)
  41. #define TRANSFER_COUNT          (TRANSFER_COUNT_RAW - TRANSFER_COUNT_RAW % 4)  
  42. #define PCI_ADDR_START          0xc00000a8      
  43. #define TIMEOUT         2000 /* SYS_FOREVER */  
  44. #define SLEEP_TIME              2       
  45. static Void chan_tsk(Int chanNum, Int sleep);
  46. #ifdef LOG_DATA
  47. static Void logData(Int chanNum, Ptr reqp, Int status);
  48. #endif
  49. static Void setMem(int count, Ptr *memAddr, char value);
  50. static Void verifyData(Int chanNum, Ptr reqp, char value);
  51. static Ptr gio[CHAN_NUM];
  52. /*
  53.  *  ======== main ========
  54.  */
  55. Void main()
  56. {   
  57.     C64XX_PCI_Attrs pciAttrs[CHAN_NUM];
  58.     TSK_Attrs tskAttrs[CHAN_NUM];
  59.     GIO_Attrs gioAttrs[CHAN_NUM];
  60.     Int i;
  61.     for (i=0; i<CHAN_NUM; i++) {
  62.         /* C64XX_PCI_Attrs init */
  63.         /* even numbered Channel used as low priority queue channel */
  64.         if (i % 2 == 0) {  
  65.             pciAttrs[i].queuePriority = C64XX_PCI_QUEUE_PRIORITY_LOW; 
  66.         } else {
  67.             pciAttrs[i].queuePriority = C64XX_PCI_QUEUE_PRIORITY_HIGH;
  68.         }    
  69.             
  70.         /* GIO_Attrs init */
  71.         gioAttrs[i].nPackets = 1;
  72.         gioAttrs[i].timeout = TIMEOUT; 
  73.     }         
  74.     
  75.     /* create GIO objs */
  76.     for (i=0; i<CHAN_NUM; i++) {
  77.         gio[i] = GIO_create("/udevPci", IOM_INOUT, NULL, 
  78.                 &pciAttrs[i], &gioAttrs[i]);
  79.         if (gio[i] == NULL) {
  80.             LOG_printf(&trace, "ERROR!!! GIO_create NULL");
  81.             SYS_abort("GIO_create");
  82.         }
  83.     }
  84.     
  85.     /* create tasks */
  86.     for (i=0; i<CHAN_NUM; i++) {
  87.         tskAttrs[i] = TSK_ATTRS;
  88. #ifdef VT1423_PCI_PRIORITY
  89.         tskAttrs[i].priority = 3 + i; 
  90. #endif
  91.         if (TSK_create((Fxn)chan_tsk, &tskAttrs[i], i, SLEEP_TIME) == NULL) {
  92.             LOG_printf(&trace, "ERROR!!! TSK_create NULL!");
  93.         }
  94.     }
  95.      
  96.     
  97.     LOG_printf(&trace, "Exit mainn");  
  98.     /* fall into DSP/BIOS idle loop */
  99.     return;
  100. }
  101. /*
  102.  *  ======== chan_tsk ========
  103.  */
  104. static Void chan_tsk(Int chanNum, Int sleep)
  105. {
  106.     char value;
  107.     Uns size;
  108.     Int status;
  109.     C64XX_PCI_Request   readReq;
  110.     C64XX_PCI_Request   writeReq;
  111.     Ptr dspAddr;
  112.     Bool flip; 
  113.     
  114.     flip = FALSE;
  115.     
  116.     /* allocate dsp memory  for each channel */
  117.     /* dsp address need to be PCI word address, so memory alignment is 4 */ 
  118.     dspAddr = MEM_alloc(0, TRANSFER_COUNT, 4);
  119.     if (dspAddr == NULL) {
  120.         LOG_printf(&trace, "dspAddr alloc NULL");
  121.         SYS_abort("dspAddr NULL");
  122.     }
  123.     
  124.     /* 
  125.      * pci address for each channel is divided, since each channel
  126.      * read/write in different tasks 
  127.      */
  128.     readReq.srcAddr = (char *)PCI_ADDR_START + TRANSFER_COUNT * chanNum;
  129.     readReq.dstAddr = (char *)dspAddr;
  130.     readReq.byteCnt = TRANSFER_COUNT;
  131.     readReq.options = 0;
  132.     readReq.options = 
  133.             C64XX_PCI_SETXFERMODE(readReq.options, PCI_READ_NOPREF);
  134.     writeReq.srcAddr = (char *)dspAddr;
  135.     writeReq.dstAddr = (char *)PCI_ADDR_START + TRANSFER_COUNT * chanNum;
  136.     writeReq.byteCnt = TRANSFER_COUNT;
  137.     writeReq.options = PCI_WRITE;
  138.     writeReq.options = 0;
  139.     writeReq.options = 
  140.             C64XX_PCI_SETXFERMODE(writeReq.options, PCI_WRITE);
  141.     for (;;) {
  142.         if (flip) {
  143.             value = (char)chanNum | 0x80;
  144.             flip = FALSE;
  145.         } else {
  146.             value = (char)chanNum;
  147.             flip = TRUE;
  148.         }
  149.         /* 
  150.            set dsp memory value as chanNum chanNum ...(0x0101.. for Chan1
  151.            or 0x818181.. for Chan1). This is the write value being transfered 
  152.            to pci memory
  153.          */ 
  154.         setMem(TRANSFER_COUNT, writeReq.srcAddr, value);
  155.         /* pci write : dsp->pci */
  156.         status = GIO_write(gio[chanNum], &writeReq, &size);
  157.         if (status < 0) {
  158.             LOG_printf(&trace, "ERR - in GIO_write status c[%d] = %d", 
  159.                     chanNum, status);
  160.         }
  161. #ifdef LOG_DATA
  162.         logData(chanNum, &writeReq, status);
  163. #endif 
  164.         /* set dsp memory to 0x99 as initial value */
  165.         setMem(TRANSFER_COUNT, readReq.dstAddr, 0x99);
  166.         
  167.         /* pci read : pci->dsp. read back the value written */
  168.         status = GIO_read(gio[chanNum], &readReq, &size);
  169.         if (status < 0) {
  170.             LOG_printf(&trace, "ERR - in GIO_read status c[%d] = %d", 
  171.                     chanNum, status);
  172.         }
  173. #ifdef LOG_DATA
  174.         logData(chanNum, &readReq, status);
  175. #endif
  176.        
  177.         /* verify if the read value equals the value written */
  178.         verifyData(chanNum, &readReq, value); 
  179.         TSK_sleep(sleep);
  180.     }  
  181. }
  182. /*
  183.  *  ======== logData ========
  184.  *  print out the read/write memory
  185.  *  Note: only display the first 4 bytes (Uns)
  186.  */
  187. #ifdef LOG_DATA
  188. static Void logData(Int chanNum, Ptr reqp, Int status)
  189. {
  190.     C64XX_PCI_Request *req;
  191.     Uns  *addr; 
  192.     
  193.     req = (C64XX_PCI_Request*)reqp;
  194.     
  195.     /* print out info */
  196.     if (req != NULL) {
  197.         LOG_printf(&trace, "chan[%d], status=%x", chanNum, status);
  198.         
  199.         if (C64XX_PCI_GETXFERMODE(req->options) == PCI_WRITE ) {
  200.             addr = (Uns *)req->srcAddr;
  201.             LOG_printf(&trace, "    sbmt-w: written=%x", *addr);
  202.         } 
  203.         else {
  204.             addr = (Uns *)req->dstAddr;
  205.             LOG_printf(&trace, "    sbmt-r: read=%x", *addr);  
  206.         }
  207.     } 
  208.     else {
  209.         LOG_printf(&trace, "request NULL");    
  210.     } 
  211. }
  212. #endif
  213. /*
  214.  *  ======== setMem ========
  215.  *  Set memory value
  216.  */
  217. static Void setMem(int count, Ptr *memAddr, char value)
  218. {
  219.     char *tempMem = (char *)memAddr;
  220.     int i;
  221.     
  222.     for (i = 0; i < count; i++) {
  223.         *tempMem = value;
  224.         tempMem++;
  225.     }   
  226. }
  227. /*
  228.  *  ======== verifyData ========
  229.  *  Verify read back data 
  230.  */
  231. static Void verifyData(Int chanNum, Ptr reqp, char value)
  232. {
  233.     C64XX_PCI_Request *req;
  234.     char  *addr; 
  235.     Int i;
  236.     
  237.     req = (C64XX_PCI_Request*)reqp;
  238.     
  239.     if (req != NULL) {
  240.        addr = (char *)req->dstAddr;
  241.        for (i = 0; i < req->byteCnt; i++) {
  242.            if (*addr != value) {
  243.                LOG_printf(&trace, "ERROR!!! in verify chan[%d], addr = %x", 
  244.                        chanNum, addr); 
  245.            }
  246.            addr++;
  247.        } 
  248.     } 
  249. }