dptarget.h
上传用户:baixin
上传日期:2008-03-13
资源大小:4795k
文件大小:6k
开发平台:

MultiPlatform

  1. /*
  2. **  File:     dptarget.h    
  3. **  Version:  1.0.1
  4. **
  5. **  Description: Contains defines and prototypes
  6. **               for the NetROM dualport communication protocol
  7. **
  8. **      Copyright (c) 1996  Applied Microsystems Corp.
  9. **                          All Rights Reserved
  10. **
  11. **  Modification History:
  12. **  1/14/97......Rewrote macros using 8-byte addr span, MPH
  13. **    
  14. */
  15. #ifndef _dptarget_h
  16. #define _dptarget_h
  17. /* Target-native data storage */
  18. typedef unsigned long   uInt32; /* 32 bits unsigned */
  19. typedef long            Int32;          /* 32 bits signed */
  20. typedef unsigned short  uInt16; /* 16 bits unsigned */
  21. typedef short           Int16; /* 16 bits signed */
  22. typedef unsigned char   uChar; /* 8 bits unsigned */
  23. /* prevents private stuff from appearing in the link map */
  24. #define STATIC          static
  25. #define DP_DATA_SIZE     60      /* msg data size */
  26. /*
  27. ** Dualport access macros
  28. **
  29. ** How the Read-read macros work:
  30. **  1. Enable RR protocol and latch start address for write
  31. **       a. Read the RR_Enable address
  32. **       b. Read to latch bits 0-7  of start address
  33. **       c. Read to latch bits 8-10 of start address
  34. **  3. Latch the data by reading (Step 3 may be repeated n times,
  35. **     to write n consecutive bytes, NR will autoincrement the 
  36. **     destination address.)
  37. **  4. Disable RR protocol by reading the RR_Disable address
  38. **
  39. ** Notes:
  40. **  1. volatile "uChar RR_dummy" must be declared in dptarget.c for 
  41. **     RR_ENABLE RR_WRITE_BYTE and RR_DISABLE
  42. **  2. Start address and data are latched using an 8-byte span.
  43. **     This lets the RR protocol work on targets that perform burst-reads.
  44. **     Actual span used = ROMWORDWIDTH * 8
  45. */
  46. /* ROMWORDWIDTH==1, so use 8-byte span */
  47. #if (ROMWORDWIDTH == 1)
  48.   #define ADR1_MASK(addr) (((addr) & 0x000000FF) << 3)
  49.   #define ADR2_MASK(addr) (((addr) & 0x00000700) >> 5)
  50.   #define ADR3_MASK(addr) (addr)
  51.   #define DATA_MASK(data) ((data) << 3)
  52.   #define READ_MASK(x)    (* ((volatile uChar*)(x)))
  53. /* ROMWORDWIDTH==2, so use 16-byte span */
  54. /* Podorder must be 0 or 0:1 with this READ_MASK */
  55. #elif (ROMWORDWIDTH == 2)
  56.   #define ADR1_MASK(addr) (((addr) & 0x000000FF) << 4)
  57.   #define ADR2_MASK(addr) (((addr) & 0x00000700) >> 4)
  58.   #define ADR3_MASK(addr) ((addr) << 1)
  59.   #define DATA_MASK(data) ((data) << 4)
  60.   #define READ_MASK(x)    (uChar)(* ((volatile uInt16*)(x))) 
  61. /* ROMWORDWIDTH==4, so use 32-byte span */
  62. /* Podorder must be 0:1 or 0:1:2:3 with this READ_MASK */
  63. #elif (ROMWORDWIDTH == 4)
  64.   #define ADR1_MASK(addr) (((addr) & 0x000000FF) << 5)
  65.   #define ADR2_MASK(addr) (((addr) & 0x00000700) >> 3)
  66.   #define ADR3_MASK(addr) ((addr) << 2)
  67.   #define DATA_MASK(data) ((data) << 5)
  68.   #define READ_MASK(x)    (uChar)(* ((volatile uInt32*)(x)))
  69. /* ROMWORDWIDTH Error */
  70. #else
  71. #error Invalid romwordwidth(=ROMWORDWIDTH) specified in dpconfig.h
  72. #endif
  73. /* A. Turn on Read-read protocol and latch start address for Write */
  74. /* B. Latch lower 8-bits of start address for Write */
  75. /* C. Latch bits 10-8 of start address for Write */
  76. #define RR_ENABLE(cp, addr) { 
  77.   RR_dummy = (* ((volatile uChar *) ((cp)->rr_enable ))); 
  78.   RR_dummy = (* ((volatile uChar *) 
  79.  ((cp)->dpbase_plus_index + ADR1_MASK(addr)))); 
  80.   RR_dummy = (* ((volatile uChar *) 
  81.  ((cp)->dpbase_plus_index + ADR2_MASK(addr)))); 
  82.             }
  83. /* Use Read-read protocol to write one byte to current address */
  84. /* After the write, destination address is incremented in hardware */
  85. #define RR_WRITE_BYTE(cp, val) 
  86.   RR_dummy = (*((volatile uChar*)((cp)->dpbase_plus_index + DATA_MASK(val))))
  87. /* Turn off Read-read protocol */
  88. #define RR_DISABLE(cp) 
  89.   RR_dummy = (* ((volatile uChar *) ((cp)->rr_disable )))
  90. #define NR_READ_BYTE(cp, addr) 
  91.   READ_MASK( (cp)->dpbase_plus_index + ADR3_MASK(addr) )
  92. #if (READONLY_TARGET == False)
  93. #define NR_WRITE_BYTE(cp, addr, val) 
  94.   (* ((volatile uChar*)((cp)->dpbase_plus_index + ADR3_MASK(addr) )) = (val))
  95. #else
  96.  /* Can't write, so use the Read-read protocol */
  97. #define NR_WRITE_BYTE(cp, addr, val) { 
  98.    RR_ENABLE( (cp), (addr) );  
  99.    RR_WRITE_BYTE( (cp), (val) );  
  100.    RR_DISABLE( (cp) ); }
  101. #endif /* READONLY_TARGET == False */
  102. /*  ------------------------------------------------------
  103. **          Prototypes for dualport communication
  104. **  ------------------------------------------------------
  105. */
  106. Int16  nr_ConfigDP   ( uInt32, Int16, Int16 );
  107. Int16  nr_SetBlockIO ( uInt16, uInt16 );
  108. Int16  nr_ChanReady  ( uInt16 );    
  109. Int16  nr_Poll       ( uInt16 );
  110. Int16  nr_Getch      ( uInt16 );     
  111. Int16  nr_Putch      ( uInt16, char );
  112. Int16  nr_FlushTX    ( uInt16 );   
  113. Int16  nr_GetMsg     ( uInt16, char*, uInt16, uInt16* );
  114. Int16  nr_PutMsg     ( uInt16, char*, uInt16 );
  115. Int16  nr_Resync     ( uInt16 );
  116. Int16  nr_Reset      ( uInt16 );
  117. Int16  nr_IntAck     ( uInt16 );
  118. Int16  nr_Cputs      ( uInt16, char*, uInt16 );
  119. Int16  nr_SetMem     ( uInt16, uInt32, char*, uInt16 );
  120. Int16  nr_TestComm   ( uInt16, uInt16, uInt16 );
  121. Int16  nr_IntAck     ( uInt16 );
  122. Int16  nr_Cputs      ( uInt16, char*, uInt16 );
  123. Int16  nr_SetMem     ( uInt16, uInt32, char*, uInt16 );
  124. void   nr_SetEmOffOnWrite ( void );
  125. /* Return error codes */
  126. #define Err_NoError        0
  127. #define Err_WouldBlock    -1
  128. #define Err_BadChan       -2
  129. #define Err_BadLength     -3
  130. #define Err_BadAddress    -4
  131. #define Err_BadCommand    -5
  132. #define Err_NotReady      -6
  133. /* Structures for out-of-band messages */
  134. typedef struct _dpSetMemStruct {
  135.       uInt32   addr;
  136.       uChar    data[DP_DATA_SIZE-6];
  137.     } DpSetMemBuf;
  138. typedef struct _dpCputsStruct {
  139.       uChar    data[DP_DATA_SIZE-2];
  140.     } DpCputsBuf;
  141. typedef struct OOBM {
  142.   uInt16   flags;
  143.   uInt16   size;
  144.   uInt16   cmd; 
  145.   union{
  146.     DpSetMemBuf setmem;
  147.     DpCputsBuf  cputs;
  148.   } ftn;
  149. } DP_OOB_MSG;
  150. #endif /* _dptarget_h */