Ejemplo n.º 1
0
/*----------------------------------------------------------------------------
  Serial Device "LPC17xx"
  initialize
 *----------------------------------------------------------------------------*/
static int UartDev_Init (void) {
  int i;

  if (UARTInfo.State != _STATE_UNKNOWN_) {
    return (-1);                                      /* Device initialized */
  }

  ConfigureUart (&UART_DEV.Cfg);

  ConfigurePins ();                                   /* Re-configure the UART pins */

  __BUF_RESET(BufTx);                                 /* reset transmit buffer */
  __BUF_RESET(BufRx);                                 /* reset receive buffer */
  TxRestart = 1;

  UARTInfo.State = _STATE_INITIALIZED_;

  UART_TxCmd (UARTInfo.pUart, ENABLE); 					/* TX, RX enable */

  for (i = 0; i < 800; i++);                            /* eleminate schmierzeichen */

  /* Setting up callback function for UART driver */
	// Receive callback
	UART_SetupCbs(UARTInfo.pUart, 0, (void *)UartRxCallBack);
	// Transmit callback
	UART_SetupCbs(UARTInfo.pUart, 1, (void *)UartTxCallBack);

  /* Enable Rx Interrrupt in UART peripheral */
  UART_IntConfig(UARTInfo.pUart, UART_INTCFG_RBR, ENABLE);

  /* preemption = 1, sub-priority = 1 */
  NVIC_SetPriority(UARTInfo.UARTIRQn, ((0x01<<3)|0x01));

  NVIC_EnableIRQ(UARTInfo.UARTIRQn);               /* enable Interrupt */

  return(0);                                       /* success */
}
Ejemplo n.º 2
0
void dcr_SerialDriver(UART_DRIVER_INFO* drv_info, unsigned int reason, HANDLE hnd)
{
	UART_Type * Uart = drv_info->hw_base;
	UART_DRIVER_DATA *drv_data = drv_info->drv_data;
	switch(reason)
	{
		case DCR_ISR:
			TX_CTS(drv_data, Uart, (unsigned int)hnd);
			return;
		case DCR_RESET:
			SysCtlPeripheralReset(drv_info->info.peripheral_indx);
			SysCtlPeripheralDisable(drv_info->info.peripheral_indx); // ??? turn off
			return;

		case DCR_OPEN:
		{
			UART_DRIVER_MODE *uart_mode = (UART_DRIVER_MODE *)(hnd->mode.as_voidptr);
			if(uart_mode)
			{
				//unsigned long mode, baudrate;
				if(drv_data->cnt)
				{
					if( uart_mode->mode != drv_data->mode.mode ||
					    uart_mode->baudrate != drv_data->mode.baudrate ||
					    uart_mode->hw_flow != drv_data->mode.hw_flow )
					{
						return;
					}
				}
				else
				{
					// Enable AND Reset the UART peripheral
					SysCtlPeripheralReset(drv_info->info.peripheral_indx);
					if(drv_data->mode.hw_flow)
					{
						PIO_Cfg_List((PIN_DESC *)&drv_info->uart_pins[UART_LIST_ALL_PINS]);
						ConfigureUart(drv_info, drv_data, uart_mode);
#ifdef HW_VER_10
						if(drv_info->info.drv_index != UART1_IRQn)
							TX_CTS(drv_data, Uart, PIO_Read(drv_info->uart_pins[CTS_PIN]));
#endif
					}
					else
					{
						PIO_Cfg_List((PIN_DESC *)&drv_info->uart_pins[UART_LIST_RX_TX_PINS]);
						ConfigureUart(drv_info, drv_data, uart_mode);
					}
					START_RX_BUF(Uart, drv_info, drv_data);
				}
				drv_data->cnt++;
				hnd->res = RES_OK;
			}
			return;
		}

		case DCR_CLOSE:
			if(drv_data->cnt)
				drv_data->cnt--;

		case DCR_CANCEL:
    	{
    		if( !(hnd->res & FLG_BUSY))
    			return;

    		if (hnd->cmd & FLAG_READ)
    	    {
    			if(hnd == drv_data->hnd_rcv)
    			{
    				STOP_RX(Uart);
    	      		if(hnd->len > drv_data->rx_remaining || hnd->mode0 )
    	      		{
    	      			hnd->len = drv_data->rx_remaining;
    	      			hnd->res = RES_SIG_OK;
    	      		}
    	      		else
    	      			hnd->res = RES_SIG_IDLE;

    	      		drv_data->hnd_rcv = hnd->next;
    	      		svc_HND_SET_STATUS(hnd, hnd->res);

    		      	if( (hnd=drv_data->hnd_rcv) )
    		          	START_RX_HND(Uart, drv_info, hnd);
    		      	else
    					START_RX_BUF(Uart, drv_info, drv_data);
    			}
    			else
    			{
    				// try cnacel
    				hnd->svc_list_cancel(drv_data->hnd_rcv);
    			}
    		}
    		else
    		{
    			if(hnd == drv_data->hnd_snd)
    			{
    				STOP_TX(Uart);
    				drv_data->hnd_snd = hnd->next;
    	      		svc_HND_SET_STATUS(hnd, RES_SIG_IDLE);
					if( (hnd=drv_data->hnd_snd) )
						START_TX_HND(Uart, hnd);
    			}
    			else
    			{
    				hnd->svc_list_cancel(drv_data->hnd_snd);
    			}

    		}
        	if(!drv_data->cnt)
			{
					NVIC->NVIC_DisableIRQ(drv_info->info.drv_index);
					Uart->UARTDisable();
					STOP_RX(Uart);
					STOP_TX(Uart);
					SysCtlPeripheralDisable(drv_info->info.peripheral_indx);
					SYSCTL->SysCtlPeripheralDeepSleepDisable(drv_info->info.peripheral_indx);
				    SYSCTL->SysCtlPeripheralSleepDisable(drv_info->info.peripheral_indx);

					if(drv_data->mode.hw_flow)
						PIO_Free_List((PIN_DESC *)&drv_info->uart_pins[UART_LIST_ALL_PINS]);
					else
						PIO_Free_List((PIN_DESC *)&drv_info->uart_pins[UART_LIST_RX_TX_PINS]);
			}
        	return;
    	}
        case DCR_CLOCK:
        	return;
	}
}