[Tinyos-beta-commits] CVS: tinyos-1.x/beta/platform/imote2 HPLCC2420M.nc, 1.6, 1.7

Robbie Adler radler at users.sourceforge.net
Mon Sep 19 16:58:36 PDT 2005


Update of /cvsroot/tinyos/tinyos-1.x/beta/platform/imote2
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv29888

Modified Files:
	HPLCC2420M.nc 
Log Message:
added compile-time option to use either DMA or programmed I/O for radio rx/tx fifo interaction.  By default, programmed I/O is used for now due to incorrect upper layer assumptions

Index: HPLCC2420M.nc
===================================================================
RCS file: /cvsroot/tinyos/tinyos-1.x/beta/platform/imote2/HPLCC2420M.nc,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -d -r1.6 -r1.7
*** HPLCC2420M.nc	19 Sep 2005 20:58:38 -0000	1.6
--- HPLCC2420M.nc	19 Sep 2005 23:58:34 -0000	1.7
***************
*** 67,76 ****
  {
  
!   enum {
!     PXA27X_SSP_FIFOMAXLEN = 13
!   };
!   
    uint8_t gbDMAChannelInitDone;
    bool gbIgnoreTxDMA;
    norace uint8_t* rxbuf;
    norace uint8_t* txbuf;
--- 67,75 ----
  {
  
! #define USE_DMA 0
! 
    uint8_t gbDMAChannelInitDone;
    bool gbIgnoreTxDMA;
+   uint8_t RxDMAInProgress;    
    norace uint8_t* rxbuf;
    norace uint8_t* txbuf;
***************
*** 85,111 ****
    norace uint16_t rxramaddr;
    norace uint32_t errno;
-   uint8_t RxDMAInProgress;    
    
    command result_t StdControl.init() {
  
!     // Set the appropriate GPIO bits
!     _GPDR(SSP3_SCLK) |= _GPIO_bit(SSP3_SCLK);  // SSP3SCLK
!     _GPDR(SSP3_TXD)  |= _GPIO_bit(SSP3_TXD);  // SSP3TXD
!     _GPDR(SSP3_RXD) &= ~(_GPIO_bit(SSP3_RXD));  //SSP3RXD
!     //_GPDR(SSP3_SFRM)  |= _GPIO_bit(SSP3_SFRM);  // SSP3SFRM
! 
!     _GPIO_setaltfn(SSP3_SCLK,SSP3_SCLK_ALTFN);
!     _GPIO_setaltfn(SSP3_TXD,SSP3_TXD_ALTFN);
!     _GPIO_setaltfn(SSP3_RXD,SSP3_RXD_ALTFN);
!     //_GPIO_setaltfn(SSP3_SFRM,SSP3_SFRM_ALTFN);
  
      atomic gbDMAChannelInitDone = 2;
-     
      call RxDMAChannel.requestChannel(DMAID_SSP3_RX,DMA_Priority1, TRUE); 
      call TxDMAChannel.requestChannel(DMAID_SSP3_TX,DMA_Priority1, TRUE); 
-     
      call DMAControl.init();
!     call GPIOControl.init();
!     
      call TxDMAChannel.setTargetAddr(0x41900010);
      call TxDMAChannel.enableSourceAddrIncrement(TRUE);
--- 84,100 ----
    norace uint16_t rxramaddr;
    norace uint32_t errno;
    
    command result_t StdControl.init() {
  
!     _PXA_setaltfn(SSP3_SCLK,SSP3_SCLK_ALTFN,GPIO_OUT);
!     _PXA_setaltfn(SSP3_TXD,SSP3_TXD_ALTFN,GPIO_OUT);
!     _PXA_setaltfn(SSP3_RXD,SSP3_RXD_ALTFN,GPIO_IN);
!     //    _PXA_setaltfn(SSP3_SFRM,SSP3_SFRM_ALTFN,GPIOIN);
  
      atomic gbDMAChannelInitDone = 2;
      call RxDMAChannel.requestChannel(DMAID_SSP3_RX,DMA_Priority1, TRUE); 
      call TxDMAChannel.requestChannel(DMAID_SSP3_TX,DMA_Priority1, TRUE); 
      call DMAControl.init();
! 
      call TxDMAChannel.setTargetAddr(0x41900010);
      call TxDMAChannel.enableSourceAddrIncrement(TRUE);
***************
*** 124,127 ****
--- 113,118 ----
      call RxDMAChannel.setTransferWidth(DMA_1ByteWidth);
  
+     call GPIOControl.init();
+     
      return SUCCESS;
    } 
***************
*** 138,143 ****
      SSCR0_3 = (SSCR0_SCR(1) | SSCR0_FRF(0) | SSCR0_DSS(0x7) | SSCR0_SSE);
   
- 
      call DMAControl.start();
      call GPIOControl.start();
      return SUCCESS;
--- 129,134 ----
      SSCR0_3 = (SSCR0_SCR(1) | SSCR0_FRF(0) | SSCR0_DSS(0x7) | SSCR0_SSE);
   
      call DMAControl.start();
+ 
      call GPIOControl.start();
      return SUCCESS;
***************
*** 146,150 ****
    command result_t StdControl.stop() { 
  
!     call DMAControl.start();
      call GPIOControl.stop();
  
--- 137,141 ----
    command result_t StdControl.stop() { 
  
!     call DMAControl.stop();
      call GPIOControl.stop();
  
***************
*** 401,411 ****
      //increment the length to include the length byte itself
      pktlen++;
      if (pktlen > 0  && (OkToUse == 0)) {
-       
        //don't want to overflow memory...
        atomic{
  	rxlen = (pktlen < length) ? pktlen : length;
        }
!       
        call RxDMAChannel.setTargetAddr((uint32_t)(rxbuf));
        call RxDMAChannel.setTransferLength(rxlen);
--- 392,403 ----
      //increment the length to include the length byte itself
      pktlen++;
+ 
      if (pktlen > 0  && (OkToUse == 0)) {
        //don't want to overflow memory...
        atomic{
  	rxlen = (pktlen < length) ? pktlen : length;
        }
! 
! #if USE_DMA      
        call RxDMAChannel.setTargetAddr((uint32_t)(rxbuf));
        call RxDMAChannel.setTransferLength(rxlen);
***************
*** 429,432 ****
--- 421,453 ----
        SSCR1_3 |= SSCR1_TSRE;
        return call TxDMAChannel.run(TRUE);  
+ #else
+       //read it out manually...don't use DMA  we have a 16 entry fifo, so let's take advantage!
+       {
+ 	//introduce a new scope to avoid compiler warnings
+ 	int i;
+ 	length = rxlen; //overload the parameter that was passed to use with the proper value
+ 	while(length >16){
+ 	  //still have more than 16 byte to go, do a "burst"
+ 	  for(i=0; i<16; i++){
+ 	    SSDR_3 = 0;
+ 	  }
+ 	  while(SSSR_3 & SSSR_BSY);
+ 	  for(i=0; i<16; i++){
+ 	    *data++ = SSDR_3; 
+ 	  }
+ 	  length -= 16;
+ 	}
+ 	for(i=0;i<length;i++){
+ 	  SSDR_3 = 0;
+ 	}
+ 	while(SSSR_3 & SSSR_BSY);
+ 	for(i=0; i<length; i++){
+ 	  *data++ = SSDR_3; 
+ 	}
+ 	post signalRXFIFO();
+ 	TOSH_SET_CC_CSN_PIN();
+ 	return SUCCESS;
+       }
+ #endif
      }
      else {
***************
*** 460,463 ****
--- 481,485 ----
        OkToUse = gbDMAChannelInitDone;
      }
+ #if USE_DMA
      if(OkToUse == 0){
        cleanDCache(txbuf, txlen);
***************
*** 479,487 ****
        call TxDMAChannel.run(TRUE);  
        return SUCCESS;
!      }
      else{
        return FAIL;
      }
!   }
  
    async command result_t InterruptFIFOP.startWait(bool low_to_high){
--- 501,541 ----
        call TxDMAChannel.run(TRUE);  
        return SUCCESS;
!     }
      else{
        return FAIL;
      }
! #else
!     {
!       //introduce a new scope to avoid compiler warnings
!       int i;
!       uint8_t tmp;
!        
!       TOSH_CLR_CC_CSN_PIN();
!       SSDR_3 = (CC2420_TXFIFO);
!       while(SSSR_3 & SSSR_BSY);
!       
!       while(length >16){
! 	//still have more than 16 byte to go, do a "burst"
! 	for(i=0; i<16; i++){
! 	  SSDR_3 = *data++;
! 	}
! 	while(SSSR_3 & SSSR_BSY);
! 	length -= 16;
!       }
!       for(i=0;i<length;i++){
! 	SSDR_3 = *data++;
!       }
!       while(SSSR_3 & SSSR_BSY);
!       
!       //now clear out the FIFO
!       for(i=0; i<16; i++){
! 	tmp = SSDR_3; 
!       }
!       post signalTXFIFO();
!       TOSH_SET_CC_CSN_PIN();
!       return SUCCESS;
!     }
! #endif
! }
  
    async command result_t InterruptFIFOP.startWait(bool low_to_high){
***************
*** 656,660 ****
    }
    
-   
    default async event result_t InterruptFIFOP.fired() {
      return FAIL;
--- 710,713 ----



More information about the Tinyos-beta-commits mailing list