Esempio n. 1
0
void DAC_DCR(DAC_DRIVER_INFO* drv_info, unsigned int reason, HANDLE hnd)
{
	DAC_DRIVER_DATA *drv_data = drv_info->drv_data;
	DAC_DRIVER_MODE *dac_mode = (DAC_DRIVER_MODE *)(hnd->mode.as_voidptr);

	switch(reason)
	{
		case DCR_RESET:
			RCCPeripheralReset(drv_info->info.peripheral_indx);
			RCCPeripheralDisable(drv_info->info.peripheral_indx); // ??? turn off
#if USE_DAC_DMA_DRIVER
        	drv_data->dac_dma_hnd[0].client.drv_index = drv_info->info.drv_index;
        	drv_data->dac_dma_hnd[1].client.drv_index = drv_info->info.drv_index;
#endif
			break;

		case DCR_OPEN:
		{
			if(dac_mode && dac_mode->dac_ch <2 && drv_data->dac_mode[dac_mode->dac_ch] == NULL)
			{
				if(!drv_data->dac_mode[0] && !drv_data->dac_mode[1])
				{
					if(!ConfigureDac(drv_info))
						break;
				}
				ConfigureDacChannel(drv_info->hw_base, dac_mode);

				drv_data->dac_mode[dac_mode->dac_ch] = dac_mode;
				hnd->res = RES_OK;
			}
			break;
		}

		case DCR_CLOSE:
#if USE_DAC_DMA_DRIVER
			drv_data->dac_dma_hnd[dac_mode->dac_ch].close();
#endif
			drv_data->dac_mode[dac_mode->dac_ch] = NULL;
			if(!drv_data->dac_mode[0] && !drv_data->dac_mode[1])
			{
				//Disable ?
				NVIC_DisableIRQ(drv_info->info.drv_index);
				RCCPeripheralDisable(drv_info->info.peripheral_indx);

				PIO_Free_List(drv_info->dac_pins);
			}
			break;

		case DCR_CANCEL:
			// can only cancel dma transfers
#if USE_DAC_DMA_DRIVER
			if(drv_data->dac_dma_hnd[dac_mode->dac_ch].res & FLG_BUSY)
				drv_data->dac_dma_hnd[dac_mode->dac_ch].hcontrol(DCR_CANCEL);
#endif
			break;


		case DCR_SIGNAL:
#if USE_DAC_DMA_DRIVER
			TRACELN1("DAC sig");
			if(hnd == &drv_data->dac_dma_hnd[0])
			{

				hnd = drv_data->pending[0];
				if(hnd)
				{
					if(hnd->len > drv_data->dac_dma_hnd[0].len)
					{
						hnd->src.as_byteptr += hnd->len - drv_data->dac_dma_hnd[0].len;
						hnd->len = drv_data->dac_dma_hnd[0].len;
					}
					drv_data->pending[0] = NULL;
					if (__get_CONTROL() & 2)
						usr_HND_SET_STATUS(hnd, RES_SIG_OK);
					else
						svc_HND_SET_STATUS(hnd, RES_SIG_OK);
				}
			} else
			{
				if(hnd == &drv_data->dac_dma_hnd[1])
				{

					hnd = drv_data->pending[1];
					if(hnd)
					{
						if(hnd->len > drv_data->dac_dma_hnd[1].len)
						{
							hnd->src.as_byteptr += hnd->len - drv_data->dac_dma_hnd[1].len;
							hnd->len = drv_data->dac_dma_hnd[1].len;
						}
						drv_data->pending[1] = NULL;
						usr_HND_SET_STATUS(hnd, RES_SIG_OK);
					}
				}
			}
#endif
			break;

	}
}
Esempio 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;
	}
}