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

📄 usbacm_adap.c

📁 mtk 6225平台的usb程序! 对想了解mtk平台usb的朋友会有帮助!
💻 C
📖 第 1 页 / 共 3 页
字号:
/*****************************************************************************
*  Copyright Statement:
*  --------------------
*  This software is protected by Copyright and the information contained
*  herein is confidential. The software may not be copied and the information
*  contained herein may not be used or disclosed except with the written
*  permission of MediaTek Inc. (C) 2005
*
*  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
*  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
*  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON
*  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,
*  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF
*  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.
*  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
*  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR
*  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH
*  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO
*  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S
*  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.
*
*  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE
*  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,
*  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,
*  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO
*  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE. 
*
*  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE
*  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF
*  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND
*  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER
*  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).
*
*****************************************************************************/

/*****************************************************************************
 *
 * Filename:
 * ---------
 *    usbacm_adap.c
 *
 * Project:
 * --------
 *   Maui_Software
 *
 * Description:
 * ------------
 *   This file implements usb adaption layer for UART API
 *
 * Author:
 * -------
 * -------
 *
 *============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *------------------------------------------------------------------------------
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 * removed!
 *
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
 *============================================================================
 ****************************************************************************/
#include "intrCtrl.h"
#include "kal_release.h"
#include "stack_common.h"  
#include "stack_msgs.h"
#include "app_ltlcom.h"  
#include "app_buff_alloc.h"
#include "drv_comm.h"
#include "gpt_sw.h"
#include "uart_sw.h"

#include "usb_comm.h"
#include "usb_drv.h"
#include "usb_trc.h"
#include "usb.h"
#include "usbacm_drv.h"
#include "usb_custom.h"

/* Exception flag*/
extern kal_uint8 INT_Exception_Enter; 

/* UART driver structure*/
static const UartDriver_strcut USB2UartDriver;

/* static functions*/
static kal_bool USB2UART_open(UART_PORT port, module_type owner);
static void USB2UART_close(UART_PORT port, module_type owner);
static void USB2UART_ClrRxBuffer(UART_PORT port, module_type owner);
static kal_uint16 USB2UART_GetRxAvail(UART_PORT port);
static kal_uint16 USB2UART_GetBytes(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length, 
					kal_uint8 *status, module_type ownerid);
static void USB2UART_ClrTxBuffer(UART_PORT port, module_type owner);
static kal_uint16 USB2UART_GetTxRoomLeft(UART_PORT port);
static kal_uint16 USB2UART_PutBytes(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length, module_type ownerid);
static kal_uint16 USB2UART_SendData(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length,
					kal_uint8 mode,kal_uint8 escape_char , module_type ownerid);
static kal_uint16 USB2UART_GetTxISRRoomLeft(UART_PORT port);
static kal_uint16 USB2UART_PutISRBytes(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length, module_type ownerid);
static kal_uint16 USB2UART_SendISRData(UART_PORT port, kal_uint8 *Buffaddr, kal_uint16 Length,kal_uint8 mode, 
					kal_uint8 escape_char, module_type ownerid);
static void USB2UART_setowner(UART_PORT port, kal_uint8 owner);
static module_type USB2UART_GetOwnerID(UART_PORT port);
static void USB2UART_ConfigEscape(UART_PORT port, kal_uint8 EscChar, kal_uint16 ESCGuardtime, module_type owner);
static void USB2UART_SetDCBConfig(UART_PORT port, UARTDCBStruct *UART_Config, module_type owner);
static void USB2UART_Purge(UART_PORT port, UART_buffer dir, module_type owner);
static void USB2UART_SetFlowCtrl(UART_PORT port, kal_bool XON, module_type owner);
static void USB2UART_CtrlDCD(UART_PORT port, IO_level SDCD, module_type owner);
static void USB2UART_CtrlBreak(UART_PORT port, IO_level SBREAK, module_type owner);
static void USB2UART_SetBaudRate(UART_PORT port, UART_baudrate baudrate, module_type owner);
static void USB2UART_SetAutoBaud_Div(UART_PORT port, module_type owner);
static void USB2UART_Register_TX_Callback(UART_PORT port, module_type ownerid, UART_TX_FUNC func);
static void USB2UART_Register_RX_Callback(UART_PORT port, module_type ownerid, UART_RX_FUNC func);


/************************************************************
	communication with UART owner and initialize functions
*************************************************************/

/* send ilm to UART owner */
void USB2UART_Sendilm(msg_type msgid)
{
	ilm_struct *USB2UART_ilm;
	void *port_ptr = NULL;      
	
	if (USB2UARTPort.ownerid == MOD_DRV_HISR)
		return;
			
	switch(msgid)
	{
	case MSG_ID_UART_READY_TO_READ_IND:	   		 	
		{
			uart_ready_to_read_ind_struct *tmp;      
   			tmp = (uart_ready_to_read_ind_struct *) 
   					construct_local_para(sizeof(uart_ready_to_read_ind_struct),TD_UL);
   			tmp->port = USB2UARTPort.port_no;   		
   			port_ptr = tmp;   		
   		}
   		break;	
   		
   	case MSG_ID_UART_READY_TO_WRITE_IND:     
   		{ 		
   			uart_ready_to_write_ind_struct *tmp;      
   			tmp = (uart_ready_to_write_ind_struct *) 
   					construct_local_para(sizeof(uart_ready_to_write_ind_struct),TD_UL);
   			tmp->port = USB2UARTPort.port_no;   		
   			port_ptr = tmp;
   		}
   		break;
   		
   	case MSG_ID_UART_ESCAPE_DETECTED_IND:   	
   		{
   			uart_escape_detected_ind_struct *tmp;      
   			tmp = (uart_escape_detected_ind_struct *) 
   					construct_local_para(sizeof(uart_escape_detected_ind_struct),TD_UL);
   			tmp->port = USB2UARTPort.port_no;   		
   			port_ptr = tmp;   		
   		}
   		break;
   		
   	default:
   		EXT_ASSERT(0, msgid, 0, 0);
   		break;   	
   	}   

	if (USB2UARTPort.ownerid == MOD_DRV_HISR)
		EXT_ASSERT(0, USB2UARTPort.ownerid, 0, 0);
	
	DRV_BuildPrimitive(USB2UART_ilm, MOD_DRV_HISR,
					USB2UARTPort.ownerid, msgid, port_ptr);
	msg_send_ext_queue(USB2UART_ilm);
}

/* initialize USB2UART setting, called when driver initialize, no matter user select as UART or not */
void USB2UART_init(void)
{
#ifndef __USB_ENABLE__
	EXT_ASSERT(0, 0, 0, 0);
#endif
	
	/* Setup N81,(UART_WLS_8 | UART_NONE_PARITY | UART_1_STOP) = 0x03 */
	/* BaudRate and autoflowcontrol */
	UARTDCBStruct  UART_DefaultConfig =
	{
		UART_BAUD_115200,    /* baud; */
		len_8,               /* dataBits; */
		sb_1,                /*stopBits; */
		pa_none,             /* parity; */
		fc_none,             /*no flow control*/
		0x11,                /* xonChar; */
		0x13,                /* xoffChar; */
		KAL_FALSE
	};

	g_UsbACM.acm_param = USB_GetCustomFunc()->get_acm_param_func();
	
	/* get memory for ring buffer and initialize it */
	if (USB2UARTPort.RingBuffers.rx_buffer == NULL)
		USB2UARTPort.RingBuffers.rx_buffer = (kal_uint8 *)g_UsbACM.acm_param->rx_ringbuff;

	if (USB2UARTPort.RingBuffers.tx_buffer == NULL)
		USB2UARTPort.RingBuffers.tx_buffer = (kal_uint8 *)g_UsbACM.acm_param->tx_ringbuff;

	if (USB2UARTPort.RingBuffers.txISR_buffer == NULL)
		USB2UARTPort.RingBuffers.txISR_buffer = (kal_uint8 *)g_UsbACM.acm_param->txisr_ringbuff;

	Buf_init(&(USB2UARTPort.Rx_Buffer),(kal_uint8 *)(USB2UARTPort.RingBuffers.rx_buffer), 
			g_UsbACM.acm_param->rx_ringbuff_size);
   	Buf_init(&(USB2UARTPort.Tx_Buffer),(kal_uint8 *)(USB2UARTPort.RingBuffers.tx_buffer), 
   			g_UsbACM.acm_param->tx_ringbuff_size);
   	Buf_init(&(USB2UARTPort.Tx_Buffer_ISR),(kal_uint8 *)(USB2UARTPort.RingBuffers.txISR_buffer), 
   			g_UsbACM.acm_param->txisr_ringbuff_size);
   	
	/* set UART setting to USB2UARTPort.DCB and g_UsbACM.line_coding */
	USB2UARTPort.UART_id = MOD_DRV_HISR;
	kal_mem_cpy(&USB2UARTPort.DCB, &UART_DefaultConfig, sizeof(UARTDCBStruct));
	if (USB2UARTPort.ownerid == 0)
	{
		USB2UARTPort.ownerid = MOD_DRV_HISR;
		UART2USB_DCB2LineCoding(&USB2UARTPort.DCB, &g_UsbACM.line_coding);
	}

	/* register UART and get GPT handler */
	if (USB2UARTPort.handle == 0)
		GPTI_GetHandle(&USB2UARTPort.handle);
	
	UART_Register(uart_port_usb, USB_TYPE, (UartDriver_strcut*)&USB2UartDriver);

   	g_UsbACM.send_Txilm = KAL_FALSE;
   	g_UsbACM.send_Rxilm = KAL_TRUE;
 	g_UsbACM.config_send_Txilm = KAL_FALSE;
   	
   	USB2UARTPort.tx_cb = USB2UART_Dafault_Tx_Callback;
   	USB2UARTPort.rx_cb = USB2UART_Dafault_Rx_Callback;

   	USB2UARTPort.port_no = uart_port_usb;
}


/* clear tx buffer */
void USB2UART_Clear_Tx_Buffer(void)
{
#ifdef __DSPIRDBG__	
	if(g_UsbACM.acm_owner!=USB_ACM_OWNER_UART)
		return;
#endif
	USB2UART_ClrTxBuffer(uart_port_usb, USB2UARTPort.ownerid);
}

/* clear tx isr buffer */
void USB2UART_Clear_Tx_ISR_Buffer(void)
{
	kal_uint32 savedMask;
#ifdef __DSPIRDBG__	
	if(g_UsbACM.acm_owner!=USB_ACM_OWNER_UART)
		return;
#endif	

#ifndef  __PRODUCTION_RELEASE__	
	kal_prompt_trace(MOD_USB, "clrTxISR");
#endif /* __PRODUCTION_RELEASE__ */

	savedMask = SaveAndSetIRQMask();
	USB2UARTPort.Tx_Buffer_ISR.Write = 0;
	USB2UARTPort.Tx_Buffer_ISR.Read = 0;
	USB_Stop_DMA_Channel(g_UsbACM.txpipe->byEP);	
	RestoreIRQMask(savedMask);
}

/* clear rx buffer */
void USB2UART_Clear_Rx_Buffer(void)
{
#ifdef __DSPIRDBG__	
	if(g_UsbACM.acm_owner!=USB_ACM_OWNER_UART)
		return;
#endif	
	USB2UART_ClrRxBuffer(uart_port_usb, USB2UARTPort.ownerid);
}



/************************************************************
	UART driver  functions
*************************************************************/

/* open USB2UART port , actually port is no use because only support one USB port */
static kal_bool USB2UART_open(UART_PORT port, module_type owner)
{
#ifndef __USB_ENABLE__
	ASSERT(0);
#endif
#ifdef __DSPIRDBG__	
	if(g_UsbACM.acm_owner != USB_ACM_OWNER_UART)
	{
		EXT_ASSERT(0, g_UsbACM.acm_owner, owner, 0);	
	}
#endif
		

⌨️ 快捷键说明

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