ds1394Spi.c
上传用户:whwilliam
上传日期:2022-02-24
资源大小:3k
文件大小:13k
源码类别:

VxWorks

开发平台:

Visual C++

  1. /*ds1394spi.c - SPI interface to serial rtc library */
  2. /*
  3. DESCRIPTION
  4. This library contains routines to manipulate ds1394 which is accessed as a 
  5. Serial Peripheral Interface (SPI). Read and write routines are included.
  6. */
  7. /* includes */
  8. #include "vxWorks.h"
  9. #include <string.h>
  10. #include <stdlib.h>
  11. #include <stdio.h>
  12. //#include "copyright_wrs.h"
  13. #include "iv.h"
  14. #include "netLib.h"
  15. #include "semLib.h"
  16. #include "vxWorks.h"
  17. #include "vme.h"
  18. #include "memLib.h"
  19. #include "cacheLib.h"
  20. #include "sysLib.h"
  21. #include "config.h"
  22. #include "string.h"
  23. #include "intLib.h"
  24. #include "logLib.h"
  25. #include "stdio.h"
  26. #include "taskLib.h"
  27. #include "vxLib.h"
  28. #include "c_type.h"
  29. #include "drv/mem/m82xxDpramLib.h"
  30. #include "drv/parallel/m8260IOPort.h"
  31. #include "drv/sio/m8260Cp.h"
  32. #include "ds1394spi.h"
  33. SPI_DEV * pSpi;
  34. void DS1394CSEn(void)
  35. {
  36. int immrVal=vxImmrGet();
  37. * M8260_IOP_PADAT(immrVal) &= ~(BigEndBit(8));
  38. }
  39. void DS1394CSDis(void)
  40. {
  41. int immrVal=vxImmrGet();
  42. * M8260_IOP_PADAT(immrVal) |= (BigEndBit(8));
  43. }
  44. /******************************************************************************
  45. *
  46. * sysHwSpiInit - initializes NV-RAM
  47. *
  48. * This routine initializes NV-RAM to prepare for subsequent reads from or
  49. * writes to NV-RAM.
  50. *
  51. * RETURNS: none
  52. */
  53. LOCAL STATUS sysHwSpiInit(void)
  54. {
  55. SPI_BD *BufferPoint=NULL;
  56. char *BufferRx=NULL;
  57. char *BufferTx=NULL;
  58. UINT32 cpcrVal;
  59. int immrVal=vxImmrGet();
  60. // SPI_DEV* pSpi;
  61. // pSpi = &spiDev;
  62. /* SPI initialization cannot occur more than once. */
  63. //if (pSpi->init == TRUE)
  64. //{
  65. //return;
  66. //}
  67. BufferPoint=malloc(sizeof(SPI_DEV));
  68. pSpi=(SPI_DEV *)(BufferPoint);
  69. /*----------------------------------------------*/
  70. /* config io port */
  71. /*----------------------------------------------*/
  72. * M8260_IOP_PDDIR(immrVal) &= ~(BigEndBit(16)|BigEndBit(17)|BigEndBit(18));
  73. * M8260_IOP_PDSO(immrVal) |= (BigEndBit(16)|BigEndBit(17)|BigEndBit(18));
  74. * M8260_IOP_PDODR(immrVal) &= ~(BigEndBit(16)|BigEndBit(17)|BigEndBit(18));
  75. * M8260_IOP_PDPAR(immrVal) |= (BigEndBit(16)|BigEndBit(17)|BigEndBit(18));
  76. * M8260_IOP_PDPAR(immrVal) &= ~(BigEndBit(19));
  77. * M8260_IOP_PADIR(immrVal) |= (BigEndBit(8));
  78. * M8260_IOP_PASO(immrVal) &= ~(BigEndBit(8));
  79. * M8260_IOP_PAODR(immrVal) &= ~(BigEndBit(8));
  80. * M8260_IOP_PAPAR(immrVal) &= ~(BigEndBit(8));
  81. * M8260_IOP_PADAT(immrVal) |= (BigEndBit(8));
  82. /* Get IMMR register base. */
  83. pSpi->regBase = immrVal;
  84. /* Get pointer to dual-ported RAM. */
  85. pSpi->dualpRam = immrVal;
  86. * M8260_SPI_BASE(immrVal) = SPI_PARAM_OFFSET;
  87. /* Set pointer to SPI parameter RAM. */
  88. pSpi->pPram = (pSPI_PARAM) (immrVal+SPI_PARAM_OFFSET);
  89. /* Clear parameter RAM values. */
  90. pSpi->pPram->rbase = 0;
  91. pSpi->pPram->tbase = 0;
  92. pSpi->pPram->rfcr = 0;
  93. pSpi->pPram->tfcr = 0;
  94. pSpi->pPram->mrblr = 0;
  95. pSpi->pPram->rstate = 0;
  96. pSpi->pPram->res1 = 0;
  97. pSpi->pPram->rbptr = 0;
  98. pSpi->pPram->res2 = 0;
  99. pSpi->pPram->res3 = 0;
  100. pSpi->pPram->tstate = 0;
  101. pSpi->pPram->res4 = 0;
  102. pSpi->pPram->tbptr = 0;
  103. pSpi->pPram->res5 = 0;
  104. pSpi->pPram->res6 = 0;
  105. pSpi->pPram->res7 = 0;
  106. //首先在DRAM分配中分配SPI bd
  107. BufferPoint=(SPI_BD *)m82xxDpramFccMalloc(SPI_BD_SIZE+2,16);
  108. if(BufferPoint==NULL)
  109. return ERROR;
  110. memset(BufferPoint,0,SPI_BD_SIZE+2);
  111. pSpi->pPram->rbase = (UINT16)((INT32)BufferPoint-immrVal);
  112. pSpi->pPram->tbase = (UINT16) ((INT32)BufferPoint-immrVal+sizeof(SPI_BD));
  113. pSpi->pPram->rfcr = 0x18;
  114. pSpi->pPram->tfcr = 0x18;
  115. pSpi->pPram->mrblr = 1;
  116. //SPI BD 初始化
  117. //BufferRx=malloc(SPI_RX_BUF_SZ);
  118. //BufferTx=malloc(SPI_TX_BUF_SZ);
  119. //if(BufferRx==NULL | BufferTx==NULL)
  120. //return ERROR;
  121. //memset(BufferRx,0,SPI_RX_BUF_SZ);
  122. //memset(BufferTx,0,SPI_TX_BUF_SZ);
  123. //pSpi->pRxBdBase = (BufferPoint);
  124. //pSpi->pTxBdBase = (BufferPoint+sizeof(SPI_BD));
  125. pSpi->pRxBdBase = (INT32)BufferPoint;
  126. pSpi->pTxBdBase = (INT32)BufferPoint+sizeof(SPI_BD);
  127. pSpi->pTxBdBase->statusMode =
  128. (SPI_TRANS_TX_BD_LAST | SPI_TRANS_TX_BD_WRAP);
  129. pSpi->pTxBdBase->dataLength = 0;
  130. pSpi->pTxBdBase->dataPointer = spiTxBuf;
  131. pSpi->pRxBdBase->statusMode =
  132. (SPI_TRANS_RX_BD_EMPTY | SPI_TRANS_RX_BD_LAST | SPI_TRANS_RX_BD_WRAP);
  133. pSpi->pRxBdBase->dataLength = 0;
  134. pSpi->pRxBdBase->dataPointer = spiRxBuf;
  135. //SPI模式等寄存器设置
  136. * M8260_SPI_SPMODE(immrVal) = DisSPI; /* Clear BSY */
  137. * M8260_SPI_SPIE(immrVal) = 0x17;
  138. * M8260_SPI_SPIM(immrVal) = 0x17;
  139. pSpi->init = TRUE;
  140. /* issue start command*/
  141. while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  142. * M8260_CPCR(immrVal) = M8260_CPCR_OP(M8260_CPCR_RT_INIT) |
  143.  M8260_CPCR_SBC(M8260_CPCR_SBC_SPI) |
  144.  M8260_CPCR_PAGE(M8260_CPCR_PAGE_SPI) |
  145.  M8260_CPCR_FLG;
  146. while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  147. return;
  148. } /* end of sysHwSpiInit */
  149. /******************************************************************************
  150. *
  151. * ds1394nbyteread - get the contents of ds1394
  152. *
  153. * This routine copies the contents of ds1394 into a specified
  154. * string. The string is terminated with an EOS.
  155. *
  156. * RETURNS: OK, or ERROR if access is outside the ds1394 range.
  157. *
  158. */
  159. LOCAL STATUS Ds1394nByteRead(UCHAR cmdadds,char* string,int strLen)
  160. {
  161. // SPI_DEV* pSpi;
  162. int immrVal=vxImmrGet();
  163. // pSpi = &spiDev;
  164. if (pSpi->init != TRUE)
  165. return(ERROR);
  166. /* Wait for transmit to finish (first). */
  167. while (pSpi->pTxBdBase->statusMode & SPI_TRANS_TX_BD_READY)
  168. {
  169. ;
  170. }
  171. /* Disable SPI (serial port interface). */
  172. * M8260_SPI_SPMODE(immrVal) = DisSPI; /* Clear BSY */
  173. /* Set up receive buffer descriptor. */
  174. pSpi->pRxBdBase->statusMode = ( SPI_TRANS_RX_BD_WRAP |
  175. SPI_TRANS_RX_BD_EMPTY );
  176. pSpi->pRxBdBase->dataLength = 0;
  177. pSpi->pRxBdBase->dataPointer = spiRxBuf;
  178. //写发送数据
  179. spiTxBuf[0]=cmdadds;
  180. /* Set up transmit buffer descriptor. */
  181. pSpi->pTxBdBase->statusMode = ( SPI_TRANS_TX_BD_READY |
  182. SPI_TRANS_TX_BD_WRAP |
  183. SPI_TRANS_TX_BD_LAST );
  184. pSpi->pTxBdBase->dataLength = strLen+1;
  185. pSpi->pTxBdBase->dataPointer = spiTxBuf;
  186. pSpi->pPram->mrblr = strLen + 1;
  187. /* issue start command*/
  188. while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  189. * M8260_CPCR(immrVal) = M8260_CPCR_OP(M8260_CPCR_RT_INIT) |
  190.  M8260_CPCR_SBC(M8260_CPCR_SBC_SPI) |
  191.  M8260_CPCR_PAGE(M8260_CPCR_PAGE_SPI) |
  192.  M8260_CPCR_FLG;
  193. while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  194. /* Enable SPI. */
  195. * M8260_SPI_SPMODE(immrVal) = EnSPI; 
  196. /* Assert chip select (CS). */
  197. DS1394CSEn();
  198. /* Start transfer. */
  199. * M8260_SPI_SPCOM(immrVal) = SPI_STR; 
  200. /* Wait for reading to finish. */
  201. while (pSpi->pRxBdBase->statusMode & SPI_TRANS_RX_BD_EMPTY)
  202. {
  203. /* Busy-wait. */
  204. ;
  205. }
  206. /* De-assert chip select (CS). */
  207. DS1394CSDis();
  208. /* Copy read data into given string. */
  209. bcopyBytes(&spiRxBuf[1], string, strLen);
  210. return(OK);
  211. } /* end of ds1394nbyteread */
  212. /******************************************************************************
  213. *
  214. * Ds1394nByteWrite - write a byte to ds1394
  215. *
  216. * This routine writes one byte to ds1394
  217. *
  218. * RETURNS: none
  219. *
  220. * NOMANUAL
  221. */
  222. LOCAL STATUS Ds1394nByteWrite(UCHAR writeadds,char* string,int strLen)
  223. {
  224. // SPI_DEV* pSpi;
  225. // pSpi = &spiDev;
  226. int immrVal=vxImmrGet();
  227. /* Wait for transmit to finish (first). */
  228. while (pSpi->pTxBdBase->statusMode & SPI_TRANS_TX_BD_READY)
  229. {
  230. ;
  231. }
  232. /* Disable SPI (serial port interface). */
  233. * M8260_SPI_SPMODE(immrVal) = DisSPI; /* Clear BSY */
  234. //写发送地址
  235. spiTxBuf[0]=writeadds;
  236. /* Copy given string into write data. */
  237. bcopyBytes(string,&spiTxBuf[1],strLen);
  238. /* Set up transmit buffer descriptor. */
  239. pSpi->pTxBdBase->dataPointer = spiTxBuf;
  240. pSpi->pTxBdBase->dataLength = strLen+1;
  241. pSpi->pTxBdBase->statusMode = ( SPI_TRANS_TX_BD_READY |
  242. SPI_TRANS_TX_BD_WRAP |
  243. SPI_TRANS_TX_BD_LAST );
  244. /* Set SPI read value. */
  245. pSpi->pPram->mrblr = strLen+1;
  246. /* Set up receive buffer descriptor. */
  247. pSpi->pRxBdBase->dataPointer = spiRxBuf;
  248. pSpi->pRxBdBase->statusMode = ( SPI_TRANS_RX_BD_WRAP |
  249. SPI_TRANS_RX_BD_EMPTY
  250. | SPI_TRANS_RX_BD_LAST);
  251. /* issue start command*/
  252. while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  253. * M8260_CPCR(immrVal) = M8260_CPCR_OP(M8260_CPCR_RT_INIT) |
  254.  M8260_CPCR_SBC(M8260_CPCR_SBC_SPI) |
  255.  M8260_CPCR_PAGE(M8260_CPCR_PAGE_SPI) |
  256.  M8260_CPCR_FLG;
  257. while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  258. /* Enable SPI. */
  259. * M8260_SPI_SPMODE(immrVal) = EnSPI; 
  260. /* Assert chip select (CS). */
  261. DS1394CSEn();
  262. /* Start transfer. */
  263. * M8260_SPI_SPCOM(immrVal) = SPI_STR; 
  264. /* Wait for reading to finish. */
  265. while (pSpi->pRxBdBase->statusMode & SPI_TRANS_RX_BD_EMPTY)
  266. {
  267. /* Busy-wait. */
  268. ;
  269. }
  270. /* De-assert chip select (CS). */
  271. DS1394CSDis();
  272. return;
  273. } /* end of Ds1394nByteWrite */
  274. /******************************************************************************
  275. *
  276. * Ds1394WriteByte - write a byte to NVRAM
  277. *
  278. * This routine writes one byte to NVRAM
  279. *
  280. * RETURNS: none
  281. *
  282. * NOMANUAL
  283. */
  284. //LOCAL  Ds1394WriteByte(UCHAR writeadds,UCHAR writebyte)
  285. //{
  286. // SPI_DEV* pSpi;
  287. // pSpi = &spiDev;
  288. // int immrVal=vxImmrGet();
  289. // /* Wait for transmit to finish (first). */
  290. // while (pSpi->pTxBdBase->statusMode & SPI_TRANS_TX_BD_READY)
  291. // {
  292. // ;
  293. // }
  294. // /* Disable SPI (serial port interface). */
  295. // * M8260_SPI_SPMODE(immrVal) = DisSPI; /* Clear BSY */
  296. // //写发送数据
  297. // spiTxBuf[0]=writeadds;
  298. // spiTxBuf[1]=writebyte;
  299. // /* Set up transmit buffer descriptor. */
  300. // pSpi->pTxBdBase->dataPointer = spiTxBuf;
  301. // pSpi->pTxBdBase->dataLength = 2;
  302. // pSpi->pTxBdBase->statusMode = ( SPI_TRANS_TX_BD_READY |
  303. // SPI_TRANS_TX_BD_WRAP |
  304. // SPI_TRANS_TX_BD_LAST );
  305. /* Set SPI read value. */
  306. // pSpi->pPram->mrblr = 2;
  307. /* Set up receive buffer descriptor. */
  308. // pSpi->pRxBdBase->dataPointer = spiRxBuf;
  309. // pSpi->pRxBdBase->statusMode = ( SPI_TRANS_RX_BD_WRAP |
  310. // SPI_TRANS_RX_BD_EMPTY );
  311. /* issue start command*/
  312. // while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  313. // * M8260_CPCR(immrVal) = M8260_CPCR_OP(M8260_CPCR_RT_INIT) |
  314. //  M8260_CPCR_SBC(M8260_CPCR_SBC_SPI) |
  315. //  M8260_CPCR_PAGE(M8260_CPCR_PAGE_SPI) |
  316. //  M8260_CPCR_FLG;
  317. // while ((*M8260_CPCR(immrVal) & M8260_CPCR_FLG) != 0);
  318. /* Enable SPI. */
  319. // * M8260_SPI_SPMODE(immrVal) = EnSPI; 
  320. /* Assert chip select (CS). */
  321. // DS1394CSEn();
  322. /* Start transfer. */
  323. // * M8260_SPI_SPCOM(immrVal) = SPI_STR; 
  324. /* Wait for reading to finish. */
  325. // while (pSpi->pRxBdBase->statusMode & SPI_TRANS_RX_BD_EMPTY)
  326. // {
  327. /* Busy-wait. */
  328. // ;
  329. // }
  330. /* De-assert chip select (CS). */
  331. // DS1394CSDis();
  332. // return;
  333. //} /* end of sysNvRamWriteByte */
  334. /* ds1394 test. */
  335. UCHAR read_from_ds1394[SPI_RX_BUF_SZ];
  336. UCHAR write_to_ds1394[SPI_TX_BUF_SZ];
  337. void ds1394_test(void)
  338. {
  339. STATUS status;
  340. int strLen;
  341. UCHAR cmdadds;
  342. sysHwSpiInit();
  343. cmdadds=0x8d;
  344. strLen=0x01;
  345. write_to_ds1394[0]=0x00;
  346. status=Ds1394nByteWrite(cmdadds,&write_to_ds1394[0],strLen);
  347. cmdadds=0x8e;
  348. strLen=0x01;
  349. write_to_ds1394[0]=0x00;
  350. status=Ds1394nByteWrite(cmdadds,&write_to_ds1394[0],strLen);
  351. cmdadds=0x8f;
  352. strLen=0x01;
  353. write_to_ds1394[0]=0x00;
  354. status=Ds1394nByteWrite(cmdadds,&write_to_ds1394[0],strLen);
  355. cmdadds=0x00;
  356. strLen=0x0d;
  357. status=Ds1394nByteRead(cmdadds,&read_from_ds1394[0],strLen);
  358. if(strLen){
  359. cmdadds=0x80;
  360. write_to_ds1394[0]=0x00;
  361. write_to_ds1394[1]=0x48;
  362. write_to_ds1394[2]=0x36;
  363. write_to_ds1394[3]=0x09;
  364. write_to_ds1394[4]=0x02;
  365. write_to_ds1394[5]=0x26;
  366. write_to_ds1394[6]=0x11;
  367. write_to_ds1394[7]=0x12;
  368. strLen=0x08;
  369. status=Ds1394nByteWrite(cmdadds,&write_to_ds1394[0],strLen);
  370. }
  371. cmdadds=0x00;
  372. strLen=0x10;
  373. status=Ds1394nByteRead(cmdadds,&read_from_ds1394[0],strLen);
  374. while(1)
  375. {
  376. cmdadds=0x00;
  377. strLen=0x10;
  378. status=Ds1394nByteRead(cmdadds,&read_from_ds1394[0],strLen);
  379. }
  380. //STATUS Ds1394nByteRead(UCHAR cmdadds,char* string,int strLen)
  381. //LOCAL void Ds1394nByteWrite(UCHAR writeadds,char* string,int strLen)
  382. /*
  383. printf("About to init SPI.\n");
  384. sysHwSpiInit();
  385. printf("About to read contents of entire EEPROM.\n");
  386. status = sysNvRamGet(&read_from_EEPROM[0], SPI_SERIAL_EEPROM_SZ, 0);
  387. printf("Status of sysNvRamGet is %d.\n", status);
  388. printf("Contents of EEPROM are: \n");
  389. for (i = 0; i < 64; i++)
  390. {
  391. printf("\n%x %x %x %x",
  392. *((UINT*) &read_from_EEPROM[i * 16]),
  393. *((UINT*) &read_from_EEPROM[(i * 16) + 4]),
  394. *((UINT*) &read_from_EEPROM[(i * 16) + 8]),
  395. *((UINT*) &read_from_EEPROM[(i * 16) + 12]));
  396. }
  397. for (i = 0; i < SPI_SERIAL_EEPROM_SZ; i++)
  398. {
  399. write_to_EEPROM = (unsigned char)0;
  400. }
  401. printf("About to write contents of entire EEPROM.\n");
  402. status = sysNvRamSet(&write_to_EEPROM[0], SPI_SERIAL_EEPROM_SZ - offset,offset);
  403. printf("Status of sysNvRamSet is %d.\n", status);
  404. printf("About to read contents of entire EEPROM.\n");
  405. status = sysNvRamGet(&read_from_EEPROM[0], SPI_SERIAL_EEPROM_SZ, 0);
  406. for (i = 0; i < SPI_SERIAL_EEPROM_SZ; i++)
  407. {
  408. if (read_from_EEPROM != write_to_EEPROM)
  409. {
  410. printf("\n%d: 0x%02x != 0x%02x ", i, read_from_EEPROM,write_to_EEPROM);
  411. }
  412. }
  413. printf("\nDONE");
  414. */
  415. //return;
  416. }
  417. /* end of sysSpiNvRam.c */