📄 usbacm_adap.c
字号:
/*****************************************************************************
* 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 + -