⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irda.c

📁 三星s3c2460开发板完整功能测试代码
💻 C
📖 第 1 页 / 共 2 页
字号:
		*IrDA_CKBUFFER++=0;
	IrDA_CKBUFFER=(unsigned char *)MemoryCk;
	// Initialize Check Data -----------------END

	IrDA_RxCount = 0;
	IrDA_RxWrPnt = 0;
	IrDA_RxRdPnt = 0;

	rIrDA_CNT |=(1<<6);
	rIrDA_IER = (1<<7)|(1<<6)|(1<<3)|(1<<0);// LastByteToRx, Err Indication, RxOverRun, Rx Threshold
	rIrDA_CNF = (1); // Enable Interrupt

	printf("IrDA_FCR = %x\n", (char)rIrDA_FCR);

	i = 0;
	printf("\t");
	while(1)
	{
		if (IrDA_RxWrPnt > IrDA_RxRdPnt) {
			printf("[D:%3d] ",*(IrDA_RXBUFFER+IrDA_RxRdPnt));
			IrDA_RxRdPnt++;
			if(!((i+1)%64)) printf("\n");
			if(!((i+1)%8)) printf("\n\t");
			i++;
		}
		if (Uart_GetKey() == '\r') break;
	}
}

//==============================================================================
// IrDA Tx ISR
#if 0
void __irq Irda_Int_Tx()
{
	unsigned char status=0;
	unsigned char LeftOver = 0;
	unsigned char ToBeFilled = 0;
	unsigned int i =0;
	unsigned char size_FIFO = 0;
	
	// Mast interrupt Pending bit of IrDA
	rINTMSK    |= BIT_IrDA;	// Mask IrDA pending bit

	// Clear interrupt pending bit of IrDA
	ClearPending(BIT_IrDA);

	status = (unsigned char)rIrDA_IIR;			// Read IIR(Interrupt Identification Register) of IrDA
//	printf("IrDA IIR:0x%x\n", status);

	if(status & 0x2) // TX Trigger
	{
		//
		// BY DW-K :
		// Check How many bytes were left in the FIFO and determine how many bytes
		// were needed to be put into the FIFO.
		//
		LeftOver = rIrDA_TXNO;
		if(IrDA_FIFOSIZE==1) {	// 64 bytes sized fifo.		
			ToBeFilled = 63 - LeftOver;
			size_FIFO = 63;
		} else {				// 16 bytes sized fifo.
			ToBeFilled = 15 - LeftOver;
			size_FIFO = 15;
		}

//		printf("\tFIR>%d\n", ToBeFilled);

		while ((LeftOver < size_FIFO) && (IrDA_TxCnt < IrDA_TxNum)) { 
//		for (i=0;i<ToBeFilled;i++) {
			rIrDA_RBR = cData;
			*IrDA_CKBUFFER++ = cData++; // for debugging
			*IrDA_CKBUFFER1++ = rIrDA_TXNO; // for debugging
			IrDA_TxCnt++;
			LeftOver = rIrDA_TXNO;
		}

		if (IrDA_TxNum <= IrDA_TxCnt) {
			rIrDA_IER &= ~(1<<1);
			IrDA_TxDone = 0;
		}
	}
	else if(status & 0x20) // TX Trigger
	{
		printf("Tx Underrun error!! \n");
		IrDA_CKBUFFER  = (unsigned char *)MemoryCk; 
		IrDA_CKBUFFER1 = (unsigned char *)MemoryCk1;	
		for(i=0; i<IrDA_TxCnt ; i++)
			printf("[D:%3d, N:%3d] ", *IrDA_CKBUFFER++, *IrDA_CKBUFFER1++);
	}

	// Unmast interrupt Pending bit of IrDA
	rINTMSK    &= ~BIT_IrDA;	// Unmask IrDA pending bit
}

#else

void __irq Irda_Int_Tx()
{
	unsigned char status=0;
	unsigned char i =0;
	
	// Mast interrupt Pending bit of IrDA
	rINTMSK |= BIT_IrDA;	// Mask IrDA pending bit

	// Clear interrupt pending bit of IrDA
	ClearPending(BIT_IrDA);

	status = (unsigned char)rIrDA_IIR;			// Read IIR(Interrupt Identification Register) of IrDA
	//printf("IrDA IIR:0x%x\n", status);

	if(status & 0x2) // TX Trigger
	{
		for (i=0;i<IrDA_TxBUFLEN;i++)
		{
			rIrDA_RBR = cData;
			*IrDA_CKBUFFER++ = cData++;
		}

		IrDA_TxCnt += IrDA_TxBUFLEN;
		//IrDA_TxCnt +=IrDA_TxNum;
		if (IrDA_TxNum <= IrDA_TxCnt) 
		{
			rIrDA_IER &= ~(1<<1);
			IrDA_TxDone = 1;
		}
		
	}
	if(status & 0x20) // TX Trigger
	{
		printf("Tx Underrun error!! \n");
//		IrDA_CKBUFFER  = (unsigned char *)MemoryCk; 
//		IrDA_CKBUFFER1 = (unsigned char *)MemoryCk1;	
//		for(i=0; i<IrDA_TxCnt ; i++)
//			printf("[D:%3d, N:%3d] ", *IrDA_CKBUFFER++, *IrDA_CKBUFFER1++);
	}

	// Unmast interrupt Pending bit of IrDA
	rINTMSK    &= ~BIT_IrDA;	// Unmask IrDA pending bit
}

#endif


void Test_Irda_Fifo_Int_Tx(int MODE,int PREAMBLE,int STARTFLAG,int TXFL,int TXTRIG)
{
	int	i;

	//
	// BY DW-K:
	// Get Bytes count for Tx from USER.
	//

	printf("Data length to transmit (multiple of %d): ",IrDA_TxBUFLEN);
	IrDA_TxCnt = 0;
	IrDA_TxNum = GetIntNum();
	if (IrDA_TxNum == -1) IrDA_TxNum = 16; //data length

	// Initilize IrDA with the FRAME SIZE given by user.
	Init_Irda(MODE, PREAMBLE, STARTFLAG, TXFL, TXTRIG);

	// Register IrDA ISR
	pISR_IrDA = (unsigned)Irda_Int_Tx;

	ClearPending(BIT_IrDA);	// Clear IrDA Int Pending

	rINTMSK &= ~(BIT_IrDA);	// Unmask IrDA pending bit

	// Initialize Check Data ----------------START
	IrDA_CKBUFFER=(unsigned char *)MemoryCk;
	for (i=0; i<IrDA_TxNum; i++) {
		*IrDA_CKBUFFER++ = 0;
	}
	IrDA_CKBUFFER=(unsigned char *)MemoryCk;
	// Initialize Check Data -----------------END

	// Initialize Check Data ----------------START
	IrDA_CKBUFFER1=(unsigned char *)MemoryCk1;
	for (i=0; i<IrDA_TxNum; i++) {
		*IrDA_CKBUFFER1++ = 0;
	}
	IrDA_CKBUFFER1 = (unsigned char *)MemoryCk1;
	// Initialize Check Data -----------------END

	IrDA_TxDone = 0;

	rIrDA_CNT |=(IrDA_TxINTEnb<<7)|(IrDA_RxINTEnb<<6);
	rIrDA_IER  = 0xff;				// Enable all interrpt of IrDA
	rIrDA_CNF  |= (1); // Enable Interrupt 

	while(!IrDA_TxDone);

	printf("Wait until Tx buffer is empty\n");
	while(!(rIrDA_LSR & 0x80));			//Check Tx FIFO empty
	printf("Tx buffer is empty!!, Tx Done!!\n");

	printf("ISR count=%d\n",TxISR_cnt);
	printf("[Tx String :\n");
	IrDA_CKBUFFER  = (unsigned char *)MemoryCk;	
	IrDA_CKBUFFER1 = (unsigned char *)MemoryCk1;	

	printf("\t");
	for(i=0; i<IrDA_TxNum ; i++)
	{
		printf("[D:%3d] ", *IrDA_CKBUFFER++);
		if(!((i+1)%64)) printf("\n");
		if(!((i+1)%8)) printf("\n\t");
	}
	printf("\n");
	rIrDA_IER  = 0x00;				// Disable all interrpt of IrDA
	rIrDA_CNF  &= ~(1);				// Disable Interrupt 
}	
// IrDA Interrupt Test Code end============================================================[END]


// IrDA DMA Test Code Start=============================================================[START]
void __irq Irda_Dma_Done()
{
	int l = IrDA_RxBUFLEN;
	unsigned char *rxData = (unsigned char *)MemoryRx;
	
	rINTSUBMSK|=(BIT_SUB_DMA0|BIT_SUB_DMA1|BIT_SUB_DMA2|BIT_SUB_DMA3);	// Just for the safety	
	
	if(rSUBSRCPND&BIT_SUB_DMA0) // Rx
	{
		rSUBSRCPND = BIT_SUB_DMA0;
		ClearPending(BIT_DMA_SBUS);
		while (l--) *bHead++ = *rxData++;
		IrDA_DONE = 1;
//		printf("IrDA DMA0(Rx) Done.....\n");
		rINTSUBMSK &= ~BIT_SUB_DMA0;
	}

	if(rSUBSRCPND&BIT_SUB_DMA1) // Tx
	{
		rSUBSRCPND = BIT_SUB_DMA1;
		ClearPending(BIT_DMA_SBUS);
		rDMASKTRIG1=0; 	// STOP,DMA3 channel off, no-sw trigger 
		IrDA_DONE=1; // Check Clear the semaphore
		IrDA_TxCnt++;
		rINTSUBMSK &= ~BIT_SUB_DMA1;
//		printf("IrDA DMA1(Tx) Done.....\n");
	}
}

void Init_Irda_Dma_Rx(void)
{
	// DMA3 IrDA Rx init 
	rDISRC0=(unsigned)0x44C00020; //Address of RxBUF Register
	rDISRCC0=(1<<1)|(1); //APB(IrDA), fix
	rDIDST0=(unsigned)MemoryRx; //Address of Memory
	rDIDSTC0=(0<<1)|(0); //AHB(Memory), inc
	rDCON0=(0<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(0<<22)|(0<<20)|(IrDA_RxBUFLEN);
	//demand, sync HCLK, TC int, single transfer, whole service,
	//auto-reload, byte, transfer count = IrDA_RxBUFLEN
	rDMAREQSEL0=(12<<1)|(1<<0);
	// IrDA, H/W request, 
}

void Test_Irda_Fifo_Dma_Rx(int MODE,int PREAMBLE,int STARTFLAG,int RXFL,int RXTRIG)
{
	// Initialize Check Data ----------------START
	IrDA_RXBUFFER=(unsigned char *)MemoryRx;
	bHead=(unsigned char *)MemoryCk;
	bTail=(unsigned char *)MemoryCk;

	// Initialize RX DMA -----------------START
	pISR_DMA_SBUS=(unsigned)Irda_Dma_Done;
	Init_Irda_Dma_Rx();
	ClearPending(BIT_DMA_SBUS);
	rSUBSRCPND=BIT_SUB_DMA0;
	// Initialize RX DMA  -----------------END

	Init_Irda(MODE, PREAMBLE, STARTFLAG, RXFL, RXTRIG); // Initialize IrDA

	rIrDA_CNF=(1<<3)|(1<<2); // Enable Rx DMA
	rIrDA_CNT|=(1<<6); // Enable RX
	//Delay(5000);
	rDMASKTRIG0=(0<<2)|(1<<1)|(0);    // Run, DMA3 channel on, no-sw trigger 
	rINTMSK=~(BIT_DMA_SBUS); // Unmask DMA done INT
	rINTSUBMSK=~(BIT_SUB_DMA0); // Unmask DMA done INT	

	IrDA_DONE = 0;	

	while(1)
	{
		if (IrDA_DONE) 
		{
			printf("[D:0x%x] ", rDCDST0);
			printf("[H:0x%x] ", bHead);
			printf("[T:0x%x]\n", bTail);

			while (bTail != bHead)
				printf("[D:%3d] ",*bTail++);
			IrDA_DONE=0;
			printf(".\n");
		}
		if (Uart_GetKey() == '\r') break;
	}

	rINTMSK |= (BIT_DMA_SBUS); // Unmask DMA done INT
	rINTSUBMSK |= (BIT_SUB_DMA0); // Unmask DMA done INT	
	rDMASKTRIG0 = 0; 	// Run, DMA3 channel on, no-sw trigger 
}

void Init_Irda_Dma_Tx()
{
	// DMA3 IrDA Tx init 
	rDISRC1=(unsigned)IrDA_TXBUFFER;//Address of Memory
	rDISRCC1=(0<<1)|(0);		//AHB(Memory), inc
	rDIDST1=(unsigned)0x44C00020;	//Address of IrDA_RBR Register
	rDIDSTC1=(1<<1)|(1);		//APB(IrDA), fix
	rDCON1=(0<<31)|(1<<30)|(1<<29)|(0<<28)|(1<<27)|(1<<22)|(0<<20)|(IrDA_TxBUFLEN);
	//demand, sync HCLK, TC int, unit transfer, single tx, single service, 
	//off-reload, byte, IrDA_BUFLEN
	rDMAREQSEL1=(12<<1)|(0<<0);
	// IrDA, S/W request, 
}

void Test_Irda_Fifo_Dma_Tx(int MODE,int PREAMBLE,int STARTFLAG,int TXFL,int TXTRIG)
{
	int cnt, precnt, i;
	unsigned char c = 1;
	
	printf("Data length to transmit (multiple of %d): ",IrDA_TxBUFLEN);
	IrDA_TxNum = GetIntNum(); //data length
	if (IrDA_TxNum == -1) IrDA_TxNum = 16; //data length
	IrDA_TxCnt = 0;
	
	// Initialize TX Data ----------------START
	IrDA_TXBUFFER=(unsigned char *)MemoryTx;
	for(i=0;i<IrDA_TxNum;i++)
		*IrDA_TXBUFFER++ = c==0 ? c=1 : c++;
	*IrDA_TXBUFFER=0;
	IrDA_TXBUFFER=(unsigned char *)MemoryTx;
	// Initialize TX Data -----------------END

	// Initialize TX DMA -----------------START
	pISR_DMA_SBUS=(unsigned)Irda_Dma_Done;
	Init_Irda_Dma_Tx();
	rSUBSRCPND=BIT_SUB_DMA1;
	ClearPending(BIT_DMA_SBUS);
	// Initialize TX DMA  -----------------END

	printf("IrDA DMA Tx!!!!\n");

	Init_Irda(MODE, PREAMBLE, STARTFLAG, TXFL, TXTRIG); // Initialize IrDA

	rIrDA_CNF = (1<<3)|(0<<2); // Enable Tx DMA
	rIrDA_CNT |= (1<<7); // Enable TX
	rDMASKTRIG1 = (0<<2)|(1<<1)|(1); 	//run, DMA1 channel on, sw trigger 
	rINTMSK &= ~(BIT_DMA_SBUS); // Unmask DMA done INT	
	rINTSUBMSK &= ~(BIT_SUB_DMA1);

	IrDA_DONE = 0;	
	precnt = 0;
	cnt = 0;
	while(1)
	{
		if(!IrDA_DONE) continue;

		i = IrDA_TxCnt * IrDA_TxBUFLEN;
		if(i < IrDA_TxNum)
		{
			IrDA_DONE = 0;
			rDISRC1=(unsigned)(IrDA_TXBUFFER+i);//Address of Memory
			rDMASKTRIG1 = (0<<2)|(1<<1)|(1); 	//run, DMA1 channel on, sw trigger 
		}
		else break;				

		// debug
/*		cnt = rDSTAT1&0xfffff;
		if (precnt != cnt)
	 	{
			printf("[DMA count:%d, busy:0x%x, src addr:0x%x, dst addr:0x%x]",cnt,rDSTAT1&0x100000,rDCSRC1,rDCDST1);
			precnt = cnt;
		}
*/	
	}

	while(!(rIrDA_LSR & 0x80)); // Wait until TX FIFO is empty
	rIrDA_CNT&= ~((0<<7)|(0<<6)); // Disable RXTX
	printf("TEST_IrDA_FIFO_DMA_TX is done\n");	
	
	printf("Tx String :\n");
	IrDA_TXBUFFER=(unsigned char *)MemoryTx;	
	for(i=0;i<IrDA_TxNum;i++)
		printf("%3d ",*IrDA_TXBUFFER++);
	rINTMSK |= (BIT_DMA_SBUS); // Unmask DMA done INT	
	rINTSUBMSK |= (BIT_SUB_DMA1);
}	
// IrDA DMA Test Code ============================================================== [END]


// added by junon
void Test_IrDA_GPIO(void)
{
	int i;
	
	SetIrdaPort();

	// GPIO port test	
	rGPHCON &= ~(0x3f<<18);	// GP28~31 output
	rGPHCON |= (0x15<<18);	// GP28~31 output
	rGPHPU &= ~(0x7<<9); 	//Uart port pull-up

	printf("Press Any key...GP16~18 will be triggered... if you want to exit, press Enter key");
	while(getchar() != '\r') 
//		rGPDAT &=~(0xf<<28);
	{	
		i++;
		if ( (i%2) == 0 )	
			rGPHDAT |= (0x7<<9);
		else 
			rGPHDAT &=~(0x7<<9);
	}

	ReturnIrdaPort();
}       


void Test_IrDA_Polling(void)
{
	// Initialize RX Buffer---------------START
	unsigned char c;
	IrDA_RXBUFFER=(unsigned char *)MemoryRx;
	for(c=0;c<IrDA_BUFLEN;c++)
		*IrDA_RXBUFFER++=0;
	*IrDA_RXBUFFER=0;
	IrDA_RXBUFFER=(unsigned char *)MemoryRx;	
	printf("IrDA Polling Rx!!!!\n");
	// Initialize RX Buffer-----------------END

	SetIrdaPort();

	Init_Irda(MODE_VALUE, PREAMBLE_VALUE, STARTFLAG_VALUE, RXFL_VALUE, RXTR_VALUE);
	
	ReturnIrdaPort();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -