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

📄 serial_open.c

📁 zilog z80f91串口通用函数
💻 C
字号:
 /*
 * Copyright 2001, Metro Link, Inc.
 * All Rights Reserved
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Metro Link, Inc. and may
 * contain proprietary, confidential and trade secret information of
 * Metro Link, Inc. and/or its partners.
 *  
 * The contents of this file may not be disclosed to third parties, copied or
 * duplicated in any form, in whole or in part, without the prior written
 * permission of Metro Link, Inc.
 *
 */
/*
 * File			:	serial_open.c
 *
 * Description	:	Contains implementation of serial open function.
 *					
 * Copyright 2003, ZiLOG Inc.
 * All Rights Reserved
 *
 * This is UNPUBLISHED PROPRIETARY SOURCE CODE of ZiLOG Inc., and might
 * contain proprietary, confidential and trade secret information of
 * ZiLOG, our partners and parties from which this code has been licensed.
 * 
 * The contents of this file may not be disclosed to third parties, copied or
 * duplicated in any form, in whole or in part, without the prior written
 * permission of ZiLOG Inc.
 */

#ifdef _IAR_CODE

#ifdef _EZ80F91
#include <ioez80f91.h>
#endif

#ifdef _EZ80F92
#include <ioez80f92.h>
#endif

#ifdef _EZ80F93
#include <ioez80f92.h>
#endif

#ifdef _EZ80L92
#include <ioez80l92.h>
#endif

#ifdef _EZ80190
#include <ioez80190.h>
#endif

#endif

#include <stdio.h>
#include "serial.h"
#include "_ez80.h"
#include "ZTypes.h"
#include "ZSysgen.h"
#include "ZDevice.h"
#include "ZThread.h"
#include "ZSemaphore.h"
#include "ZInterrupt.h"

extern UINT8 UART0_TASK_PRIO ;
extern UINT8 UART0_Task_Stack[] ;
extern UINT8 UART1_TASK_PRIO ;
extern UINT8 UART1_Task_Stack[] ;
extern UINT	UART0_TASK_STACK_SIZE ;
extern UINT	UART1_TASK_STACK_SIZE ;
extern UINT32 SYSTEM_CLOCK ;
extern void Uart_IntTask( UART_DVIOBLK * pDevBlk );

RZK_THREADHANDLE_t SerIntTasks[2];

void
UART_setparams
( 
	UART_DVIOBLK *					pDevBlk
)
{
	UINT16			 					bgen; /* baud rate generator valu */
	UINT8			 					tmp=LCTL_5DATABITS;


	/* Set the baud rate */
	UART_LCTL(pDevBlk->UARTbase)|=LCTL_DLAB; /* DLAB */
	bgen=SYSTEM_CLOCK/((UINT32)pDevBlk->serparam->baud<<4);
	BRG_DLRL(pDevBlk->UARTbase)=(bgen&0x00ff);
	BRG_DLRH(pDevBlk->UARTbase)=(bgen&0xff00)>>8;
	UART_LCTL(pDevBlk->UARTbase)&=~LCTL_DLAB; /* DLAB */

	switch( pDevBlk->serparam->databits ) 
	{
		case 6:
			tmp|=LCTL_6DATABITS;
			break;
		case 7:
			tmp|=LCTL_7DATABITS;
			break;
		case 8:
			tmp|=LCTL_8DATABITS;		break;
		default:
			printf("Unsupported value for databits %d\n",
			pDevBlk->serparam->databits);
	}

	switch( pDevBlk->serparam->stopbits ) 
	{
		case 1:
			break;
		case 2:
			tmp|=LCTL_2STOPBITS;
			break;
		default:
			printf("Unsupported value for stopbits %d\n",
			pDevBlk->serparam->stopbits);
	}

	switch( pDevBlk->serparam->parity ) 
	{
		case PAREVEN:
			tmp|=(LCTL_PEN|LCTL_EPS);
			break;
		case PARODD:
			tmp|=(LCTL_PEN);
			break;
		case PARNONE:
			break;
		default:
			printf("Unsupported value for parity %d\n",
			pDevBlk->serparam->parity);
	}

	/* Set the port attributes */
	UART_LCTL(pDevBlk->UARTbase)=tmp;
}








DDF_STATUS_t
UARTOpen
(
	RZK_DEVICE_CB_t *				pDev,
	RZK_DEV_NAME_t *				pName,
	RZK_DEV_MODE_t *							pMode
)
{
	UART_DVIOBLK *					pDevBlk = (UART_DVIOBLK *) pDev->dvinputoutput;
	UINT8								CritFlag;


	if( pDevBlk->State == SERIAL_STATE_OPENED )
	{
		return UARTDEV_ERR_SUCCESS ;
	}

	CritFlag = RZKDisablePreemption();
	if( pDevBlk->State == SERIAL_STATE_CLOSED )
	{
		//printf( "SerOpen on device %s\n", pDev->dvname );
		pDevBlk->TxSem    = RZKCreateSemaphore((RZK_NAME_t*)"SERTX", 1, RECV_ORDER_PRIORITY) ;//KE_SemCreate( 1 );
		if(pDevBlk->TxSem == NULL)
			printf("\nUART Tx Semaphore creation error");
		pDevBlk->RxSem    = RZKCreateSemaphore((RZK_NAME_t*)"SERRX", 1, RECV_ORDER_PRIORITY) ;
		if(pDevBlk->RxSem == NULL)
			printf("\nUART Rx Semaphore creation error");
		pDevBlk->RxAvail   = 0;
		pDevBlk->RxBufSize = UART_RX_BUF_SIZE;// To be made a configurable parameter-- Sridhar
		pDevBlk->pReadBuf  = pDevBlk->pRxBuf;
		pDevBlk->pWriteBuf = pDevBlk->pRxBuf;
		pDevBlk->TxCount   = UART_FIFODEPTH;

		/*
		 * Disable Uart interrupts, while HW is configured.
		 */
   	UART_IER(pDevBlk->UARTbase)  = 0;
	UART_LCTL(pDevBlk->UARTbase) = 0;
	UART_MCTL(pDevBlk->UARTbase) = 0;
	UART_setparams(pDevBlk);

	/* Set up and flush the FIFOs */
	UART_FCTL(pDevBlk->UARTbase)=FCTL_TRIG_8|FCTL_FIFOEN;

	 /* Flow control: tell sender we're ready for data */
   	if(serparams[pDev->dvminor].settings & SERSET_RTSCTS)
	{
		UART_MCTL(pDevBlk->UARTbase) |= MCTL_RTS;
	}

	if(serparams[pDev->dvminor].settings & SERSET_DTR_ON)
	{
		UART_MCTL(pDevBlk->UARTbase) |= MCTL_DTR;
	}

	/*
	 * Install the interrupt vector and create the interrupt task.
	 */

	if(pDev->dvminor == 0)
	{

		SerIntTasks[pDev->dvminor] = RZKCreateThreadEnhanced((RZK_NAME_t *)"SER0IT", (RZK_PTR_t)Uart_IntTask,
										NULL, UART0_TASK_STACK_SIZE,
										UART0_TASK_PRIO, 2,
										RZK_THREAD_INTERRUPT|RZK_THREAD_PREEMPTION,
										1, pDevBlk );
		if(SerIntTasks[pDev->dvminor] == NULL)
		{
			RZKRestorePreemption(CritFlag);
			return UARTDEV_ERR_KERNEL_ERROR ;
		}
	}
	else
	{

		SerIntTasks[pDev->dvminor] = RZKCreateThreadEnhanced((RZK_NAME_t *)"SER1IT", (RZK_PTR_t)Uart_IntTask,
										NULL, UART1_TASK_STACK_SIZE,
										UART1_TASK_PRIO, 2,
										RZK_THREAD_INTERRUPT|RZK_THREAD_PREEMPTION,
										1, pDevBlk );
		if(SerIntTasks[pDev->dvminor] == NULL)
		{
			RZKRestorePreemption(CritFlag);
			return UARTDEV_ERR_KERNEL_ERROR ;
		}
	}
									
	RZKInstallInterruptHandler((RZK_FNP_ISR) pDev->dvintvector, pDev->dvivec) ;

	UART_IER(pDevBlk->UARTbase) = IER_MIIE | IER_RIE;

	pDevBlk->State = SERIAL_STATE_OPENED;
	}
	else
	{
		RZKRestorePreemption(CritFlag);
		return UARTDEV_ERR_INVALID_OPERATION ;
	}
	RZKRestorePreemption(CritFlag);

	return UARTDEV_ERR_SUCCESS ;
}



⌨️ 快捷键说明

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