wanpipe-kernel-sources/kdrivers/include/sdla_gsm.h

193 lines
6.8 KiB
C

/******************************************************************************
* sdla_gsm.h
*
* Author: Moises Silva <moy@sangoma.com>
*
* Copyright: (c) 2011 Sangoma Technologies Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version
* 2 of the License, or (at your option) any later version.
* ============================================================================
* Oct 06, 2011 Moises Silva Initial Version
******************************************************************************
*/
#ifndef __SDLA_GSM_H
#define __SDLA_GSM_H
#if (defined __WINDOWS__)
# define inline __inline
#endif
/* W400 has 4 GSM modules. Each module has one voice channel and one fake D-channel */
#define MAX_GSM_MODULES 4
/* All modules masked (4 modules, 1111) */
#define AFT_GSM_ALL_MODULES_MASK 0x000F
/* Assumed the last channel is the HDLC channel */
#define MAX_GSM_CHANNELS 2
#define MAX_GSM_TIMESLOTS 32
/* where in the span channel array indexes we have voice and data */
#define GSM_VOICE_CHANNEL 0
#define GSM_UART_CHANNEL 1
/* 31th chan (zero-based) will have the dchan */
#define GSM_DCHAN_LOGIC_CHAN 31
#define IS_GSM_CARD(card) IS_GSM_FEMEDIA(&(card)->fe)
/* Global register */
#define AFT_GSM_GLOBAL_REG 0x1400
/* Starting configuration register (incremented by AFT_GSM_REG_OFFSET for each module) */
#define AFT_GSM_CONFIG_REG 0x1200
/* UART tx/rx data and status registers (incremented by AFT_GSM_REG_OFFSET for each module) */
#define AFT_GSM_UART_TX_REG 0x1300
#define AFT_GSM_UART_RX_REG 0x1310
#define AFT_GSM_UART_STAT_REG 0x1320
/* Per module register offset */
#define AFT_GSM_REG_OFFSET 0x0004
/* Our FIFO size for the UART */
#define AFT_GSM_UART_TX_FIFO_SIZE 15
#define AFT_GSM_UART_RX_FIFO_SIZE 66
/* UART status */
#define AFT_GSM_UART_TX_FIFO_DATA_COUNT_MASK 0x0F
#define AFT_GSM_UART_RX_FIFO_DATA_COUNT_MASK 0x7F
#define AFT_GSM_UART_RX_FIFO_DATA_COUNT_OFFSET 8
#define AFT_GSM_UART_TX_FIFO_OVERFLOW_BIT 16
#define AFT_GSM_UART_RX_FIFO_OVERFLOW_BIT 17
/* PLL status bits in the global register */
#define AFT_GSM_PLL_RESET_BIT 0
#define AFT_GSM_PLL_PHASE_SHIFT_OVERFLOW_BIT 1
#define AFT_GSM_PLL_INPUT_CLOCK_LOST_BIT 2
#define AFT_GSM_PLL_OUTPUT_CLOCK_STOPPED_BIT 3
#define AFT_GSM_PLL_LOCKED_BIT 4
/* SIM muxing error in the global register */
#define AFT_GSM_SIM_MUXING_ERROR_BIT 5
/* PCM audio loop, all audio going towards the Digital Voiceband Interface (DVI) will be looped back,
* this is only useful for debugging purposes */
#define AFT_GSM_GLOBAL_PCM_LOOPBACK_BIT 30
/* Shutdown 3.8v for all modules (active 0) in the global register */
#define AFT_GSM_GLOBAL_SHUTDOWN_BIT 31
/*!< Retrieve the register address for a module */
#define AFT_GSM_MOD_REG(mod_no, reg) (reg + ((mod_no-1) * AFT_GSM_REG_OFFSET))
/*!< GSM module configuration (bit numbers are zero-based) */
#define AFT_GSM_MOD_POWER_BIT 0x0
#define AFT_GSM_MOD_RESET_BIT 0x1
#define AFT_GSM_MOD_POWER_MONITOR_BIT 0x2
#define AFT_GSM_MOD_TX_MONITOR_BIT 0x3
#define AFT_GSM_MOD_SIM_INSERTED_BIT 0x4
/*!< The high order last 3 bits of first byte of the module configuration register select the SIM */
#define AFT_GSM_MOD_SIM_BIT_OFFSET 5
#define AFT_GSM_MOD_SIM_MASK (0x7 << AFT_GSM_MOD_SIM_BIT_OFFSET)
/*!< The first 3 bits of the second byte select the UART baud rate */
#define AFT_GSM_MOD_UART_BAUD_RATE_BIT_OFFSET 0x8
#define AFT_GSM_MOD_UART_BAUD_RATE_MASK (0x7 << AFT_GSM_MOD_UART_BAUD_RATE_BIT_OFFSET)
/*!< The fourth bit of the second byte report if there is service or not */
#define AFT_GSM_MOD_SERVICE_BIT 0xB
/*!< The fifth bit of the second byte report if there is a module (cell phone) present or not */
#define AFT_GSM_MOD_PRESENT_BIT 0xC
/*! Absolute timeout to power on/off a module
* Telit data sheet suggests 2 seconds, in real life for W400
* I've seen power off take more than that, 3-4 seconds, so
* I decided to boost this to 10 seconds to be ultra-safe
* The only down-side of this will be if we ever need to
* use the "slow hwprobe" mechanism that attempts to power on/off
* the modules the first time hwprobe is run, because a timeout
* of 10 seconds will slow down a lot the first hwprobe in cases where
* the module is not present (see sdladrv.c slow hw probe define)
* since currently we do not use the "slow hwprobe" mode and rely
* instead on the GSM hw FPGA register to tell us if the module
* is present or not, we should be fine ...
* */
#define AFT_GSM_MODULE_POWER_TOGGLE_TIMEOUT_MS 10000
/*!< How often to check if the module is already on/off during startup/shutdown */
#define AFT_GSM_MODULE_POWER_TOGGLE_CHECK_INTERVAL_MS 10
/*! Absolute timeout to enable PLL */
#define AFT_GSM_PLL_ENABLE_TIMEOUT_MS 2000
/*!< How often to check if the PLL is already enabled on startup */
#define AFT_GSM_PLL_ENABLE_CHECK_INTERVAL_MS 10
/*! How much to wait between power registry writes
* Telit data sheet says input command for switch off/on must be equal or bigger to 1 second,
* we give it 100ms more in case the host scheduling is somewhat faster */
#define AFT_GSM_MODULE_POWER_TOGGLE_DELAY_MS 1100
/* Transform from module index to bit index in bit map */
#define AFT_GSM_MOD_BIT(mod_no) (mod_no - 1)
static inline int aft_gsm_get_sim_no(int reg)
{
reg &= AFT_GSM_MOD_SIM_MASK;
return (reg >> AFT_GSM_MOD_SIM_BIT_OFFSET);
}
static inline void aft_gsm_set_sim_no(int *reg, int sim_no)
{
sim_no <<= AFT_GSM_MOD_SIM_BIT_OFFSET;
*reg |= (sim_no & AFT_GSM_MOD_SIM_MASK);
}
static inline int aft_gsm_get_uart_baud_rate(int reg)
{
reg &= AFT_GSM_MOD_UART_BAUD_RATE_MASK;
return (reg >> AFT_GSM_MOD_UART_BAUD_RATE_BIT_OFFSET);
}
int wp_gsm_iface_init(void*, void*);
int wp_gsm_uart_rx_fifo(void *card, unsigned char *rx_buff, int reqlen);
int wp_gsm_uart_check_tx_fifo(void *card);
int wp_gsm_uart_tx_fifo(void *card, unsigned char *tx_buff, int len);
int wp_gsm_pll_reset(void *card);
int wp_gsm_update_sim_status(void *card);
typedef struct wan_gsm_udp {
union {
char uart_debug;
} u;
} wan_gsm_udp_t;
/* used by gsm front end code to store GSM-specific data */
#define GSM_MAX_UART_FRAME_LEN 300
typedef struct sdla_gsm_param {
unsigned char uart_txbuf[GSM_MAX_UART_FRAME_LEN];
int uart_txbuf_len;
int uart_tx_cnt;
} sdla_gsm_param_t;
/* Front-End UDP command */
#define WAN_GSM_REGDUMP (WAN_FE_UDP_CMD_START + 0)
#define WAN_GSM_UART_DEBUG (WAN_FE_UDP_CMD_START + 1)
#define WAN_GSM_AUDIO_DEBUG (WAN_FE_UDP_CMD_START + 2)
#define WAN_GSM_PLL_RESET (WAN_FE_UDP_CMD_START + 3)
#define WAN_GSM_POWER_TOGGLE (WAN_FE_UDP_CMD_START + 4)
#define WAN_GSM_UPDATE_SIM_STATUS (WAN_FE_UDP_CMD_START + 5)
#define WAN_GSM_PCM_LOOPBACK (WAN_FE_UDP_CMD_START + 6)
#define AFT_GSM_UART_DEBUG_ENABLED_BIT 1
#define AFT_GSM_AUDIO_DEBUG_TOGGLE_BIT 2
#endif /* __SDLA_GSM_H */